我正致力于创建用于Bert Bos puzzle的电路板,并且我试图将电路板表示为列表列表。
我需要创建一个空列表ex Menu
的列表,但问题是我需要输入提供的空列表的确切数量。因此,例如,如果我给create_board(4,X),它应该返回[ [], [] , [] , [] ]
。
这是我到目前为止所拥有的
X= [ [], [], [], [] ]
答案 0 :(得分:5)
创建由相同元素组成的给定长度列表的简单方法,或者在这种情况下只是空列表,是使用maplist2
:
generate_board(Length, Board) :-
length(Board, Length),
maplist(=([]), Board).
在此,maplist(=([]), Board)
会为=([], Element)
中的每个[] = Element
调用Element
(Board
的规范形式),从而将每个元素与{{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返回的内容)