4

假设我有知识库

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

如果我们问 prolog 是否

|?- likes(mary,john)

它会回答,因为我们没有断言。除非我们明确说明,否则有什么方法可以使序言答案未知。

\+ likes(mary,john)

换句话说,我们是否可以要求 prolog 尽可能地对待未绑定的表达式而不是错误的。我一直在使用 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" }
}
//...
4

2 回答 2

3

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

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

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

于 2017-03-07T20:46:19.470 回答
1

到目前为止所说的非常正确:Prolog 在所谓的封闭世界假设 (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)

是的

在这种情况下,不存在解决方案!要看到这一点,我们需要显式搜索它们:

| ?- fd_all_different([X,Y,Z]), fd_domain([X,Y,Z], 0, 1),
      fd_labeling([X,Y,Z])。


maybe因此,在上面的示例中,使用而不是 回答可能确实更可取yes

此外,我们从基本的逻辑定理中知道,在对整数进行推理时,这些问题是不可避免的。

从这个意义上说,Prolog 系统确实可以给出答案,其真实性不仅不是,而且是无法确定的。

于 2017-03-07T22:39:55.780 回答