2
functor([a1-b1,a2-b2,a3-b3,a4-b4]).

aとbを分離し、次のような新しい2つのファンクターを構築する必要があります。

functora([a1,a2,a3,a4]),
functorb([b1,b2,b3,b4])
4

4 に答える 4

3

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].
于 2013-03-22T20:57:01.913 に答える
2

たとえば=..、ファンクターの構築と分解に使用できます(ここを参照)。原子を分割するには、統合を使用できます。

sep_dash([A-B|Rest], [A|As], [B|Bs]) :- sep_dash(Rest,As,Bs).
sep_dash([],[],[]).

私はそれを行うためのいくつかの賢い方法があると確信していますが。一般に、これらは原子操作用のSWI-Prologビルトインです。

于 2013-03-22T18:34:54.577 に答える
1

library(pairs)には、必要な組み込みがあります。

?- pairs_keys_values([a1-b1,a2-b2,a3-b3,a4-b4],A,B).

次に、A、Bを新しいファンクターの引数として再利用できます。

于 2013-03-22T21:06:32.587 に答える
0

これはおそらくそれほど効率的ではありませんが、それはアイデアです。

?- 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].
于 2013-03-22T20:17:28.817 に答える