2011-11-03 80 views
1

我的工作很简单的事情了一下午,但似乎无法得到它的权利出于某些原因:如何把一个列表转换成一定宽度的矩阵。打开列表到矩阵

实施例: 我有一个列表,诸如

[1, 3, 5, 7, 6, 8, 9, 0] 

,并希望通过谓词

list2matrix/3 : list2matrix(List, Size_of_Rows, Matrix). 

在本实施例中使用象创建矩阵如

[[1, 3], 
[5, 7], 
[6, 8], 
[9, 0]] 

如果列表的长度不是行的大小的倍数
list2matrix([1, 3, 5, 7, 6, 8, 9, 0], 2, Matrix). 

谓语应该失败。通过提前(

感谢,如果你能提出关于如何处理任何线索;

我决定不发表我的工作,因为我觉得我得到它错了,它不会帮助我得到它修正这意味着对数字这样的问题。

+2

您的问题声明是不完整的。 'list2matrix([1,3,5],2,Matrix)'成功还是失败?如果成功,应放弃或延伸到[5,_]或任何其他价值。 – false

+0

让我们说它会失败,谢谢指出。因为我打算在方形列表上使用它,所以我没有精确;( – m09

回答

2

可以分为两个部分划分的问题。 第一个构建块将构建一排N个元素。那就是将输入列表分成两个列表,其中一个将具有N个元素(行),另一个是输入列表的剩余部分。

第二积木将建立,其由行的矩阵。

list_to_matrix([], _, []). 
list_to_matrix(List, Size, [Row|Matrix]):- 
    list_to_matrix_row(List, Size, Row, Tail), 
    list_to_matrix(Tail, Size, Matrix). 

list_to_matrix_row(Tail, 0, [], Tail). 
list_to_matrix_row([Item|List], Size, [Item|Row], Tail):- 
    NSize is Size-1, 
    list_to_matrix_row(List, NSize, Row, Tail). 
+0

非常感谢您的回答,我正在努力了解它,并且很快就会对其进行测试,之后我会对其进行评论:) – m09

+0

好的,我阅读并且很容易理解,尽管我仍然认为我会我很难找到自己的解决方案:( 我只是补充说: - !。在每次第一次选择后削减回溯,以确定性,现在我有我想要的东西,非常感谢你:) – m09

+3

你的'list_to_matrix_row'可以简化为'list_to_matrix_row(L,RowLen,Row,Rest): - 长度(Row,RowLen),追加(Row,Rest,L)。“ –

1

查找在期望的结果的图形。 将被分配为在每对的和非对将在第一地点每次所述第二数量。 创建双维阵列和分配的非对位置索引子“一”和 成对“b”。

正如你所看到的“我”是一个数组的索引,一个多维数组。 I [A] [B]

用户需要通过两个阵列中为了做到这一点进行迭代。

希望它有帮助。

+0

这样做时遇到的问题是对于矩阵的宽度为2,但对于任何数字而不是2都是正确的。在我的我特别感兴趣的是将列表长度为81的列表转换为9 * 9矩阵。我希望得到的谓词是大小硬编码免费的,但如果9必须硬编码,那么它是可以的! – m09

2

顺便说一句,我想我会提到我终于写的代码:

length_(Length, List) :- length(List, Length). 

list2matrix(List, RowSize, Matrix) :- 
    length(List, L), 
    HowManyRows is L div RowSize, 
    length(Matrix, HowManyRows), 
    maplist(length_(RowSize), Matrix), 
    append(Matrix, List). 

它更高阶导向,有趣阅读我猜:)

+1

有趣!使用['library(lambda)'](http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/lambda.pl),您可以编写'maplist({RowSize} + \ Xs^length(Xs ,RowSize),Matrix)'而不是使用辅助定义。见[本简介](http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/ISO-Hord)。 – false

+0

不错,谢谢你的建议+链接:) – m09