【问题标题】:Prolog problem with findall how to construct a solution of a list which is a pair (element, list_of_elements)findall 的 Prolog 问题如何构造一对列表的解决方案(元素,list_of_elements)
【发布时间】:2019-06-04 11:23:59
【问题描述】:

我正在尝试解决一个问题,但我不知道如何正确管理谓词 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 处于“上级”。比如在栈表中->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]]]

【问题讨论】:

    标签: prolog prolog-findall


    【解决方案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]]]
    

    【讨论】:

    • 这是我看不到的,把LB拆分成[X,Y]就完美了,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2019-05-04
    • 2012-02-07
    相关资源
    最近更新 更多