微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Prolog“切换”语句

如何解决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 举报,一经查实,本站将立刻删除。