Ассоциативные списки в прологе - PullRequest
0 голосов
/ 27 апреля 2018

Моя задача - реализовать карты со списками. Мы определили ассоциативные списки следующим образом:

[] это список, k - это ключ, v - это значение и a - это ассоциативный список, тогда [[k, v] | a] - это ассоциативный список.

так что теперь я должен написать предикат, в котором он проверяет, является ли данный аргумент ассоциативным списком. например:

?- test([[a,5]]). -> true., ?- test([[1],[2]]). -> false.

Я действительно в отчаянии, я надеюсь, что кто-то может помочь мне там

привет

1 Ответ

0 голосов
/ 28 апреля 2018

Могу сказать, что ассоциативные списки в SWI-Prolog реализованы как AVL-деревья, а не как списки из пунктирных пар, хотя последнее возможно.

Итак, попробуем.

[] это список, k это ключ, v это значение и a это ассоциативный список, тогда [[k, v] | а] является ассоциативным списком.

Одна поправка:

Я бы предложил [[ k | v ] | a], который является более компактным и "более ассоциативным")

is_assoc([]).
is_assoc([[K|V] | AL]) :- %corrected 29 apr 2018 19:00 gmt+3
    !, is_assoc( AL ).


put(KV, AL, AL0) :-
   KV = [K|V],
   get(K, AL, V),
   remove(KV, AL, AL_KV),
   put(KV, AL_KV, AL0).

put(KV, AL, [KV | AL]).

get(K, AL, V):-
   member([K|V], AL).
...