【发布时间】:2018-10-31 16:30:06
【问题描述】:
正如我似乎再也找不到的另一个 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 文档中,它声称 "this construct is rarely used," 对我来说似乎很奇怪。当您尝试进行纯逻辑编程时,*-> 在我看来比-> 要好得多。有什么理由避免这种结构,还是有更好的替代整个保护子句/否定保护子句模式的方法?
【问题讨论】:
-
如果我没记错的话,它提供的语义与
if_/3相同。你误会了。请参考2 Prolog 的 if-then-else 的声明性限制,最后一段:即使是 SICStus 和 SWI 的“软剪辑”版本if/3和(*->)/2,也可以展示与 Prolog 的不合理否定相同的问题。 -
这是
if/3的定义(效率不高,因为它执行了两次守卫):if(G_0, Then_0, _) :- G_0, Then_0. if(G_0, _, Else_0) :- \+ G_0, Else_0.你看到\+?里面充满了杂质!
标签: if-statement prolog control-structure logical-purity implication