Prolog中的列表列表

use*_*718 0 prolog

我对Prolog中的列表列表有疑问.例如,我有这些事实:

fact(1, 'hello').
fact(2,  'boy').
fact(3, 'hello').
fact(4, 'girl').
Run Code Online (Sandbox Code Playgroud)

以及由(Character,Id)这样的对组成的列表:

list([b, 1, b, 2, g, 3, g, 4]).
Run Code Online (Sandbox Code Playgroud)

我的目标是返回这样的列表列表:

newList(['hello', boy'], ['hello', 'girl']).
Run Code Online (Sandbox Code Playgroud)

编辑:第一个列表必须分成更多共享相同字符的列表

list([b, 1, b, 2], [g, 3, g, 4]).
Run Code Online (Sandbox Code Playgroud)

那么,应该删除角色

list([1, 2], [3, 4]).
Run Code Online (Sandbox Code Playgroud)

并用相应的原子替换id,如下所示:

list(['hello', 'boy'], ['hello', 'girl']).
Run Code Online (Sandbox Code Playgroud)

小智 5

一个奇怪的问题.如果您愿意提供一些背景信息,一般来说,您可能会获得有关如何在Prolog中执行操作的更有意义的答案.

无论如何:

首先,如果这确实是对的列表,则表示如下:

char_id([b-1, b-2, g-3, g-4]).
Run Code Online (Sandbox Code Playgroud)

如果你想以编程方式进行,

flat_to_pairs([], []).
flat_to_pairs([A,B|Flat], [A-B|Pairs]) :- flat_to_pairs(Flat, Pairs).
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用:

?- group_pairs_by_key([b-1, b-2, g-3, g-4], G).
G = [b-[1, 2], g-[3, 4]].
Run Code Online (Sandbox Code Playgroud)

然后,您可以将ID映射到相应的单词:

collect_words([], []).
collect_words([C-IDs|ID_Groups], [C-Words|Word_Groups]) :-
    maplist(fact, IDs, Words),
    collect_words(ID_Groups, Word_Groups).
Run Code Online (Sandbox Code Playgroud)

作为奖励,您的单词标有初始字符.

但正如我所说,这在许多层面都感觉不对.