2017-03-07 157 views
4

假设我有知识基础prolog答案可以不确定,而不仅仅是或不是?

如果我们问Prolog自己是否

|?- likes(mary,john) 

会回答没有因为我们并不能断言。除非我们明确说明,否则有任何方法可以使序言回答未知

\+ 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" } 
} 
//... 
+3

你知道的[封闭世界假定(https://en.wikipedia.org/wiki/Closed-world_assumption)与[开放世界假定(https://en.wikipedia.org/wiki/Open-world_assumption)? –

+0

你是说prolog只能回答一个封闭的系统吗?因为我想你可以说我问它可以考虑一个开放的系统,或者它在这方面是有限的,我应该尝试一种不同的语言。 – awiebe

+0

'喜欢(玛丽,约翰)'会成功的,因为'mary'和'john'是人。这就是你的第二个条款所说的。 –

回答

2

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

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

也许最好能有一些额外的包装,以应对极端情况(例如,具有一对真假两),并可能使用一些高阶谓词技巧来避免编写大量的样板文件 - 但实现的核心是您明确地声明什么是错误的,什么是真的,其余是未知的。

+0

我觉得更合理的定义,以搭上边的情况下会像'(未知,X,Y): - \ +一样(真实,X,Y),\ +一样(假,X,Y).' – awiebe

+0

@尽管有可能会有'像(真,玛丽,约翰)'这样的机会。像(假,玛丽,约翰)',可能是偶然。一般来说,如果对“纯”数据和相关逻辑有单独的谓词,我认为更容易推理它 –

1

到目前为止所说的话是非常正确的:Prolog在所谓的下运行Closed  世界假设  (CWA)。不过,除了已发布的内容之外,我想提供一个互补的视角。

首先,Prolog程序甚至可以不终止,所以我们可能永远不会得到你所提到的可能的答案要么

但即使确实程序终止,我们可以仍然获得既不等同于true也不false答案。

例如,使用GNU序言:

 
| ?- X #\= 3. 

X = _#2(0..2:[email protected]) 

此处,答案是一个悬而未决约束,即比目鱼说,因为它的道理没有明确确定的目标。

这样的答案可能会或可能不会描述的解决方案。

例如:

 
| ?- 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的系统才能真正给出答案,其真相并不 不仅,但另外不能被 确定。

相关问题