这是我的问题:一个小俱乐部决定 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 回答
累积列表相对简单:首先,观察如果
A
可以直接调用B
,则列表只是[A, B]
. 因此,我们可以将您的第一条规则重写为第二个规则有点棘手:你需要统一到由
message_route
生成的列表,并在其头部插入A
. 请注意,您不需要插入X
或B
,因为它们将由返回的列表提供:这是small demo that uses your data .
请注意,如果您呈现的数据表示带有循环的图形而不是树,则此代码将追逐自己的尾部 . 为避免这种情况,如果它已经是
Tail
列表的一部分,您可以避免选择X
.