Prolog中的列表列表

时间:2013-06-10 14:01:53

标签: prolog

我对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']).

2 个答案:

答案 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]].