prolog - prolog 可以回答未确定的而不是只是是或否吗?

标签 prolog ternary-search existential-operator

假设我有知识库

likes(john,mary).
person(mary).
person(john).

如果我们问 prolog 是否
|?- likes(mary,john)

它将回答 没有因为我们没有断言。有什么办法可以让序言回答未知除非我们明确说明。
\+ likes(mary,john)

换句话说,我们是否可以要求 prolog 尽可能地对待未绑定(bind)的表达式而不是错误的。我一直在使用 IDP 系统,它允许存在量化并将未断言的关系视为不受约束而不是错误的,但我想使用更主流的东西。
http://adams.cs.kuleuven.be/idp/server.html

例如,在 IDP 中,您可以做出声明
vocabulary V{
    type Person
    Likes(Person,Person)
}


theory T: V{

    //Everyone might like someone and disallow narcisiscm
    !x : ?y: Likes(x,y) & ~Likes(x,x).

}

//some instance without special meaning
structure S:V{
    Person={A..C}
}

procedure main(){
    //Print all possible solutions
    printmodels(allmodels(T,S))
}

哪个产量
Number of models: 27
Model 1
=======
structure  : V {
  Person = { "A"; "B"; "C" }
  Likes = { "A","B"; "A","C"; "B","A"; "B","C"; "C","A"; "C","B" }
}
//...

最佳答案

如前所述,Prolog 使用封闭世界假设,即询问事实是否真实意味着我们询问我们是否知道它是真实的 - no意味着我们不知道它是不是真的,而不是它是假的。当然,作为图灵完备的语言,你可以模拟一个开放的世界——比如:

like(true, mary, john).
like(false, mary, nick).
like(unknown, X, Y).

可能最好有一些额外的包装器来处理边缘情况(例如,对一对同时具有真假),并且可能使用一些高阶谓词技巧来避免编写大量样板 - 但实现的核心是您明确宣布什么是假的,什么是真的,其余的都是未知的。

关于prolog - prolog 可以回答未确定的而不是只是是或否吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42655950/

相关文章:

Prolog计数器问题

qt - 如何使用 QProcess 获得 SWI-prolog 查询的下一个解决方案?

将谓词应用于列表元素的 Prolog 映射过程

prolog - 如何在SWI-Prolog中编写可选

algorithm - 三元搜索的递归关系

algorithm - 二元搜索与三元搜索

coffeescript - 如何使用 CoffeeScript 存在运算符检查未定义的某些对象属性?