prolog能否回答“待定”而不是“是”或“否”?

prolog能否回答“待定”而不是“是”或“否”?,prolog,ternary-search,existential-operator,Prolog,Ternary Search,Existential Operator,假设我有知识库 likes(john,mary). person(mary). person(john). 如果我们问prolog |?- likes(mary,john) 它将回答“否”,因为我们没有断言这一点。有没有办法让prolog的答案未知,除非我们明确说明 \+ likes(mary,john) 换句话说,我们可以要求prolog尽可能地处理未绑定表达式而不是false。我一直在使用IDP系统,它允许存在量化,并将未断言的关系视为未绑定的关系,而不是错误的关系,但我想使用更主流的

假设我有知识库

likes(john,mary).
person(mary).
person(john).
如果我们问prolog

|?- likes(mary,john)
它将回答“否”,因为我们没有断言这一点。有没有办法让prolog的答案未知,除非我们明确说明

\+ likes(mary,john)
换句话说,我们可以要求prolog尽可能地处理未绑定表达式而不是false。我一直在使用IDP系统,它允许存在量化,并将未断言的关系视为未绑定的关系,而不是错误的关系,但我想使用更主流的东西。

例如,在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使用的是封闭世界假设,即询问一个事实是否真实意味着我们询问是否知道它是真实的-a
no
意味着我们不知道它是否真实,而不是它是否虚假。当然,作为一种图灵完全语言,您可以模拟一个开放的世界,比如:

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

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

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

首先,Prolog程序甚至可能不会终止,因此我们可能永远不会收到您提到的任何一个可能的答案

但即使程序确实终止,我们仍然可能得到既不等于
也不等于
的答案

例如,使用GNU Prolog:

| ?- X #\= 3. X = _#2(0..2:4..127@) |?-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_全部不同([X,Y,Z]),fd_域([X,Y,Z],0,1)。 X=35; 2(0..1) Y=20(0..1) Z=35; 50(0..1) 对 在这种情况下,不存在解决方案!要看到这一点,我们需要显式搜索它们:

| ?- fd_all_different([X,Y,Z]), fd_domain([X,Y,Z], 0, 1), fd_labeling([X,Y,Z]). no |?-fd_所有不同([X,Y,Z]),fd_域([X,Y,Z],0,1), fd_标记([X,Y,Z])。 不 因此,在上面的例子中,用
maybe
而不是
yes
来回答可能更明智

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


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

你知道vs吗?你是说Prolog只能回答封闭系统吗?因为我想你可以说我要求它可以考虑一个开放的系统,或者它在这方面是有限的,我应该尝试一种不同的语言。<代码>喜欢(玛丽,约翰)会成功,因为<代码>玛丽< /COD>和<代码>约翰<代码>是人。这就是你的第二条所说的。我不是这里的专家,但就我所知和使用标准Prolog是一个封闭的世界。我读到过有目的的扩展和用Prolog研究开放世界系统的文章,但我从来没有和他们合作过,不能再说更多了。因为可能有一个附加包改变了Prolog的工作方式,而我并不知道,所以我将在这里等待更多有知识的人响应。
person(X),person(Y):-likes(X,Y)。
不是有效的语法。我不确定你的意思。我认为一个更合理的定义来捕捉边缘情况应该是
like(未知,X,Y):-\+like(真,X,Y),\+like(假,X,Y)。
@awiebe-yep,这就澄清了问题-尽管仍然有可能出现
like(真,玛丽,约翰)。比如(错,玛丽,约翰)
,可能是偶然的。一般来说,如果“纯”数据和相关逻辑有单独的谓词,我发现更容易对此进行推理