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:如果规则中的一个规则失败,那么停止该程序,否则通常工作的主要内容,如果未能解决你的问题,请参考以下文章