正如我似乎再也找不到的另一个 StackOverflow 答案中所述,这种模式经常出现在实际的 Prolog 代码中:
pred(X) :-
guard(X),
...
pred(X) :-
\+ guard(X),
...
许多人试图将其浓缩为
pred(X) :-
(guard(X) ->
...
;
...).
然而众所周知,箭头结构破坏了选择点并且不合逻辑。
在 Ulrich Neumerkel 和 Stefan Kral 的Indexing dif/2中,提出了一个单调且合乎逻辑的谓词if_/3
,但是在论文中他们提到了另一个引起我注意的构造:*->
.
该*->
构造函数的功能与上面的未加糖保护子句示例完全相同,因此它似乎非常适合我的使用,因为我不想拥有所需的具体条件,if_/3
而且我不太关心额外的选择点。如果我没记错的话(编辑:我是),它提供了与条件谓词相同的语义,if_/3
但不需要将“具体化”添加到条件谓词中。
然而,在它的 SWI 文档中,它声称“这种结构很少使用”,这对我来说似乎很奇怪。在我看来,这比您尝试进行纯逻辑编程时要*->
好得多。->
是否有任何理由避免这种结构,或者是否有更好的替代整个保护条款/否定保护条款模式?