【问题标题】:Can prolog answer undetermined instead of just yes or no?prolog 可以回答未确定的而不是只是是或否吗?
【发布时间】: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) 会成功,因为maryjohn 是人​​。这就是你的第二个子句所说的。
  • 我不是这里的专家,但据我所知和使用它,标准 Prolog 是一个封闭的世界。我已经阅读了使用 Prolog 对开放世界系统进行的有目的的扩展和研究,但我从未与他们合作过,不能多说。由于可能有一个附加包改变了我不知道的 Prolog 的工作方式,我将在这里等待更多知识渊博的人作出回应。
  • person(X),person(Y) :-likes(X,Y). 不是有效的语法。不知道你的意思。

标签: prolog ternary-search existential-operator


【解决方案1】:

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

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

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

【讨论】:

  • 我认为捕捉边缘情况的更合理定义是like(unknown, X, Y):- \+like(true, X, Y),\+like(false, X, Y).
  • @awiebe 是的,这清除了它 - 尽管仍然有机会拥有like(true, mary, john). like(false, mary, john),可能是偶然的。一般来说,如果“纯”数据和相关逻辑有单独的谓词,我发现它更容易推理
【解决方案2】:

到目前为止所说的非常正确: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 系统确实可以给出答案,其真实性不仅不是,而且无法被确定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 2012-04-11
    • 2020-03-17
    • 1970-01-01
    相关资源
    最近更新 更多