为了得到传递闭包 /questions/tagged/transitive-closure二元关系的R_2
, use 元谓词 /questions/tagged/meta-predicate closure/3 https://stackoverflow.com/questions/26946133/definition-of-reflexive-transitive-closure像这样:
?- closure(R_2,From,To).
让我们运行一个示例查询closure/3
和...一起likes/2
!
?- closure(likes,X,Y).
X = g, Y = c
; X = g, Y = a
; X = g, Y = b
; X = g, Y = a % redundant
; X = g, Y = d
; X = c, Y = a
; X = c, Y = b
; X = c, Y = a % redundant
; X = c, Y = d
; X = b, Y = a
; X = b, Y = d
; false. % query terminates universally
当我们使用时我们得到相同的答案indirect_likes/2
,但顺序不同:
?- indirect_likes(X,Y).
X = g, Y = c
; X = c, Y = a
; X = c, Y = b
; X = b, Y = a
; X = b, Y = d
; X = g, Y = a
; X = g, Y = b
; X = c, Y = a % redundant
; X = g, Y = a % redundant
; X = c, Y = d
; X = g, Y = d
; false. % query terminates universally
正如您在对 @C.B. 的回答的评论中所述,二元关系不一定是自反的和/或对称的。根据你给出的定义,likes/2
is neither:
?- likes(X,X).
false. % not reflexive (not even close)
?- likes(X,Y), likes(Y,X).
false. % not symmetric (not even close)
到目前为止,一切都很好!
Let's 姑且将以下附加事实添加到您的数据库中:
likes(b,b).
有了这个扩展的定义,indirect_likes/2
行为异常:
?- indirect_likes(b,b).
true
; true
; true
... % does not terminate universally
?- indirect_likes(X,Y), false. % do we get finite failure?
... % no! query does not terminate universally
我们可以做什么?让我们使用元谓词 /questions/tagged/meta-predicate closure/3
与扩展版本likes/2
!
?- closure(likes,b,b).
true % succeeds non-deterministically
; false. % query terminates universally
?- closure(likes,X,Y), false. % do we get finite failure?
false. % yes! query terminates universally
底线是什么?
在纯粹的 Prolog 中,就逻辑意义而言,合取是可交换的。
由于 Prolog 的SLD分辨率 https://en.wikipedia.org/wiki/SLD_resolution, 目标false,repeat
有限地失败,但是repeat,false
才不是。
程序员需要处理终止,但通常这对于 Prolog 提供的原始性能和控制来说只是一个很小的代价。
在这个答案中,我将“终止担忧”传递给了实施者元谓词 /questions/tagged/meta-predicate closure/3 https://stackoverflow.com/questions/26946133/definition-of-reflexive-transitive-closure :)