好吧,你有几个选择。
在这种特殊情况下,我会质疑您的设计。与其将上一个和下一个都放在标尺上,您可以只放下一个并使用规则来查找上一个:
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 中。
总之:
- 更喜欢不会导致此问题的表示
- 如果强制,请使用特殊值