首页 文章

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

提问于
浏览
3

我有一个事实:

loves(romeo, juliet).

然后我有'或'规则:

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

你可以看到舞者的事实不存在,但这应该没有问题,舞蹈(juliet)应该让我真实 . 相反,它让我回归真实,然后抛出一个关于舞者事实的例外异常 . Is there a way to write rules for non existent facts or rules? Do I need to check if the fact exists?

3 回答

  • 3

    要实现"failure if not existant",可以使用指令 dynamic/1 声明谓词 dynamic .

    例如:

    :- dynamic dancer/1.
    

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

    ?- dances(X).
    X = juliet .
    

    并没有错误 .

  • 5

    据我所知,没有办法使用不存在的谓词 . 您可以使用this question中描述的方法检查规则是否存在,或者您可以使用某种占位符来确保它存在 does . 如果规则始终为false,则规则似乎不太有用,因此在使用之前只需编写几个真实案例 .

    dancer(someone). %% To make sure that fact exists 
    
    loves(romeo, juliet).
    dances(juliet) :- loves(romeo, juliet).
    dances(juliet) :- exists(dancer), dancer(juliet).
    
  • 1

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

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

    如果谓词存在,那将运行 dancer(juliet) ,否则将失败,否则将失败 .

    我不会说这是一个非常明智的事情 .

相关问题