代码之家  ›  专栏  ›  技术社区  ›  Motorhead

Prolog实现非基字否定的语义是什么

  •  1
  • Motorhead  · 技术社区  · 8 年前

    我熟悉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都是正确的,所以它的语义看起来非常不同,而不仅仅是不完整的。我遗漏了什么吗?

    谢谢

    1 回复  |  直到 8 年前
        1
  •  1
  •   lurker    8 年前

    在序言中, p(X) :- \+ q(Y). 它本身并不能充分表达 p 适用于所有 X 如果 q Y 因为Prolog不知道 是的 是的 为此 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 为了避免那样。

    推荐文章