0

私はリストを持っています

[a,a,a,a,b,b]

私の目的は、それを分割することです

[[a,a,a,a],[b,b]]

これまでに実装した述語

split1([],[]).
split1([A1|T],[[H1,H2]|B]):-
A1=[H1,H2],
H1=H2,
split(T,B).

split1([],[]).
split1([A1|T],[[H1,H2]|B]):-
A1=[H1,H2],
H1\=H2,
split(T,B).

初心者の質問学習のプロローグで申し訳ありません。

4

4 に答える 4

1

のSWI-Prolog 実装をgroup_pairs_by_key/2見てください。必要以上のことをしますが、不要な部分を省きやすいと思います。

現時点で述語を使用すると、次のことができます。

?- L = [a,a,b,b,a,b,b],
   keys_values_pairs(L, L, P),
   group_pairs_by_key(P, G),
   keys_values_pairs(_, Result, G).
L = [a, a, b, b, a, b, b],
P = [a-a, a-a, b-b, b-b, a-a, b-b, b-b],
G = [a-[a, a], b-[b, b], a-[a], b-[b, b]],
Result = [[a, a], [b, b], [a], [b, b]].

したがって、キーと値のペアを必要とせず、単一の値のみを必要とする述語を取得するには、何を除外するかを理解する必要があります。これは明らかに宿題なので、答えに十分な努力さえしていないので、これは演習として残します.

于 2015-11-09T13:49:21.057 に答える
1

簡単な定義:

groups([X|Xs],[G|Gs]) :- take(X,Xs,G,Rs), groups(Rs, Gs).
groups([],[]).

take(X,[X|R],[X|G],S) :- !, take(X,R,G,S).
take(X,R,[X],R).

take/4 は一致する要素を消費して保存し、残りをグループに残します

于 2015-11-09T14:38:58.633 に答える