Вопрос

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

?- [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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top