首页 文章

Prolog - 递归列表

提问于
浏览
2

这是我的问题:一个小俱乐部决定 Build 一个电话网络,以便在其成员中发送紧急信息 . 以下安排得到了同意:安妮可以给比尔和玛丽打电话 . 比尔可以打电话给汤姆和苏 . 汤姆可以打电话给利兹和弗兰克 . Liz还可以在必要时给Frank打电话 .

将此信息表示为形式为 can_phone(anne,bill) 的七个Prolog事实 . 现在为谓词message_route编写递归Prolog规则,如果 A 可以使用俱乐部的电话安排将消息传递给 B ,通过列表 R 中的人员路由,则 message_route(A,B,R) 为真 . 例如, message_route(anne,frank,[anne,bill,tom,liz,frank]) 将为真(因为 anne 可以致电 bill ,谁可以致电 tom ,谁可以致电 liz ,谁可以致电 frank ) .

到目前为止我有这个:

can_phone(anne,bill).
can_phone(anne,mary).
can_phone(bill,tom).
can_phone(bill,sue).
can_phone(tom,liz).
can_phone(tom,frank).
can_phone(liz,frank).

对于我的 message_route ,我已经进行了实验,并且让我能够完成问题的第二部分,而无需将列表限制为指定的人员列表( R ) .

message_route(A,B) :- can_phone(A,B).
message_route(A,B) :- can_phone(A,X), message_route(X,B).

我不明白如何在我的答案中实现这个列表 .

1 回答

  • 3

    累积列表相对简单:首先,观察如果 A 可以直接调用 B ,则列表只是 [A, B] . 因此,我们可以将您的第一条规则重写为

    message_route(A,B,[A,B]) :- can_phone(A,B).
    

    第二个规则有点棘手:你需要统一到由 message_route 生成的列表,并在其头部插入 A . 请注意,您不需要插入 XB ,因为它们将由返回的列表提供:

    message_route(A,B,[A|Tail]) :- can_phone(A,X), message_route(X,B,Tail).
    

    这是small demo that uses your data .

    请注意,如果您呈现的数据表示带有循环的图形而不是树,则此代码将追逐自己的尾部 . 为避免这种情况,如果它已经是 Tail 列表的一部分,您可以避免选择 X .

相关问题