К чему [a|b|c] оценивает в SWI-прологе?

Оператор канала в прологе возвращает одну или несколько атомарных Голов и список Хвоста.

?- [a,b,c] = [a,b|[c]].
true.

Вложение несколько каналов в единственном соответствии может быть сделано подобное этому:

?- [a,b,c] = [a|[b|[c]]].
true.

Что делает оператор [a|b|c] вывести о a, b и c?

Править

До сих пор все, что я могу вывести:

?- [a,b,c] = [a|b|c].
false.

Я больше интересуюсь любыми методами находить ответ, а не отвечать на этот пограничный бесполезный вопрос.

EDIT2
Я ясно не слишком знаком с прологом, простое присвоение ответило на мой вопрос...

?- R = [a|b|c].
R = [a| (b'|'c)].

Что точно продолжает (b'|'c)?

9
задан false 27 November 2013 в 21:44
поделиться

2 ответа

Поскольку я ваш лектор, вот мой ответ.
(О, и я могу подтвердить, что это не домашнее задание, а связано с практическим экзаменом).

Синтаксис [a|b|c] на самом деле не является стандартным для Пролога, и некоторые реализации интерпретируют его по-разному. (Если бы я знал это, то, возможно, не стал бы его использовать.)

Некоторые интерпретируют его как [a|[b|c]]. (Как я и предполагал.)

Но в SWI Prolog (и, возможно, в других):

?- [a|b|c] = [a|[b|c]].
false.

В (b '|' c) на самом деле используется '|', а не '.', как в списке. Таким образом, второе | вообще не интерпретируется как часть построения списка.

Для подтверждения этого можно сделать следующее:

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

|' здесь, похоже, является еще одним бинарным оператором на терминах, как и '.'.

Вместо [a|b|c] стандартом в Prolog является использование [a,b|c].

(Я решил использовать [a|b|c] в Парадигмах программирования только потому, что это более непосредственно связано с нотацией a::b::c из F#, а в Прологе мы видели только крошечный проблеск. В будущем, я думаю, я буду относиться к [a|[b|c]], а затем дам [a,b|c] в качестве сокращения).

10
ответ дан 4 December 2019 в 10:30
поделиться

Это не утверждение, это термин, и он ничего не подразумевает относительно a, b или c. Он просто строит неправильный список.

Более подробно: Синтаксис [|] на самом деле является синтаксическим сахаром для оператора .(). Списки внутренне строятся через '.'(a,[]), но поскольку это становится чрезвычайно утомительным для ввода сразу, вам разрешено писать [a] вместо этого. Таким образом, оператор . оператор должен брать вещь и список, а затем конструировать более длинный список, но поскольку типизации нет, никто не мешает вам применить его к двум атомам или любой другой паре вещей. В результате получается структура, в которой одни операции со списками успешны, а другие - нет. Это иногда полезно (вспомните двоичные деревья), но не так часто встречается, как списки, поэтому для него не существует специального синтаксиса чтения.

(Примерно то же самое происходит с оператором cons в Лиспе; если вы наберёте в Гугле "неправильный список", то получите гораздо больше результатов о Лиспе, но принцип точно такой же)

.
5
ответ дан 4 December 2019 в 10:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: