1

我正在尝试学习Prolog,看来知识的完整性很重要,因为显然如果知识库没有事实,或者事实不正确,都会影响查询结果。我想知道如何最好地处理一个事实的未知细节。例如,

%life(<name>,<birth year>,<death year>)
%ruler(<name>,<precededBy>,<succeededBy>)

我添加到知识库中的一些人仍然活着,因此他们的死亡年份是未知的。在统治者的例子中,第一位统治者没有前任,当前统治者没有继任者。如果有这些未知数,我应该输入某种未知的标志值还是可以省略细节。就统治者而言,不知道前任的事实会是这样吗?

ruler(great_ruler,,second_ruler).
4

1 回答 1

1

好吧,你有几个选择。

在这种特殊情况下,我会质疑您的设计。与其将上一个和下一个都放在标尺上,您可以只放下一个并使用规则来查找上一个:

ruler(great_ruler, second_ruler).
ruler(second_ruler, third_ruler).

previous(Ruler, Previous) :- ruler(Previous, Ruler).

这个谓词将简单地失败great_ruler,这可能是合适的——毕竟在他们之前没有任何人。

在其他情况下,它可能并不简单。因此,您必须决定是否要为未知数显式值或使用变量。基本上,你想这样做:

ruler(great_ruler, unknown, second_ruler).

或者你想这样做:

ruler(great_ruler, _, second_ruler).

在第一种情况下,您可能会得到虚假的答案unknown,除非您编写一些自定义逻辑来捕捉它。但我实际上认为第二种情况更糟,因为那个空变量会与任何东西统一,所以很多查询会产生奇怪的结果:

ruler(_, SucceededHimself, SucceededHimself)

会成功,例如, unifying SucceededHimself = second_ruler,这可能不是你想要的。var/1您可以使用and来检查变量ground/1,但此时您正在篡改 Prolog 的搜索,它会变得更加复杂。NULL因此,空白变量不像您希望的那样在 SQL 中。

总之:

  • 更喜欢不会导致此问题的表示
  • 如果强制,请使用特殊值
于 2017-10-24T15:42:25.347 回答