Prolog:如果规则中的一个规则失败,那么停止该程序,否则通常工作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Prolog:如果规则中的一个规则失败,那么停止该程序,否则通常工作相关的知识,希望对你有一定的参考价值。

如果Prolog中有任何内置工具可用于以下示例,对我来说很有意思:

parentRole(X,Y,Z):- parent(X,Y), male(X), !, Z=='father', !.
parentRole(X,Y,Z):- parent(X,Y), Z=='mother'.

如果parent(X,Y)失败,我希望规则parent(X,Y)停止程序(+返回false),在规则#1中,否则继续执行。

这样我就可以写:

parentRole(X,Y,Z):- parent(X,Y), male(X), !, Z=='father', !.
parentRole(X,Y,Z):- Z=='mother'.

假设事实是:

parent(myMom, i) male(i)

我希望范围:

parentRole(notMyMom, i, 'mother')

停止并返回false的程序,但实际上,它在第1个规则中的parent(X,Y)失败,并试图满足第2个,它返回true为Z=='mother'

谢谢。

答案

所以你要

parentRole(X,Y,Z) :-
  ( parent(X,Y) ->
    ( male(X) -> Z == 'father'
    ; Z == 'mother' ).
  ; fail ).

这是一样的

parentRole(X,Y,Z) :-
  parent(X,Y),
  ( male(X) -> Z == 'father' ; Z == 'mother' ).

现在你的例子失败了,正如所料。

您的评论:尝试此格式

parentRole(X,Y,Z) :-
  ( parent(X,Y) ->
    ( male(X) ->
      ( Z == 'father' ->
        write('father')
      ; fail )
    ; ( Z == 'mother' ->
        write('mother')
      ; fail ) )
  ; fail ).
另一答案

定义一个验证性别的单独规则是有意义的。

parentRole(X, Y, Z) :- parent(X, Y), parentGender(X, Z).

parentGender(X, 'father') :- male(X).
parentGender(X, 'mother') :- \+ male(X).

parentRole现在只有一条规则,所以如果parent失败,它将立即失败。

以上是关于Prolog:如果规则中的一个规则失败,那么停止该程序,否则通常工作的主要内容,如果未能解决你的问题,请参考以下文章

Firestore:如果规则失败,如何停止创建用户帐户? [复制]

在prolog中将两个列表映射在一起

使用Prolog规则在查询中显示给定列表的第一个元素?

prolog 阶段总结

数据记录分层

rsyslog