Что [a | b | c] оценивает в SWI-Prolog?
-
24-10-2019 - |
Вопрос
Оператор трубы в Прологе возвращает одну или несколько атомных головок и хвостовой список.
?- [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]
Стандарт в прологе - использовать [a,b|c]
.
(Я только решил использовать [a|b|c]
В парадигмах программирования, потому что это более напрямую относится к обозначениям a::b::c
от F#, и мы увидели только крошечный проблеск пролога. В будущем я думаю, я буду относиться к [a|[b|c]]
а потом дай [a,b|c]
как аббревиатура.)
Другие советы
Это не утверждение, это термин, и он вообще ничего не подразумевает a
, b
или же c
. Анкет Это просто строит ненадлежащий список.
Уточнить: [|]
синтаксис на самом деле синтаксический сахар для .()
оператор. Списки внутренне построены через '.'(a,[])
, но так как это становится чрезвычайно утомительным, чтобы печатать сразу, вам разрешено писать [a]
вместо. Итак .
Оператор должен взять что -то и список, а затем противоречить более длительному списку, но, поскольку нет никакого печати, никто не мешает вам применять ее на два атома или любую другую пару вещей. Результатом является структура, в которой некоторые операции списка преуспевают, а другие терпят неудачу. Это иногда полезно (например, бинарные деревья), но не так распространены, как списки, поэтому для этого нет специального синтаксиса чтения.
(Почти то же самое происходит с cons
оператор в LISP; Если вы Google «Неправильный список», вы можете получить гораздо больше результатов о LISP, но принцип точно такой же.)
Внутри изопролог, [a|b|c]
является недействительным синтаксисом. И тем временем также в SWI. Кажется, вы использовали более старую версию. Некоторые системы Prolog дали этот термин некоторую интерпретацию. Увы, все они отличались очень точным способом, как они интерпретировали этот термин. Некоторые как [(a'|'b)|c]
или же [a|(b'|'c)]
или же [a|(b;c)]
... ну, вы поняли.
С этим связано использование панели в качестве оператора инфикса ('|')/2
.
С ISO/IEC 13211-1: 1995/cor.2: 2012, Technical Corrigendum 2, опубликован 2012-02-15 |
как оператор Infix в настоящее время точно определен. До этого, |
должен был быть процитирован. Здесь его проект.
В настоящее время, '|'
может быть определен как оператор инфикса, но только с приоритетом выше 1000. Таким образом, в противном случае неоднозначные случаи, как [a|b|c]
оставаться синтаксически недействительным, но использование |
Для DCG и CHR действительны.
Если вы хотите изучить синтаксис, попробовав его, лучше всего использовать writeq/1
а также write_canonical/1
.
Наиболее соответствующей системой System Sys-Prology Syntax является GNU Prolog.