【发布时间】:2017-03-07 18:46:43
【问题描述】:
假设我有知识库
likes(john,mary).
person(mary).
person(john).
如果我们问prolog是否
|?- likes(mary,john)
它会回答否,因为我们没有断言。除非我们明确说明,否则有什么方法可以让 prolog 回答 unknown。
\+ likes(mary,john)
换句话说,我们可以要求 prolog 尽可能地处理未绑定的表达式而不是 false。我一直在使用 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只能回答一个封闭的系统?因为我猜你可能会说我要求它可以考虑一个开放系统,或者它在这方面受到限制,我应该尝试一种不同的语言。
-
likes(mary,john)会成功,因为mary和john是人。这就是你的第二个子句所说的。 -
我不是这里的专家,但据我所知和使用它,标准 Prolog 是一个封闭的世界。我已经阅读了使用 Prolog 对开放世界系统进行的有目的的扩展和研究,但我从未与他们合作过,不能多说。由于可能有一个附加包改变了我不知道的 Prolog 的工作方式,我将在这里等待更多知识渊博的人作出回应。
-
person(X),person(Y) :-likes(X,Y).不是有效的语法。不知道你的意思。
标签: prolog ternary-search existential-operator