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

时间:2017-05-21 19:41:03

标签: prolog rule fact

我有一个事实:

loves(romeo, juliet).
然后我有一个'或'规则:

dances(juliet) :- loves(romeo, juliet).
dances(juliet) :- dancer(juliet).

你可以看到舞者的事实不存在,但这应该没问题,舞蹈(juliet)应该让我回归真实。相反,它让我回归真实,然后抛出一个关于舞者事实的例外异常。 有没有办法为不存在的事实或规则编写规则?我是否需要检查事实是否存在?

3 个答案:

答案 0 :(得分:5)

要实现“如果不存在则失败”,您可以使用指令dynamic/1声明谓词动态

例如:

:- dynamic dancer/1.

如果将此指令添加到程序中,则会得到:

?- dances(X).
X = juliet .

并且没有错误。

答案 1 :(得分:3)

据我所知,没有办法使用不存在的谓词。您可以使用this question中描述的方法检查规则是否存在,或者您可以使用某种占位符来确保确实存在。如果规则总是假的,那么规则似乎并不是非常有用,所以在使用之前只需写下几个真实案例。

dancer(someone). %% To make sure that fact exists 

loves(romeo, juliet).
dances(juliet) :- loves(romeo, juliet).
dances(juliet) :- exists(dancer), dancer(juliet).

答案 2 :(得分:1)

从技术上讲,你可以这样做:

dances(juliet) :- catch(dancer(juliet), 
                        error(existence_error(procedure, dancer/1), _),
                        false
                  ).

如果谓词存在,则会运行dancer(juliet),如果不存在则会失败,否则会出错。

我不会说这是一件非常明智的事情。