我似乎无法在prolog中找到这个特殊的结构。考虑三个谓词a / 2,b / 2和c / 2,这样: -
a(M, N) :- b(M, N), c(M, N)
现在,谓词之间的实际依赖性并不完全相同。期望的是当M未被约束时评估b和c,并且因此在两种情况下都返回评估的M.但是在这里,M将被评估到最后,并且只返回一个值。
我的问题是: -
答案 0 :(得分:2)
首先要做的事情是:您是否尝试过教科书或教程?在继续之前,它可能会帮助您尝试这样做。
然后:在Prolog中,你没有“AND”和“OR”;你有连词和 disjunctions 。为了使其更加混乱,连词和分离都不具有与逻辑或语法相同的含义。代替:
a, b
最接近过程语言中AND布尔运算符的短路评估:它表示“a
,如果成功,{{1}如果成功,b
成功。“
然后,分离a, b
不像程序语言的短路OR 。相反,( a ; b )
表示“( a ; b )
,如果成功,a
成功;然后( a ; b )
,如果成功,b
再次成功。”< / p>
在Prolog中,这样的分离:
( a ; b )
相当于定义两个单独的子句:
foo(A) :-
( bar(A)
; baz(A)
).
所以这是一个小程序:
foo(A) :-
bar(A).
foo(A) :-
baz(A).
NB :资本化很重要。
此程序说:“如果a(A) :- b(A), c(A).
b(x). b(y). b(z).
c(y).
成功,a(A)
成功,b(A)
成功,c(A)
成功。b(A)
如果A
可以与其中一个成功统一如果x
可以与原子y
统一,原子z
,c(A)
或A
。y
会成功。“
尝试以下查询的行为:
?- a(A).
?- a(x).
?- a(y).
要查看具体情况,请尝试:
?- trace(a/1), trace(b/1), trace(c/1).