functor([a1-b1,a2-b2,a3-b3,a4-b4]).
我需要将 a 和 b 分开并构造新的两个仿函数,例如
functora([a1,a2,a3,a4]),
functorb([b1,b2,b3,b4])
lambda
使用此处http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/lambda.pl找到的 SWI-Prolog 和模块,您可以编写:
:- use_module(library(lambda)).
separate(In, Out1, Out2) :-
In =.. [_,L],
maplist(\X^Y^Z^(X = Y-Z), L, L1, L2),
Out1 =..[functora, L1],
Out2 =..[functorb, L2].
library( pairs ) 具有您需要的内置功能:
?- pairs_keys_values([a1-b1,a2-b2,a3-b3,a4-b4],A,B).
然后您可以重用 A,B 作为新仿函数的参数。
这可能不是非常有效,但这是一个想法。
?- findall(A, member(A-B, [a1-b1,a2-b2,a3-b3,a4-b4]), As).
As = [a1, a2, a3, a4].
我们可以以此为基础:
separate(Functor, Aside, Bside) :-
Functor =.. [Name, Arg],
findall(A, member(A-B, Arg), As),
findall(B, member(A-B, Arg), Bs),
atom_concat(Name, '_a', AFunctor),
atom_concat(Name, '_b', BFunctor),
Aside =.. [AFunctor, As],
Bside =.. [BFunctor, Bs].
看起来它有效:
?- separate(functor([a1-b1,a2-b2,a3-b3,a4-b4]), A, B).
A = functor_a([a1, a2, a3, a4]),
B = functor_b([b1, b2, b3, b4]).
虽然只在一个方向上起作用。
编辑findall/3
您还可以通过使用上面的@Boris 谓词来避免效率低下:
separate(Functor, Aside, Bside) :-
Functor =.. [Name, Arg],
atom_concat(Name, '_a', AFunctor),
atom_concat(Name, '_b', BFunctor),
sep_dash(Arg, As, Bs),
Aside =.. [AFunctor, As],
Bside =.. [BFunctor, Bs].