Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';是Prolog的语义';非地面文字否定的s实现_Prolog_Negation_First Order Logic - Fatal编程技术网

什么';是Prolog的语义';非地面文字否定的s实现

什么';是Prolog的语义';非地面文字否定的s实现,prolog,negation,first-order-logic,Prolog,Negation,First Order Logic,我熟悉Prolog将否定作为NaF的实现,甚至它对NaF的实现都是不完整的,尤其是在与非基础否定文本的斗争中。我这里的问题是关于具体的语义。假设你有一个子句p(X):-q(Y)。这是\A x,y(q(y)->p(x))的子句形式,即\E y q(y)->\A x p(x),这确实是prolog实现的语义。但是现在考虑一下,如果我有 p(x):-\+q(y)< /代码>。在FOL中,这将表示为\eyq(y)->\apx(x),即“如果某个y的q失败,那么每x的p保持不变”,但这似乎不是Prolog

我熟悉Prolog将否定作为NaF的实现,甚至它对NaF的实现都是不完整的,尤其是在与非基础否定文本的斗争中。我这里的问题是关于具体的语义。假设你有一个子句
p(X):-q(Y)
。这是\A x,y(q(y)->p(x))的子句形式,即\E y q(y)->\A x p(x),这确实是prolog实现的语义。但是现在考虑一下,如果我有<代码> p(x):-\+q(y)< /代码>。在FOL中,这将表示为\eyq(y)->\apx(x),即“如果某个y的q失败,那么每x的p保持不变”,但这似乎不是Prolog实现的语义。相反,Prolog将要求q在
\+q(y)
成功之前对每个y进行有限失败,p对任何x都是真的。所以它的语义看起来非常不同,不仅仅是不完整。我错过什么了吗

感谢

在Prolog中,
p(X):-\+q(Y)。
本身并不能充分表达这样一个概念,即如果
q
在某些
Y
中失败,那么
p
对每个
X
都适用,因为Prolog不知道有资格测试
q
值的可能范围。因此,它不知道
Y
的任何值,
q(Y)
是不可证明的

让我们假设你有以下几点:

q(a).
q(b).
q(c).

valid_y(Y) :- member(Y, [a,b,c,d,e]).
然后你可以写:

p(_) :- valid_y(Y), \+ q(Y).

然后,
p()
成功两倍于Prolog寻找所有解决方案。您可以使用cut或
一次/1
来避免这种情况。

您确实需要连接
p(X)
q(Y)
之间共享的变量“相反,Prolog要求q对每个Y都有限地失败”这不像Prolog在尝试q(Y)之前神奇地为Y提供一些值。它只是试图证明q(Y)。如果Y是自由的(未实例化),那么一些值将作为证明的一部分出现(或者不会出现)。然后丢弃找到的替换(如果有),并翻转成功状态。如果q(Y)没有被证明,则p(X)被认为是已证明的,没有替换,即X保持原样<代码>\+A
是非逻辑的:它意味着“在程序的当前状态下无法证明A”。我不是逻辑学家。@false:为什么?如果每个人都富有,每个人都快乐,如果每个人都不富有,那么每个人都是幸福的。