如何在序言中创建和使用字典?

时间:2019-10-04 18:51:13

标签: prolog swi-prolog

我有一个Prolog列表

[['A1', 'I'], ['A1', 'EU'], ['A2', 'EU']]

我想将其转换成这样的字典

{'EU':['A1','A2'], 'I':['A1']}
  1. 如何创建序言字典(我正在使用swipl)

  2. 如何访问键和值

  3. 如何添加/删除条款?

2 个答案:

答案 0 :(得分:3)

library(pairs)为您的问题提供了现成的解决方案。只需大多数代码即可适应问题中使用的格式:

?- [library(pairs)].
true.

?- L=[['A1', 'I'], ['A1', 'EU'], ['A2', 'EU']]
|    , findall(B-A,member([A,B],L),Ps),group_pairs_by_key(Ps,G).
L = [['A1', 'I'], ['A1', 'EU'], ['A2', 'EU']],
Ps = ['I'-'A1', 'EU'-'A1', 'EU'-'A2'],
G = ['I'-['A1'], 'EU'-['A1', 'A2']].

答案 1 :(得分:2)

SWI-Prolog中的标记有一个“标记”,您可以用它来表示字典的种类,因为某些谓词只有在标记统一后才能成功。例子:

point{x: 0, y:0}
json{status: 200, data: [1, 2, 3]}
_{key: variable}

要获取值,可以使用三种方法,使用任一get的好处是,如果键不存在,它将失败,而如果键不存在,则更常见的表示法将引发错误。

?- _D = _{'EU':['A1', 'A2'], 'I': ['A1']}, A = _D.'I'.
A = ['A1'].

?- _D = _{'EU':['A1', 'A2'], 'I': ['A1']}, A = _D.get('I').
A = ['A1'].

?- _D = _{'EU':['A1', 'A2'], 'I': ['A1']}, A = get(_D, 'I').
A = ['A1'].

要设置值,有两种方法:

?- _D1 = _{'EU':['A1', 'A2'], 'I': ['A1']}, D = _D1.put('I', ['A2']).
D = _{'EU':['A1', 'A2'], 'I': ['A2']}.

?- _D1 = _{'EU':['A1', 'A2'], 'I': ['A1']}, D = put(_D1, 'I', ['A2']).
D = _{'EU':['A1', 'A2'], 'I': ['A2']}.

加入字典就是将其中一个放入另一个:

?- _D1 = _{'EU':['A1', 'A2'], 'I': ['A1']}, D = _D1.put(_{'I': ['A2']}).
D = _{'EU':['A1', 'A2'], 'I': ['A2']}.

CapelliC的答案使您到达了成对列表的位置,所有对都正确分组,SWI-Prolog提供了一个有用的谓词,用于在成对和字典之间切换:

?- _L = [['A1', 'I'], ['A1', 'EU'], ['A2', 'EU']]
|    , findall(B-A,member([A,B], L), _Ps),group_pairs_by_key(_Ps, _G),
|    , dict_pairs(Dict, _, _G).
Dict = _{'EU':['A1', 'A2'], 'I': ['A1']}.