我熟悉Prolog作为NaF的否定实现,甚至它的NaF实现都是不完整的,特别是与非地面否定的文字挣扎。我的问题是关于特定的语义。假设你有一个条款 p(X) :- q(Y) . 这是 那就是 \E y q(y)->\A x p(x) p(X) :- \+ q(Y) . 在FOL中,这可以表示为 \E y~q(y)->\A x p(x) \+ q(y) 对于任何x,p都是正确的,所以它的语义看起来非常不同,而不仅仅是不完整的。我遗漏了什么吗?
p(X) :- q(Y)
p(X) :- \+ q(Y)
\+ q(y)
谢谢
在序言中, p(X) :- \+ q(Y). 它本身并不能充分表达 p 适用于所有 X 如果 q Y 因为Prolog不知道 是的 问 是的 为此 q(Y)
p(X) :- \+ q(Y).
p
X
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寻找所有解决方案时成功两次。你可以用刀或者 once/1 为了避免那样。
p(_)
once/1