Оператор канала в прологе возвращает одну или несколько атомарных Голов и список Хвоста.
?- [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)
?
Поскольку я ваш лектор, вот мой ответ.
(О, и я могу подтвердить, что это не домашнее задание, а связано с практическим экзаменом).
Синтаксис [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]
в качестве сокращения).
Это не утверждение, это термин, и он ничего не подразумевает относительно a
, b
или c
. Он просто строит неправильный список.
Более подробно: Синтаксис [|]
на самом деле является синтаксическим сахаром для оператора .()
. Списки внутренне строятся через '.'(a,[])
, но поскольку это становится чрезвычайно утомительным для ввода сразу, вам разрешено писать [a]
вместо этого. Таким образом, оператор .
оператор должен брать вещь и список, а затем конструировать более длинный список, но поскольку типизации нет, никто не мешает вам применить его к двум атомам или любой другой паре вещей. В результате получается структура, в которой одни операции со списками успешны, а другие - нет. Это иногда полезно (вспомните двоичные деревья), но не так часто встречается, как списки, поэтому для него не существует специального синтаксиса чтения.
(Примерно то же самое происходит с оператором cons
в Лиспе; если вы наберёте в Гугле "неправильный список", то получите гораздо больше результатов о Лиспе, но принцип точно такой же)