我对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']).
答案 0 :(得分: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).
作为奖励,您的单词标有初始字符。
但正如我所说,在许多层面都感觉不对。
答案 1 :(得分: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]].