我熟悉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中,这将表示为 \ E y~q(y) - > \ a x p(x)即“如果q为某些y失败,则p保持每个x”,但这似乎不是Prolog实现的语义。相反,Prolog将要求q在\+ q(y)
成功之前每y有限地失败,并且p对于任何x都为真。所以它的语义看起来非常不同,而不仅仅是不完整的。我错过了什么吗?
感谢
答案 0 :(得分:1)
在Prolog中,如果p(X) :- \+ q(Y).
某些p
失败,X
本身并未充分表达 q
对每个Y
都适用的概念Y
1}} 因为Prolog不知道有资格测试q
的{{1}}值的可能范围。因此,它不知道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寻求所有解决方案。您可以使用剪切或once/1
来避免这种情况。