2 prolog
我正在创建一个用于Bert Bos拼图的板子,我试图将该板块列为列表列表.
我需要创建一个空列表列表,[ [], [] , [] , [] ]
但问题是我需要输入提供的空列表的确切数量.因此,例如,如果我给create_board(4,X),它应该返回X= [ [], [], [], [] ]
.
这是我到目前为止所拥有的
generate_board(0, [[]]) :- !
generate_board(N, [[] | T]) :-
N =< 12, N >= 1,
N is N-1.
generate_board(N, T).
Run Code Online (Sandbox Code Playgroud)
创建包含相同元素的给定长度列表的简单方法,或者在这种情况下只是空列表,是使用maplist2
:
generate_board(Length, Board) :-
length(Board, Length),
maplist(=([]), Board).
Run Code Online (Sandbox Code Playgroud)
这里,maplist(=([]), Board)
将调用=([], Element)
(的规范形式[] = Element
为每个)Element
中Board
,从而统一每个元素与[]
:
| ?- generate_board(4, L).
L = [[],[],[],[]]
yes
| ?-
Run Code Online (Sandbox Code Playgroud)
您可以扩展此概念以执行二维空板.将板视为行列表(带有长度Length
),将每行作为元素列表(带有长度Width
):
generate_board(Length, Width, Board) :-
length(Row, Width),
maplist(=([]), Row), % A row of empty lists, forming an empty row
length(Board, Length),
maplist(=(Row), Board). % A list of empty rows
| ?- generate_board(4,3, L).
L = [[[],[],[]],[[],[],[]],[[],[],[]],[[],[],[]]]
yes
| ?-
Run Code Online (Sandbox Code Playgroud)
这就是您的程序无法运行的原因(除了代替.
),
。因为这个片段失败了,所以你原来的程序也会失败。你必须以某种方式概括可见部分。
:- 操作(950,fy,*)。 *_。 generate_board(0, [[]]) :- ! generate_board(N, _/*[[] | T]*/) :- % 第二个 *N =< 12, % 第二 *N >= 1, % 第二 N为N-1, *生成板(N,T)。% 第一次概括 ?-generate_board(4,B)。
此方法适用于纯粹、单调的 Prolog 程序。然而,你使用了限制概括的削减。在这种情况下,人们确实必须注意不要在剪辑之前概括任何事情。因此,第一个概括是递归目标。这是该条款中的最后一个进球。只有这样,其他的概括才可能发生
在没有剪切的程序中,我们可以进一步概括您的程序:
生成板(0,_/*[[]]*/)。 ...