规则中的Prolog规则

时间:2017-04-16 21:37:36

标签: parameters prolog rules

我有一个简单的prolog程序,试图确定谁信任基于信任规则和知道规则的人。这是

know(joe,jack).
know(joe,sue).
know(joe,betty).
know(sue,betty).
know(jack,betty).
know(bill,betty).

knows(X,Y):- know(X,Y);know(Y,X).

trust(jack,joe).
trust(bill,joe).
trust(betty,jack).

了解规则是对称且可传递的,信任规则由

定义
Person X trusts Y if and only if
-X inherently trusts Y, or
-X knows two DIFFERENT people who trust Y.

信任不是对称的,也不是传递性的。

我不确定如何在规则中执行规则,并且变量似乎搞砸了我,因为在尝试仅将2个变量作为参数但在规则中使用4。任何帮助将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:2)

您的问题以某种方式暗示您认为必须在谓词的头部具有出现在谓词正文中的所有变量。这不是必需的。假设我想找到问题定义中有人知道的人数:

?- bagof(X, knows(betty, X), Xs), length(Xs, N).

你可能真的只是想知道Betty知道4个人,但是toplevel会写出Betty知道的人名单。所以你把它放在一个谓词中:

knows_count(X, N) :-
    bagof(Y, knows(X, Y), Ys),
    length(Ys, N).

所以现在你只看到你需要看到的东西:

?- knows_count(betty, N).
N = 4.

?- knows_count(X, N).
X = betty, N = 4 ;
X = bill,  N = 1 ;
X = jack,  N = 2 ;
X = joe,   N = 3 ;
X = sue,   N = 2.

您现在已经“隐藏”knows_count/2正文中的人员列表。

要定义trusts/2的第二种情况,您可以这样做:

trusts(X, Y) :-
    knows(X, A), trust(A, Y), ... % and so on

正如@mat所指出的,现在你所要做的就是确保谓词正文中“X知道”的所有人都不是同一个人。请参阅link in the comment by @mat或只搜索Stackoverflow以查找[prolog] dif