findall的Prolog问题,如何构造成对的列表(元素,list_of_elements)

时间:2019-06-04 11:23:59

标签: prolog prolog-findall

我正在尝试解决问题,但我不知道如何正确处理谓词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上,不一定正好在块Y之上,但是X处于“上级”。例如,在堆栈表中-> 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]]]

1 个答案:

答案 0 :(得分:1)

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

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]]]