我对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)
作为奖励,您的单词标有初始字符.
但正如我所说,这在许多层面都感觉不对.