Prolog:创建一个空列表列表

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)

lur*_*ker 5

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

 generate_board(Length, Board) :-
     length(Board, Length),
     maplist(=([]), Board).
Run Code Online (Sandbox Code Playgroud)

这里,maplist(=([]), Board)将调用=([], Element)(的规范形式[] = Element为每个)ElementBoard,从而统一每个元素与[]:

| ?- 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)


fal*_*lse 5

这就是您的程序无法运行的原因(除了代替.,。因为这个片段失败了,所以你原来的程序也会失败。你必须以某种方式概括可见部分。

:- 操作(950,fy,*)。
*_。

generate_board(0, [[]]) :- !
generate_board(N, _/* [[] | T] */) :- % 第二个
  * N =< 12 , % 第二
  * N >= 1 , % 第二
  N为N-1,
  *生成板(N,T)。% 第一次概括

?-generate_board(4,B)。

此方法适用于纯粹、单调的 Prolog 程序。然而,你使用了限制概括的削减。在这种情况下,人们确实必须注意不要在剪辑之前概括任何事情。因此,第一个概括是递归目标。这是该条款中的最后一个进球。只有这样,其他的概括才可能发生

在没有剪切的程序中,我们可以进一步概括您的程序:

生成板(0,_/* [[]] */)。
...