【问题标题】:How do I get a list from an association list in Prolog, and then either append to it or create it if it doesn't exist?如何从 Prolog 中的关联列表中获取列表,然后附加到它或者如果它不存在则创建它?
【发布时间】:2015-09-17 01:04:10
【问题描述】:

为令人费解的标题道歉,但我想要做的主要是我有一个带有一堆键的哈希表/关联列表,每个键对应一个列表。

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

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

【问题讨论】:

  • 听起来你更根本的问题是你不知道你想如何表示你的哈希表?你还没有展示你的哈希表是什么样子的。
  • 首先,决定你需要什么:哈希表、RB-tree、AVL-tree。然后检查这些是否已经在库中可用。在 SWI-Prolog 中,标准库中至少有(连同完整源代码)RB-trees(可回溯和不可回溯)和 AVL-tree。

标签: prolog swi-prolog logic-programming


【解决方案1】:

如果列表尚不存在,我将如何创建列表?

由于 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-[...]].

【讨论】:

    猜你喜欢
    • 2013-12-07
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 2011-03-06
    • 2010-11-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    相关资源
    最近更新 更多