试图创建一个列表推导。我在这里拥有的内容适用于SWI Prolog和Jekejeke Prolog,但是[<-]运算符在Yap中失败。不知道为什么。
必须创建 between/3、findall/3 和 maplist/2,因为它们不是 Yap 的一部分。我相信这三个自制谓词工作正常(它们在 Jekejeke Prolog 中确实如此)。
Yap 6.2.2 似乎无法处理 [ <- ] 运算符。获取紧接在运算符前面的语法错误。
定义运算符:
:- op(700, xfx, [ <- ]).
:- op(450, xfx, [ .. ]).
:- op(1100, yfx, [ & ]).
创建列表理解模板:
Vs <- M..N :-
integer(M),
integer(N),
M =< N,
betWeen(M, N, Vs).
Vs <- {Var & Dec & Pred} :-
findAll(Var, mapList(call, [Dec, Pred]), Vs).
使用该模板创建从 M 到 N 的素数列表(包括 M)。将列表返回为 P。
primes(M, N, P) :- P <- { X & X <- M..N & prime(X) }.
结束。
尝试了许多不起作用的事情,但是当我将谓词 mapList/2、findAll/3 和 betWeen/3 的定义移动到定义新运算符的同一模块中时,它解决了这个问题。
Yap 中需要这三个谓词,因为与 SWI-Prolog 不同,它们没有提供。也许它们在我没有的图书馆里。