Может кто-нибудь объяснить мне значение вложенных пар в списке Пролога? - PullRequest
0 голосов
/ 17 октября 2018

Я знаю, что списки Пролога не плоские, но являются вложенными парами. Может кто-нибудь объяснить мне, что на самом деле означает?

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

В Прологе непустой список изначально представлен с помощью функтора '.' и двух аргументов.Первый аргумент - это голова, а второй - хвост, который сам по себе является списком:

'.'(Head, Tail).

Пролог также допускает для списков альтернативный синтаксис следующим образом:

[Head | Tail]

Опять же, Tail сам по себе является списком или может быть [] (пустой список).Термин [] представляет собой специальный атом , представляющий пустой список.Вы не можете представлять пустой список с пометкой '.'.

Если у вас есть список атомов, a, b и c, его можно записать любым из следующих способов:

'.'(a, '.'(b, '.'(c, [])))
[a,b,c,d]
[a | [b,c,d]]
[a | [b | [c,d]]]
[a | [b | [c | [d]]]]
[a | [b | [c | [d | []]]]]

Вы также можете иметь столько «передних» элементов, сколько пожелаете в голове:

[a,b | [c,d]]
[a,b,c | [d]]
[a,b,c,d | []]

Основываясь на моем описании выше, вы сможете увидетьчто это имеет смысл.

Если вы используете write_canonical, вы можете увидеть, что является "родным" представлением Пролога:

| ?- write_canonical([a,b,c]).
'.'(a,'.'(b,'.'(c,[])))

yes
| ?- write_canonical([]).
[]

yes
| ?- 

Теперь в SWI Prolog, они повторно допустили точку ('.') означает нечто особенное, поэтому write_canonical скажет, что [a,b,c] является каноническим представлением [a,b,c].

0 голосов
/ 17 октября 2018

Я не могу сказать это о всех реализациях Пролога, но, вообще говоря, каждый список состоит из Head и Tail (где Head - элемент списка, а Tail - также список), или он пустойи не имеет ни Head, ни Tail.

Итак, список L = [a, b, c, d] выглядит следующим образом:

head(L) = a
tail(L) = [b, c, d]

Или

[H | T] = [a | [b, c, d]]

Итак [b, c, d] = [b | [c, d]], [c, d] = [c | [d]] и [d] = [d | []]где [] - это пустой список .

Пустой список, [], является исключением и не может быть разделен далее.

Или в дерево форма:

*  - node
[] - empty list

  *
 / \
a   *
   / \
  b   *
     / \
    c   *
       / \
      d  []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...