Prolog:创建一个空列表列表

时间:2017-03-21 00:36:10

标签: prolog

我正致力于创建用于Bert Bos puzzle的电路板,并且我试图将电路板表示为列表列表。

我需要创建一个空列表ex Menu的列表,但问题是我需要输入提供的空列表的确切数量。因此,例如,如果我给create_board(4,X),它应该返回[ [], [] , [] , [] ]

这是我到目前为止所拥有的

X= [ [], [], [], [] ]

4 个答案:

答案 0 :(得分:5)

创建由相同元素组成的给定长度列表的简单方法,或者在这种情况下只是空列表,是使用maplist2

 generate_board(Length, Board) :-
     length(Board, Length),
     maplist(=([]), Board).

在此,maplist(=([]), Board)会为=([], Element)中的每个[] = Element调用ElementBoard的规范形式),从而将每个元素与{{1}统一起来}}:

[]

你可以扩展这个概念来做一个二维空板。可以将电路板视为行列表(长度为| ?- generate_board(4, L). L = [[],[],[],[]] yes | ?- ),每行作为元素列表(长度为Length):

Width

答案 1 :(得分:4)

以下是您的计划无效的原因(.代替,除外)。由于此片段失败,原始程序也会失败。你必须以某种方式推广可见部分。

:- op(950,fy,*).
*_.

generate_board(0, [[]]) :- ! 
generate_board(N, _/*[[] | T]*/) :-        % 2nd
  * N =< 12,                               % 2nd
  * N >= 1,                                % 2nd
  N is N-1,
  * generate_board(N, T).                  % 1st generalization

?- generate_board(4, B).

此方法适用于纯粹的单调Prolog程序。但是,您使用了限制泛化的剪切。在这种情况下,人们必须注意不要在切割之前概括任何东西。因此,第一个概括是递归目标。这是该条款的最后一个目标。只有这样,其他概括可能会发生

在没有剪辑的程序中,我们可以进一步推广您的程序:

generate_board(0, _/*[[]]*/).
...

答案 2 :(得分:2)

一个简单的解决方案:

generate_board(N, Board) :-
    findall([], between(1, N, _), Board).

答案 3 :(得分:0)

除了一些语法错误之外,代码的主要问题是行N is N-1。在Prolog中,您无法重新分配&#39;一个变量。变量在整个谓词中具有单个值。 &n; N是N-1`只能成功获得一个等于自身减去1的值,这显然不会是这种情况。

修复它很简单:只需使用另一个变量来减少值:

generate_board(0, [[]]) :- !.
generate_board(N, [[] | T]) :-
  N =< 12, N >= 1,
  N2 is N-1,
  generate_board(N2, T).

?- generate_board(4, X).
X = [[], [], [], [], []]

这给出了一个结果,但它比预期的要多一个元素。你能弄清楚如何自己解决这个问题(提示:看一下基础案例为输入0返回的内容)