3

这是我的问题:一个小俱乐部决定建立一个电话网络,用于在其成员之间发送紧急信息。同意以下安排:安妮可以给比尔和玛丽打电话。比尔可以给汤姆和苏打电话。汤姆可以给丽兹和弗兰克打电话。如有必要,Liz 也可以给 Frank 打电话。

将此信息表达为形式的七个 Prolog 事实 can_phone(anne,bill)。现在为谓词 message_route 编写递归 Prolog 规则,message_route(A,B,R)如果可以使用俱乐部的电话安排,通过 list 中的人员A将消息传递给Brouted ,则为 true。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).

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

4

1 回答 1

3

累加一个list比较简单:首先,观察ifA可以B直接调用,list就是简单的[A, B]。因此,我们可以将您的第一条规则重写为

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

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

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

这是一个使用您的数据的小演示

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

于 2013-03-07T16:36:10.693 回答