规则中的 Prolog 规则

Prolog rule within a rule

我有一个简单的序言程序,它试图根据信任规则和知道规则来确定谁信任谁。在这里

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).

knows规则是对称且可传递的,trusts规则由

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

信任不对称且不可传递。

我不确定如何在规则内制定规则,而且变量似乎让我感到困惑,因为试图仅将 2 个变量作为参数但在规则中使用 4 个变量。如有任何帮助,我们将不胜感激。

您的问题以某种方式暗示您认为您必须 将出现在谓词正文中的所有变量放在谓词的头部。这是没有必要的。假设我想找到我们问题定义中某人认识的人数:

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

您可能真的只想知道 Betty 认识 4 个人,但无论如何顶层都会写出 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.

您现在 "hidden" 正文中的人员列表 knows_count/2

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

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

正如@mat 所指出的,现在您所要做的就是确保谓词正文中 "X knows" 的所有人不是同一个人。见 link in the comment by @mat or just search Whosebug for [prolog] dif.