如果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'
感谢。
答案 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
失败,它会立即失败。