gpt4 book ai didi

if-statement - Prolog if-then-else 构造 : -> vs *-> vs. if_/3

转载 作者:行者123 更新时间:2023-12-04 18:56:08 25 4
gpt4 key购买 nike

正如我在另一个 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,"这对我来说似乎很奇怪。 *->在我看来,它比 -> 严格得多当您尝试进行纯逻辑编程时。是否有任何理由避免这种结构,或者是否有更好的替代整个保护条款/否定保护条款模式?

最佳答案

让我们试试吧!你给出的模式是:

预测(X): -
(守卫(X)->
...
; ...
)。

我现在使用 (*->)/2并填写“...”如下:

预测(X): -
( 守卫(X) *->
错误的
;真的
)。

此外,如 guard/1 ,我定义了明显的纯谓词:

守卫(一)。

现在,让我们问 pred/1 最一般的查询 : 有什么解决办法吗?

?- 预测(X)。
错误的。

所以,根据谓词,没有术语 X使得 pred(X)是真的 .

但这是错误的,因为实际上有这样一个术语:

?-预测(b)。
真的。

事实上,pred/1有无穷多个解。在这种情况下,谓词声明根本不存在是否可以接受?当然,因为答案的计算效率非常高,不是吗?

我们得出的结论是 (*->)/2分享 (->)/2 的一个重要缺点:如果仅进一步实例化条件中出现的变量,则在不同分支适用的情况下,它可能会错误地提交到分支之一。以这种方式依赖于其参数实例化的谓词永远不可能是纯的,因为它抵消了我们期望适用于纯逻辑程序的单调推理。特别是,从逻辑的角度来看,由于 pred(b)持有,我们预计 pred(X) ,这是一个 概括pred(b) ,绝不能失败。一旦这个属性被破坏,你就不能再应用声明式调试和其他让你更容易理解、推理和管理 Prolog 程序的重要方法,这些方法首先构成了声明式编程的主要吸引力。

你提到的问题大概是What uses does if_3/ have? .

关于if-statement - Prolog if-then-else 构造 : -> vs *-> vs. if_/3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53088097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com