0

Prolog のリストのリストに問題があります。たとえば、次の事実があります。

fact(1, 'hello').
fact(2,  'boy').
fact(3, 'hello').
fact(4, 'girl').

(Character, Id) のようなペアで構成されるリスト:

list([b, 1, b, 2, g, 3, g, 4]).

私の目標は、次のようなリストのリストを返すことです:

newList(['hello', boy'], ['hello', 'girl']).

編集: 最初のリストは、同じキャラクターを共有する複数のリストに分割する必要があります

list([b, 1, b, 2], [g, 3, g, 4]).

次に、キャラクターを削除する必要があります

list([1, 2], [3, 4]).

次のように、id を対応するアトムに置き換えます。

list(['hello', 'boy'], ['hello', 'girl']).
4

2 に答える 2

5

まったく奇妙な質問です。コンテキストを提供することを気にかけている場合は、一般的に、Prolog で物事を行う方法についてより意味のある答えが得られる可能性があります。

ともかく:

まず、これが実際にペアのリストである場合は、次のように表します。

char_id([b-1, b-2, g-3, g-4]).

プログラムでやりたい場合は、

flat_to_pairs([], []).
flat_to_pairs([A,B|Flat], [A-B|Pairs]) :- flat_to_pairs(Flat, Pairs).

次に、次を使用できます。

?- group_pairs_by_key([b-1, b-2, g-3, g-4], G).
G = [b-[1, 2], g-[3, 4]].

次に、ID を対応する単語にマップできます。

collect_words([], []).
collect_words([C-IDs|ID_Groups], [C-Words|Word_Groups]) :-
    maplist(fact, IDs, Words),
    collect_words(ID_Groups, Word_Groups).

おまけとして、あなたの言葉は頭文字でマークされています。

しかし、私が言ったように、これはすべて多くのレベルで間違っていると感じています.

于 2013-06-10T14:53:44.283 に答える
1

さて、ここにプレーンなProlog定義があります

list([], []).
list([S|R], [L|T]) :-
    capture(S, [S|R], L, Q),
    list(Q, T).

capture(S, [S,I|R], [N|Ns], Q) :-
    !, fact(I, N),
    capture(S, R, Ns, Q).
capture(_, Q, [], Q).

注: 手順を正しく行うには、カットが必要です。それは得ます

?- list([b, 1, b, 2, g, 3, g, 4], R).
R = [[hello, boy], [hello, girl]].
于 2013-06-10T15:36:48.937 に答える