Lambda 高阶Prolog中更复杂的目标

Lambda 高阶Prolog中更复杂的目标,lambda,functional-programming,prolog,higher-order-functions,Lambda,Functional Programming,Prolog,Higher Order Functions,让我举一个具体的例子来解释我的问题: 给定一个列表LoL和一个列表Ex,从中减去Ex后,构造包含LoL所有元素(子列表)的X 举个例子: ?- my_exclude([[1, 2, 3], [1], [3, 4]], [2, 3], X). X = [[1], [1], [4]]. 我知道我可以从列表库中使用subtract/3,但我不知道如何实现这种映射 我知道地图列表,但我不知道如何利用它 我可能缺少的是某种map谓词,它将LoL转换为X,同时对每个元素应用一个操作,该操作是Ex的减法 我

让我举一个具体的例子来解释我的问题:

给定一个列表
LoL
和一个列表
Ex
,从中减去
Ex
后,构造包含
LoL
所有元素(子列表)的
X

举个例子:

?- my_exclude([[1, 2, 3], [1], [3, 4]], [2, 3], X).
X = [[1], [1], [4]].
我知道我可以从
列表
库中使用
subtract/3
,但我不知道如何实现这种映射

我知道地图列表,但我不知道如何利用它

我可能缺少的是某种
map
谓词,它将
LoL
转换为
X
,同时对每个元素应用一个操作,该操作是
Ex
的减法

我如何才能做到这一点,而不用在较低级别上“手动”递归地实现它?


(换句话说,也许我在寻找lambdas,它在标准Prolog中似乎不存在)

您需要为列表中的每个
Li
调用
L
来生成结果列表中的
Ri

可以将lambda表达式用于:

my_排除(L、E、R):-
映射列表({E}/[Li,Ri]>>减去(Li,E,Ri),L,R)。

因此,这里的
{E}/[Li,Ri]>
是一个目标,有两个变量
Li
Ri
,当调用时,将调用
subtract(Li,E,Ri)
其中
E
是我们想要排除的元素列表。

感谢您修正了我糟糕的措辞,并清楚地解释了这个问题。我以前见过这种lambda表达式——它是标准的吗?我正在使用SWI prolog编码,但代码也必须在SICStus中运行。@bp99:它是yall库的一部分:因此,如果在SICStus prolog中没有隐式执行此操作,则可以导入此库。@bp99这是Logtalk lambda表达式语法(该语法可用于所有受支持的后端系统,包括SICStus prolog)。它也可以在SWI Prolog中使用
library(yall)
。这太神奇了,这种语法似乎非常有用。谢谢。@WillemVanOnsem应该是
{E}/[Li,Ri]>>减去(Li,E,Ri)
。lambda表达式中的所有变量都应声明为自由变量或lambda参数。
my_exclude(L, E, R) :-
    maplist({E}/[Li, Ri]>>subtract(Li, E, Ri), L, R).