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

接收目标列表作为输入的元谓词

如何解决接收目标列表作为输入的元谓词

我已经实现了以下元谓词,它使用 SWI-Prolog 引擎同时枚举两个或多个可回溯谓词的解决方案。

enumerate(Gs) :-
   maplist(term_variables,Gs,Xs),findall(E,( nth1(I,G),nth1(I,Xs,X),engine_create(X,G,E) ),Es),enumerate_next(Es,Xs).

enumerate_next(Es,Xs) :-
   repeat,(   findall(X,( member(E,engine_next(E,X) ),Xs)
   ->  true
   ;   !,fail ).

使用示例:

?- enumerate([between(1,inf,member(Y,[a,b,c,d,e]),append(Z,W,[1,2,3,4])]).
X = 1,Y = a,Z = [],W = [1,4] ;

X = 2,Y = b,Z = [1],W = [2,4] ;

X = 3,Y = c,Z = [1,2],W = [3,4] ;

X = 4,Y = d,3],W = [4] ;

X = 5,Y = e,4],W = [] ;
false.

我的问题是:我应该如何声明这个元谓词?

解决方法

我觉得应该是

:- meta_predicate enumerate(:).

但是你应该以某种方式处理目标列表的元素:例如

:- module(enumerate,[enumerate/1]).

:- meta_predicate enumerate(:).

enumerate(GsDecl) :-
   strip_module(GsDecl,GsM,Gs),maplist(term_variables,Gs,Xs),findall(E,( nth1(I,G),nth1(I,Xs,X),engine_create(X,GsM:G,E) ),Es),enumerate_next(Es,Xs).

...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。