规则中的 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
.
我有一个简单的序言程序,它试图根据信任规则和知道规则来确定谁信任谁。在这里
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
.