问题标签 [negation-as-failure]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
prolog - Prolog 中的否定失败是如何工作的?
我想知道Prolog如何解决这个程序:
我用谷歌搜索了“否定失败”,但我很困惑!
prolog - Prolog 否定和逻辑否定
假设我们有以下程序:
和查询(返回false):
跟踪时,我可以看到X
实例化为tom
,谓词a(tom)
成功,因此\+ a(tom)
失败。
我在一些教程中读到,\+
Prolog 中的 not ( ) 只是一个测试,不会导致实例化。
有人可以为我澄清上述观点吗?正如我所看到的实例化。
我知道非(否定为失败)和逻辑否定之间存在差异。您能否参考一篇好文章来解释它们在哪些情况下表现相同以及何时表现不同?
prolog - Prolog中的否定是一种程序行为吗?
我对Prolog 语言中的否定作为失败有一个小问题:
这是一个比实际更理论的问题,因为我清楚这个例子是如何工作的。
所以我有以下Prolog程序:
在 Prolog 中,我不能简单地说:“玛丽爱所有动物,但不是蛇” ,我必须这样表述:“如果 X 是一条蛇,那么玛丽不爱它。否则,如果X 它是一种动物,玛丽喜欢它”
根据规则,先例程序正是这样做的:
Prolog 检查 X 是否是一条蛇,强制执行切割以避免回溯并强制谓词失败。
通过这种方式,如果snake(X)
程序TRUE
强制头部前导的失败likes(mary,X)
和强加回溯避免了执行程序中其他规则的可能性(答案是真的,因为蛇也是动物)
我的问题是:在我看来,Prolog 的这种使用超出了逻辑和声明范式,并且在某种程度上属于某种程序范式
因为:
- 我必须强加 2 谓词的顺序(所以在某种程度上我是说:如果第一个失败,请尝试第二个)。
- 但我更想说的是:如果第一个规则匹配(X 它是一条蛇),则执行强制失败并且不强制回溯。
在我看来,这似乎更接近于程序意义,而不是经典逻辑意义......
是那个吗?是不是在这些情况下,Prolog 使用程序行为来克服逻辑的限制?
exception - 为什么在 Prolog 中抛出异常而不是简单的失败?
我在 Prolog 中编程,有时我想失败,但我得到了一个异常,我不明白为什么它们之间应该有区别。如果某事无法执行,则意味着谓词没有成功,所以这是一个简单的失败。我错过了什么吗?
prolog - 双重否定的输出混淆为失败
我正在尝试学习序言,但遇到了以下问题:
鉴于 -
我希望查询?- try(X).
,因为以下查询类似于
但实际上,输出是:
这是为什么?为什么变量没有初始化为某个值?
answer-set-programming - ASP 中如何将否定理解为失败?
假设我们有以下程序:
如果我们运行 clgo 来获取程序的答案集,我们得到
我们知道grounder会先将所有变量实例化为常量,所以grounder之后的程序是:
我在Gelfond 的书中读到它给出了 3 条规则来获取答案集:
满足Π的规则。换句话说,如果你相信规则的主体,就相信它的头部。
不要相信矛盾。
坚持“理性原则”,即“什么都不相信,你不是被迫相信”。</p>
在规则中:
我们被否定为失败not holiday(tomorrow)
如本书所示:
符号
not
是一个新的逻辑连接词,称为默认否定,(或否定为失败);not l 通常被解读为“不相信 l 是真的”。请注意,这并不意味着 l 被认为是错误的。p
一个理性的推理者既不相信陈述也不相信它的否定,这是可以想象的,实际上是很正常的¬p
。
那么根据规则 1,我应该相信believe in the head of a rule if you believe in its body
身体not holiday(tomorrow).
,因为我既不相信holiday(tomorrow).
也不相信¬holiday(tomorrow).
?
根据答案,我应该相信¬holiday(tomorrow).
- 那么为什么我们需要这种否定作为失败呢?
- 我们可以只使用经典否定吗?
prolog - Prolog中的否定失败和答案集编程中的默认否定
与答案集编程中的默认否定相比,我很难将否定的概念理解为 Prolog 中的失败。有人可以向我解释一下有什么区别吗?
clojure - Clojure core.logic : nafc 和 ground
我在 Clojure 的 core.logic 中表示一个简单的数据库。
有两个谓词:page(p) 和 link(p,q)。
page(p) 表示在名为 p 的 wiki 中存在页面
link(p,q) 表示页面 p 包含到页面 q 的链接。
我现在正在尝试查询此数据库以查找
- a) 断开的链接(即页面 p 中的链接,没有页面 q),以及
- b) 孤立页面(没有链接的页面)
我的这些查询代码是这样的:
断开的链接按预期工作,但孤儿给了我一个 :- 符号列表。
我假设这与 nafc 的限制有关。根据文档:
实验:否定作为失败约束。目标 c 的所有论据都必须有依据。如果某些论点不成立,则此约束的执行将被延迟。
这些是“延迟的”,因为它们不是“地面”。
有人可以解释一下 ground 的真正含义吗?我知道它“没有自由变量”,但我仍然不明白在这种情况下这意味着什么。
其次,我应该如何编写这个孤儿查询?
prolog - 寻求 (\=)/2 的纯 Prolog 实现
作为失败的否定通常被认为是不纯的。否定失败所需的 Prolog 解释器必须实现 SLDNF,它是 SLD 的扩展。
谓词(\=)/2
例如在 library(reif) 中使用。它可以通过否定作为失败引导,如下所示,但通常是内置的:
是否可以(\=)/2
作为纯谓词来实现?仅使用纯 Prolog,即仅使用一阶喇叭子句?