Prolog 包装列表中的每个元素

Prolog 包装列表中的每个元素,prolog,maplist,Prolog,Maplist,如何包装列表中的每个元素 我有这样的东西(2*3*4*…)^6 如何使用此输出制作列表:2^6*3^6*4^6*… 我在考虑使用maplist做一些简单的事情,但是我不确定如何在第一个参数中向函数发送参数 simplify(X^Y,R):- X=..[*|Args], maplist(?^Y, Args, Args2), R=..[*|Args2], !. :- simplify((2*x)^6, (2^6) * (x^6)). %should be true 顺便说一句,使用Swi pro

如何包装列表中的每个元素

我有这样的东西
(2*3*4*…)^6

如何使用此输出制作列表:
2^6*3^6*4^6*…

我在考虑使用maplist做一些简单的事情,但是我不确定如何在第一个参数中向函数发送参数

simplify(X^Y,R):- X=..[*|Args], maplist(?^Y, Args, Args2), R=..[*|Args2], !.

:- simplify((2*x)^6, (2^6) * (x^6)). %should be true

顺便说一句,使用Swi prolog时,您的输入数据结构不包含任何列表,它是一个嵌套结构,叶子上有数字:

?- write_canonical(2*3*4*5).
*(*(*(2, 3), 4), 5)
因此,maplist在这里没有多大用处。相反,编写一个简单的递归谓词来遍历(并重建)递归数据结构:

simplify(N, Exp, N^Exp) :-
    number(N).
simplify(L*R, Exp, LExp*RExp) :-
    simplify(L, Exp, LExp),
    simplify(R, Exp, RExp).
代码结构遵循数据结构。示例运行

?- simplify(2*3*4*5, 6, E).
E = 2^6*3^6*4^6*5^6
Yes (0.00s cpu)
可能想看看哪一个提供了lambda抽象。否则,您需要创建一个谓词来传递到
maplist/3