为复杂的标题道歉,但我想要做的事情的要点是我有一堆哈希表/关联列表,其中包含一串键,每个键对应一个列表。
我的问题在于我基本上想要创建一个谓词,将一个项目附加到一个键的列表,但该键可能甚至没有创建一个列表(整个键 - >值对可能不均匀)我不知道如何说get_assoc
,但是如果没有列表,则创建它然后附加它,否则只需将它附加到从get_assoc
返回的列表中。
那么如果一个列表尚不存在,我将如何创建列表呢?我不确定我是否以Prolog的心态看待这个问题,所以如果有必要,请随时指出我的方向。
答案 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-[...]].