如何解决Prolog“切换”语句
如何实现与嵌套的 if_
集等效的 switch 语句?
理想情况下是这样的(不要介意语法):
compatible(X,Y) :-
switch X
a1 -> dif(Y,b2),a2 -> dif(Y,c2),dif(Y,c3),_ -> true
工作方式与此相同:
compatible(X,Y) :-
if_(X = a1,if_(X = a2,(dif(Y,c3)),true
)
).
解决方法
:- module(switch_,[]).
:- use_module(library(reif)).
:- multifile goal_expansion/2.
user:goal_expansion(switch_(X,;(->(H,C),T)),if_(X = H,C,switch_(X,T))).
user:goal_expansion(switch_(X,->(H,C)),fail)).
user:goal_expansion(switch_(_,true),true).
user:goal_expansion(switch_(_,false),false).
:- use_module(switch_).
likes(A,B) :-
switch_(A,(
john -> B = mary ;
mary -> dif(B,john) ;
true
)).
示例
?- likes(A,B).
A = john,B = mary ;
A = mary,dif(B,john) ;
dif(A,mary),dif(A,john).
?- likes(mary,B).
dif(B,john).
?- likes(john,B).
B = mary.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。