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

时间:2017-12-17 21:03:52

标签: 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)停止程序(+返回false)如果parent(X,Y)失败,则在规则#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的程序,但实际上,它在第一个规则的parent(X,Y)处失败,并尝试满足第二个,并且返回true为Z=='mother'

感谢。

2 个答案:

答案 0 :(得分:0)

所以你想要

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 ).

答案 1 :(得分:0)

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

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

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

parentRole现在只有一条规则,因此如果parent失败,它会立即失败。