Ассоциативный список в Прологе - PullRequest
0 голосов
/ 31 декабря 2018

я делаю ассоциативный список в прологе Я видел эту тему, но я не понимаю код.

Ассоциативные списки в прологе

Для проверки списка ассоциативно недостаточно сделать это:

 lists([_X, _Y]).
 lists([[H|_T]|L],[H|T]):- lists(L,T).

Потому что для первого / 1 я проверяю, есть ли элемент таким образом [a, 3] и / 2 беру список списка [[a, 4], [a, 3]] в этом случае.поэтому сначала передайте список вызовов / 2 на [a, 3] и проверьте true для базового случая, а после вызова [a, 4] и вызовите true для базового случая.

Я что-то не так, но не вижу,

Кто-нибудь может мне помочь?


Обновление OP от 2019-01-01 10: 40: 47Z:

Я пытаюсь разрешить таким образом:

islist([_X,_Y]).
islist([_X|T]):- islist(T).

В этом случае принимайте только ввод таким образом

[[k,v],[k,v],[k,v]]

, но принимайте все вводные данные следующим образом:

  • [a]
  • [k, v, v, v]
  • [[k, v], [k, v], [k, v,v]]

Так что моя проблема остается.

1 Ответ

0 голосов
/ 01 января 2019

Из связанного вопроса:

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

Просто запишите это в Прологе:

associative_list(L) :- L = [].
associative_list(L) :- K=K, V=V, associative_list(A), L = [[K, V] | A].

Конечно, Пролог как язык программирования имеет как эксплуатационные проблемы, так иего логическая семантика, поэтому последняя строка лучше записывается как

associative_list(L) :- L = [[_K, _V] | A], associative_list(A).

Идиоматический способ написать это

associative_list([]).
associative_list([[_, _] | A]) :- associative_list(A).
...