如何处理 Prolog 中的关联数组?
How to handle associative arrays in Prolog?
我有一个 Prolog
列表
[['A1', 'I'], ['A1', 'EU'], ['A2', 'EU']]
我想把它变成这样的字典
{'EU':['A1','A2'], 'I':['A1']}
如何创建 prolog 字典(我正在使用 swipl)
如何访问键和值
如何add/remove条款?
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']].
SWI-Prolog 中的字典有一个 "tag",你可以用它来表示字典的种类,因为一些谓词只有在标签统一时才会成功。示例:
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']}.
加入dicts就是将一个放入另一个:
?- _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']}.
我有一个 Prolog
列表
[['A1', 'I'], ['A1', 'EU'], ['A2', 'EU']]
我想把它变成这样的字典
{'EU':['A1','A2'], 'I':['A1']}
如何创建 prolog 字典(我正在使用 swipl)
如何访问键和值
如何add/remove条款?
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']].
SWI-Prolog 中的字典有一个 "tag",你可以用它来表示字典的种类,因为一些谓词只有在标签统一时才会成功。示例:
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']}.
加入dicts就是将一个放入另一个:
?- _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']}.