在编写Prolog规则时使用“OR”替代方法

时间:2013-12-27 12:53:31

标签: prolog

我正在尝试编写一个简单的prolog规则,用于检查数据库中的某个人是否曾向该数据库中的另一个人发送或接收过该消息。事实是基于消息(发送者,接收者,日期)的形式。我的代码是;

?-message(max, X, Y) ; message(A, max, B).

问题是,只有OR替代的第一个组合“;”尝试了,我收到了X和Y的值,但程序停在那里而没有执行OR替代的第二个组合,我没有收到A和B的值。我只是需要一些建议才能知道我是否正在进行这是错误的方式。感谢。

2 个答案:

答案 0 :(得分:1)

第一条消息一旦匹配,您的规则就会满足;如果第一条消息失败,它只需要考虑第二条消息。如果你想要两者都使用,你需要一个和(,而不是;)。

答案 1 :(得分:0)

析取将选择点推送到查询。要探索所有选择点,您可以做两件事:

  • ;或SPACE或TAB请求更多答案。
  • 使用谓词来收集所有答案,例如findall/3bagof/3

例如,定义了以下消息:

message(max, fred, 3).
message(max, fred, 4).
message(fred, max, 1).
message(fred, scott, 2).
message(max, scott, 5).

您的查询和回溯:

?- message(max, To, Time) ; message(From, max, Time).
To = fred,
Time = 3 ;
To = fred,
Time = 4 ;
To = scott,
Time = 5 ;
Time = 1,
From = fred.

请记住,您的查询与谓词或多或少相同:

person_message(From, to(To, Time)) :-
    message(From, To, Time).
person_message(To, from(From, Time)) :-
    message(From, To, Time).

定义了这个:

?- person_message(max, M).
M = to(fred, 3) ;
M = to(fred, 4) ;
M = to(scott, 5) ;
M = from(fred, 1).

?- bagof(M, person_message(max, M), Message).
Message = [to(fred, 3), to(fred, 4), to(scott, 5), from(fred, 1)].