我有一个事实:
loves(romeo, juliet).
然后我有一个"或"规则:
dances(juliet) :- loves(romeo, juliet).
dances(juliet) :- dancer(juliet).
正如你所看到的,舞者的事实不存在,但这应该没有问题,舞蹈(朱丽叶(应该让我回归真实。相反,它返回我 true,然后抛出一个关于舞者事实的异常。有没有办法为不存在的事实或规则编写规则?我需要检查事实是否存在吗?
要实现"如果不存在则失败",您可以使用指令 dynamic/1
声明谓词动态。
例如:
:- 动态舞者/1.
如果将此指令添加到程序中,则会得到:
?- 舞蹈(X(。X = 朱丽叶 .
并且没有错误。
据我所知,没有办法使用不存在的谓词。您可以使用此问题中描述的方法检查规则是否存在,也可以使用某种占位符来确保它确实存在。如果规则总是假的,它似乎不是很有用,所以在使用它之前,只需写几个真实的案例。
dancer(someone). %% To make sure that fact exists
loves(romeo, juliet).
dances(juliet) :- loves(romeo, juliet).
dances(juliet) :- exists(dancer), dancer(juliet).
从技术上讲,您可以执行以下操作:
dances(juliet) :- catch(dancer(juliet),
error(existence_error(procedure, dancer/1), _),
false
).
如果谓词存在,它将dancer(juliet)
运行,如果不存在,则失败,否则将出错。
不过,我不会说这是一件非常可取的事情。