functor([a1-b1,a2-b2,a3-b3,a4-b4]).
aとbを分離し、次のような新しい2つのファンクターを構築する必要があります。
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]).
ただし、一方向にしか機能しません。
上記の@Borisfindall/3
の述語を使用して、の非効率性を回避することもできます。
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].