如何从Prolog中的关联列表中获取列表,然后附加到它或创建它(如果它不存在)?

时间:2015-09-17 01:04:11

标签: prolog swi-prolog logic-programming

为复杂的标题道歉,但我想要做的事情的要点是我有一堆哈希表/关联列表,其中包含一串键,每个键对应一个列表。

我的问题在于我基本上想要创建一个谓词,将一个项目附加到一个键的列表,但该键可能甚至没有创建一个列表(整个键 - >值对可能不均匀)我不知道如何说get_assoc,但是如果没有列表,则创建它然后附加它,否则只需将它附加到从get_assoc返回的列表中。

那么如果一个列表尚不存在,我将如何创建列表呢?我不确定我是否以Prolog的心态看待这个问题,所以如果有必要,请随时指出我的方向。

1 个答案:

答案 0 :(得分:0)

  

那么如果一个列表尚不存在,我将如何创建列表呢?

由于Prolog变量不可更新(嗯,有异常......),因此总是假设需要创建列表,传入当前容器并从输出变量中获取更新的容器。

一个例子:

:- use_module(library(assoc)).

chars_pos(Cs, Ps) :-
    empty_assoc(E),
    chars_pos(Cs, 1, E, Ps).

chars_pos([], _, Ps, Ps).
chars_pos([C|Cs], P, Pc, Ps) :-
    append_char(C, P, Pc, Pt),
    Q is P+1,
    chars_pos(Cs, Q, Pt, Ps).

append_char(C, P, Pc, Pu) :-
    ( get_assoc(C, Pc, Lc) -> Lu = [P|Lc] ; Lu = [P] ),
    put_assoc(C, Pc, Lu, Pu).

测试

?- atom_chars('hello world', Cs), chars_pos(Cs, Ps), assoc_to_list(Ps, Ls).
Cs = [h, e, l, l, o, ' ', w, o, r|...],
Ps = t(h, [1], >, t(d, [11], -, t(' ', [6], -, t, t), t(e, [2], -, t, t)), t(o, [8, 5], >, t(l, [10, 4, 3], -, t, t), t(w, [7], <, t(r, [9], -, t, t), t))),
Ls = [' '-[6], d-[11], e-[2], h-[1], l-[10, 4, 3], o-[8, 5], r-[9], w-[...]].