prolog 能否回答不确定而不是仅仅回答是或否?
Can prolog answer undetermined instead of just yes or no?
假设我有知识库
likes(john,mary).
person(mary).
person(john).
如果我们问序言是否
|?- likes(mary,john)
它会回答 no 因为我们没有断言。除非我们明确说明,否则有什么方法可以使序言回答未知。
\+ likes(mary,john)
换句话说,我们是否可以要求序言尽可能地对待未绑定的表达式而不是错误的。我一直在使用允许存在量化并将非断言关系视为未绑定而不是错误的 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).
可能最好有一些额外的包装器来处理边缘情况(例如,一对同时具有 true 和 false),并且可能使用一些高阶谓词技巧来避免编写大量样板 - 但核心实现是你明确声明什么是假的,什么是真的,其余的是未知的。
到目前为止所说的非常正确:Prolog 在所谓的 Closed World Assumption (CWA) 下运行。不过,除了已经发布的内容之外,我还想提供一个补充的观点。
首先,Prolog 程序甚至可能 终止 ,因此我们可能永远不会收到您提到的可能答案中的 个。
但即使程序确实终止,我们可能仍然得到既不等同于true
的答案也不到false
.
例如,使用 GNU Prolog:
| ?- X #\= 3.
X = _#2(0..2:4..127@)
在这里,答案是一个悬而未决的约束,一个据说陷入困境的目标,因为它的真实性尚未确定。
此类答案可能会也可能不会描述解决方案。
例如:
| ?- fd_all_different([X,Y,Z]), fd_domain([X,Y,Z], 0, 1).
X = _#2(0..1)
Y = _#20(0..1)
Z = _#50(0..1)
yes
在这种情况下,不存在解决方案!要看到这一点,我们需要明确地搜索他们:
| ?- fd_all_different([X,Y,Z]), fd_domain([X,Y,Z], 0, 1),
fd_labeling([X,Y,Z]).
no
因此,在上面的例子中,用 maybe
代替 yes
可能真的更可取。
此外,我们从基本逻辑定理得知,在对整数进行推理时,此类问题不可避免。
从这个意义上说,Prolog 系统确实可以给出不仅不是,而且无法确定的答案。
假设我有知识库
likes(john,mary).
person(mary).
person(john).
如果我们问序言是否
|?- likes(mary,john)
它会回答 no 因为我们没有断言。除非我们明确说明,否则有什么方法可以使序言回答未知。
\+ likes(mary,john)
换句话说,我们是否可以要求序言尽可能地对待未绑定的表达式而不是错误的。我一直在使用允许存在量化并将非断言关系视为未绑定而不是错误的 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).
可能最好有一些额外的包装器来处理边缘情况(例如,一对同时具有 true 和 false),并且可能使用一些高阶谓词技巧来避免编写大量样板 - 但核心实现是你明确声明什么是假的,什么是真的,其余的是未知的。
到目前为止所说的非常正确:Prolog 在所谓的 Closed World Assumption (CWA) 下运行。不过,除了已经发布的内容之外,我还想提供一个补充的观点。
首先,Prolog 程序甚至可能 终止 ,因此我们可能永远不会收到您提到的可能答案中的 个。
但即使程序确实终止,我们可能仍然得到既不等同于true
的答案也不到false
.
例如,使用 GNU Prolog:
| ?- X #\= 3. X = _#2(0..2:4..127@)
在这里,答案是一个悬而未决的约束,一个据说陷入困境的目标,因为它的真实性尚未确定。
此类答案可能会也可能不会描述解决方案。
例如:
| ?- fd_all_different([X,Y,Z]), fd_domain([X,Y,Z], 0, 1). X = _#2(0..1) Y = _#20(0..1) Z = _#50(0..1) yes
在这种情况下,不存在解决方案!要看到这一点,我们需要明确地搜索他们:
| ?- fd_all_different([X,Y,Z]), fd_domain([X,Y,Z], 0, 1), fd_labeling([X,Y,Z]). no
因此,在上面的例子中,用 maybe
代替 yes
可能真的更可取。
此外,我们从基本逻辑定理得知,在对整数进行推理时,此类问题不可避免。
从这个意义上说,Prolog 系统确实可以给出不仅不是,而且无法确定的答案。