Prolog 问题与 findall 如何构造一对列表的解决方案(元素,list_of_elements)

Prolog problem with findall how to construct a solution of a list which is a pair (element, list_of_elements)

我正在尝试解决问题,但我不知道如何正确管理谓词 findall。

想法是下一个。

我们有一个 table 并且一些块在 table 上堆叠排列。

这可能是给定情况的示例:Table->a,b,c,d

所以块a正好在table上,块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 上,不一定正好在 Y 上,但 X 在 "superior level" 中。例如,在堆栈中 table->abcd d 堆叠在 b.

另一个谓词是over(X,Y),该谓词表示块 X 恰好在块 Y 之上,例如,table->abcd,块 c 在块 b 之上。

问题是写一个新的谓词,叫做 solution(L),L 是一个包含所有对 [B,LB] 列表的列表,其中 B 是堆栈中至少有 2 个块的块在它下面,排除正好在 table 之上的块(在示例 table->abcd 中,a 正好在 table 之上,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]]]

假设您的代码按预期工作,解决方案很简单:而不是

solution(L):-
    findall([B,LB],(stacking(B,X),stacking(X,Y),X\==Y, \+ just_over_table(Y)),L).

随便写

solution(L):-
    findall([B,[X,Y]],(stacking(B,X),stacking(X,Y),X\==Y, \+ just_over_table(Y)),L).

所以只需将 LB 替换为 [X,Y]

?- solution(L).
L = [[d, [c, b]]]