在Prolog中使用具有不同/不存在事实的OR运算符



我有一个事实:

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)运行,如果不存在,则失败,否则将出错。

不过,我不会说这是一件非常可取的事情。

最新更新