假设我有知识库
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/