我正在尝试解决一个问题,但我不知道如何正确管理谓词 findall。
这个想法是下一个。
我们有一张桌子和一些在桌子上堆叠排列的积木。
这可能是给定情况的示例:Table->a,b,c,d
所以块 a 正好在桌子上,块 b 在块 a 上,依此类推。
我们也有一些谓词,例如下一个:
stacking(X,Y):-
over(X,Y).
stacking(X,Y):-
over(X,Z),
stacking(Z,Y).
just_over_table(X).
因此,谓词stacking(X,Y)
表示块“X”在块 Y 上堆叠,不一定完全在它之上,但 X 处于“上级”。例如,在stack table->abcd 中,d 是堆叠在b 之上。
其他谓词是over(X,Y)
谓词表示块 X 正好在块 Y 上,例如,table->abcd,块 c 在块 b 上。
问题在于编写一个新谓词solution(L)
L 是一个列表,其中包含对 [B,LB] 的所有列表,其中 B 是堆栈的一个块,其下至少有 2 个块,不包括正好在表上方的块(在示例 table->abcd 中,a 正好在桌子上方,b、c、d 不在)。LB 是一个列表,其中包含堆栈中 B 下的块。如果没有满足条件的块,则 L 应返回空。
为了解决这个问题,我们可以使用这个知识作为例子:
over(d,c).
over(c,b).
over(b,a).
just_over_table(a).
我解决问题的想法是下一个代码:
solution(L):-
findall([B,LB],(stacking(B,X),stacking(X,Y),X\==Y, \+ just_over_table(Y)),L).
我发现的问题是我不知道如何在列表 LB 中插入 X 和 Y。
以table->abcd为例
解决方案应该是L=[[d,[c,b]]]