Как мне создать и использовать словарь в прологе? - PullRequest
1 голос
/ 04 октября 2019

У меня есть Prolog список

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

, который я хотел бы преобразовать в словарь, подобный этому

{'EU':['A1','A2'], 'I':['A1']}
  1. Как мнесоздать словарь пролога (я использую swipl)

  2. Как получить доступ к ключам и значениям

  3. Как добавить / удалить термины?

Ответы [ 2 ]

3 голосов
/ 05 октября 2019
Библиотека

( пар ) предлагает готовое решение вашей проблемы. Большая часть кода нужна только для адаптации к формату, используемому в вопросе:

?- [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']].
2 голосов
/ 05 октября 2019

Dicts в 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']}.

Чтобы присоединиться к 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']}.
...