В правиле пролога голова и тело разделены знаком

ИСПОЛЬЗОВАНИЕ ЯЗЫКА ПРОЛОГ ДЛЯ РЕШЕНИЯ ЛОГИЧЕСКИХ ЗАДАЧ - Студенческий научный форум

При работе с Прологом мы описываем ситуацию (правила и факты) и Голова и тело разделены знаком ": " (если) и, подобно каждой фразе Пролога. А так как голова правила ис- тинна, то доказана истинность цели а оба условия начинаются с абзацного отступа и разделены запятой. Для доказательства головы правила, должны быть доказаны условия тела правила точно так же, . Но здесь знак ра- венства не обязательно является оператором. Если она содержит еще и правила, то часто используют термин база знаний . . Голова и тело разделены знаком: и, подобно каждой фразе Пролога.

Если сопоставление заканчивалось неуспешно, то проверялись следующие факты или правила до тех пор, пока либо одно из сопоставлений заканчивалось успешно, либо все релевантные факты и правила оказывались опробованными и неуспешными.

В случае, когда объектами сопоставления являются две константы, то успешный результат будет лишь тогда, когда они совпадают. Другими сло- вами, константа всегда сопоставима сама с.

В определенный момент перемен- ная может получить некоторое значение. Иногда этого может не произойти. Возможно вы имеете некоторое представление о поведении переменных, основанное на других языках программирования. Если это так, то обратите особое внимание на то, как ведут себя переменные Турбо-Пролога.

Вы мо- жете обнаружить некоторые неожиданные отличия. Следующий пример включает кое-что из того, что вы узнали в преды- дущем разделе о внутренних подпрограммах унификации. Данными являет- ся факт likes mary, apples. Вид этой цели следующий: Переменная в этой цели есть What. Когда внутренние унификационные подпрограммы пытаются сопоставить эту цель с фактами или правилами программы, переменная What не имеет значе- ния.

What не равна нулю и не равна пробелу.

TURBO PROLOG: Учебное пособие

Эта переменная не имеет даже значения, являющегося "мусором" какой бы мусор не оказался в памя- ти, отведенной для переменной. Эти два термина используются как взаимозаменяемые. Неозначенные переменные еще называются свободными переменными.

Ко- гда свободная переменная цели What сопоставляется с соответствующим объектом apples, значением What становится apples. Теперь переменная What означена или инициализирована объектом apples. Другими словами, эта переменная более не свободна связана. Пока What имеет значение apples, эта переменная для Турбо-Пролога "означает" apples. Фактически всякий раз, когда неозначенная переменная сопоставляется с константой, она получает значение этой константы. Теперь предположим, что программа содержит следующие факты: Поэтому Турбо-Пролог выдает все значения для What, кото- рые удовлетворяют этой цели.

Внешние цели заставляют внутренние уни- фикационные подпрограммы Турбо-Пролога найти все решения, удовлетво- ряющие цели. Но внутренние цели заставляют внутренние унификацион- ные подпрограммы останавливаться после первого успешного сопоставле- ния цели. Может показаться, что переменная What получает значения apples, pears и popcorn в одно и тоже время, но это не.

Подпрограммы внут- ренней унификации присваивают переменной конкретное значение только во время сопоставления. Переменная становится вновь свободной, когда со- поставление оказывается неуспешным или цель оказывается успешно вы- численной. Программисты, имеющие опыт работы с императивными языками, иногда нелегко понимают "ликвидацию значения" или освобождение пере- менной.

Обычно в императивных языках, если переменная получила значе- ние, то сохраняет его в области своего определения до тех пор, пока ей не будет присвоено новое значение. Такие присваивания значений находятся под строгим контролем операторов программы. Но в Турбо-Прологе при- сваивания значений переменным выполняется внутренними подпрограммами унификации. Переменные становятся свободными, как только для внут- ренних подпрограмм унификации отпадает необходимость связывать неко- торое значение с переменной для выполнения доказательства подцели.

Может показаться, что в Прологе нельзя управлять значениями, кото- рые присваиваются переменным. Действительно, Пролог не имеет "грубых средств" для управления значениями, точно также в Прологе нет "грубых средств" для управления ходом выполнения программы. Но, понимая принцип работы внутренних унификационных подпрограмм, программист 26 может использовать логический синтаксис Турбо-Пролога для указания то- го, что необходимо выполнить и какие данные должны быть найдены.

Если это не совсем ясно, то не беспокойтесь. Примеры помогут вам ближе позна- комиться с этим процессом. В остальных главах книги содержатся специаль- но подготовленные примеры, которые должны вам помочь. Его дейст- вие состоит в том, чтобы сделать X равным 6. Но некоторые языки для присваивания и равенства используют различные символы. Это выражение может быть подцелью, сгенерированной внутри Турбо- Пролога. В этом случае равенство истинно, и подцель является успешной.

Так как эти два терма имеют различные значения, то равенство ложно. Рассмотрим пример, в котором используется переменная: Это выражение так же могло бы быть подцелью, сгенерированной внутри Турбо-Пролога во время попытки вычислить цель. Но здесь знак ра- венства не обязательно является оператором присваивания. Эта подцель присваивает значение apples переменной X означивает эту переменную только в том случае, если X еще не была означена.

Но если X уже имеет зна- чение, то оно известно внутренним подпрограммам унификации и сравни- вается с константой apples. Если эти два значения одинаковы, то подцель успешна; если они различны, то подцель неуспешна.

Если оба значения известны, то оператор ин- терпретируется как оператор сравнения, даже если оба терма переменные. Если известно только одно из значений, то это известное значение будет при- своено другому. Например, предположим, что переменная Fruit фрукт неозначена. Результат попытки выпол- нить эту подцель состоит в присваивании переменной X значения apples. Вы видите, что даже если оба терма Fruit и X переменные, Турбо-Пролог при- сваивает означивает неозначенной переменной известное значение.

Во многих языках программирования присваивание встречается только в форме присваивания правого терма левому. Но в Турбо-Прологе присваивание мо- жет иметь место в обоих направлениях. Переменная X получила значение apples в результате предыдущей инициализации.

Константа oranges апельсины также имеет известное зна- чение. Так как обо значения известны, то Турбо-Пролог проверяет их ра- венство. Следователь- но, эта подцель неуспешна и цель также неуспешна. После этого неуспеш- ного доказательства цели переменные Fruit и X становятся неозначенными.

Переменным могут быть присвоены значения во время попыток выполнить цели, и они же могут сравниваться для проверки равенства. Результаты означивания передаются дальше другим подцелям, которые используют соответствующие объекты во время при- сваивания значений или сравнения значений.

Если некоторая подцель ока- зывается неуспешной или последующие подцели не используют значений означенных переменных, то эти переменные становятся неозначенными, то есть они становятся снова свободными. Следующая глава дает более подробное описание означивания и осво- бождения переменных, а сейчас достаточно помнить только, как Турбо- Пролог вычисляет и присваивает значения.

Некоторая аналогия прояснит понятие отката. Предположим, что ваша цель - попасть домой к другу, но вы не имеете точного представления, как туда добраться. Однако вы знаете, что после поворота с автострады на перекрестке необхо- димо свернуть направо.

Друг живет в доме через дорогу от входа в парк. После того, как вы свернете с автострады и повернете направо на первом пе- рекрестке, вы не найдете входа в парк. Поэтому вы вернетесь выполните от- кат к перекрестку и продолжите первоначальное движение до следующего 28 перекрестка.

Правила | Практическая информатика | Рецепты Linux

Здесь вы опять повернете направо и поищите вход в парк. Если вам вновь неудастся найти вход в парк, вы еще раз вернетесь назад выпол- ните откат и сделаете попытку на следующем перекрестке. Вы будете по- вторять этот процесс до тех пор, пока вам не удастся достичь вашей цели найти дом, или же вы потерпите полную неудачу и откажитесь от этой затеи.

Twisted: The Untold Story of a Royal Vizier (Whole Show)

Для вас этот вид поиска, вероятно, будет утомительным, но Турбо- Пролог неутомим при поиске всех возможных путей решения задачи. Так же как и вы, Турбо-Пролог использует откат для того, чтобы попробовать новые пути к решению. И, так же как вы, Турбо-Пролог использует всю дос- тупную информацию для выбора подходящего направления.

Типичная про- грамма на Турбо-Прологе содержит факты и правила, основанные на самых различных взаимосвязях предикатов. Правила могут иметь несколько право- сторонних частей, которые соединены связками. Цель может состоять из не- скольких подцелей, а переменные могут быть объектами предиката как в ут- верждениях, так и в подцелях. Другими словами, типичные программы на Турбо-Прологе представляют собой комбинации всех элементов, о которых вы узнали до сих пор в этой главе. Турбо-Пролог пытается вычислить цель при помощи сопоставления терма предиката и объектов цели с соответствующими элементами в фак- тах и головах правил.

Сопоставление выполняется слева направо. Некоторые подцели, вероятно, будут неуспешными при сопоставлении с некоторыми фактами или правилами, поэтому Турбо-Прологу требуется способ "запо- минания точек", в которых он может продолжить альтернативные попытки найти решение. Прежде чем попробовать один из возможных путей решения подцели, Турбо-Пролог фактически помещает в программу "указатель". Указатель определяет точку, в которую может быть выполнен откат, если те- кущая попытка будет неудачной.

По мере того, как Турбо-Пролог успешно заканчивает свои попытки вычисления подцелей слева направо, указатели отката расставляются во всех точках, которые могут привести к решению. Если некоторая подцель оказывается неуспешной, то Турбо-Пролог откатывается влево и останавли- вается у ближайшего указателя отката. С этой точки Турбо-Пролог начинает попытку найти другое решение для неуспешной цели.

До тех пор, пока следующая цель на данном уровне не будет успеш- ной, Турбо-Пролог будет повторять откат к ближайшему указателю отката. Эти попытки выполняются внутренними подпрограммами унификации и ме- ханизмом отката. Окончательным результатом будет либо успешное, либо неуспешное вычисление цели.

С некоторыми небольшими дополнениями факты и правила о Мэри, Бет и яблоках могут быть использованы для иллюстрации отката и внутрен- ней унификации. Данный пример содержит переменные, а также факты и правила, которые обрабатываются подпрограммой внутренней унификации при выполнении операций сопоставления.

Факты для отношения likes: В следующей главе вы узнаете об остальных необходимых частях программы. Ниже дано целевое утверждение, которое используется для выборки информации из приведенных утверждений: Эта цель означает "Что любит Beth? Для того, чтобы ответить на данный вопрос, внутренние унификационные подпрограммы Турбо-Пролога ищут факты или голову правила, сопоставимую с этим целевым утвержде- нием. Поиск начинается с первого утверждения для отношения likes, которое содержит три факта о том, что любит Мэри.

Турбо-Пролог опробует все ут- верждения слева направо сверху. Сопоставление для всех них будет неуспешным, так как константа beth несопоставима с константой mary. Это описание объясняет, как работает утилита TestGoal в Visual Prolog.

При реализации механизма возврата выполняются следующие правила: Предложения при вычислении подцели проверяются в текстуальном порядке, то есть сверху-вниз.

Если подцель сопоставима с заголовком правила, то должно быть вычислено тело этого правила, при этом тело правила образует новое подмножество подцелей для вычисления. Цель считается успешно вычисленной, когда найден соответствующий факт для каждой подцели. Если в Visual Prolog создать программу для автономного исполнения то есть создать свой project-файл для разрабатываемой программыто поиск цели в ней будет вестись так же, как для внутренней цели в PDC Prolog, то есть до первого успешного решения.

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

Пролог обеспечивает два встроенных предиката, которые дают возможность управлять механизмом поиска с возвратом: Предикат fail всегда имеет ложное значение! Отсечение так же, как и fail помещается в тело правила. Однако, в отличие от fail предикат отсечения имеет всегда истинное значение. При этом выполняется обращение к другим предикатам в теле правила, следующим за отсечением.

Следует иметь в виду, что невозможно произвести возврат к предикатам, расположенным в теле правила перед отсечением, а также невозможен возврат к другим правилам данного предиката.

В результате будет выдано 3 решения: В результате будет выдано 1 решение: Пролог — декларативный язык. Описывая задачу в терминах фактов и правил, программист предоставляет Прологу самому искать способ решения. Тем не менее, рассмотрим Пролог с точки зрения процедурного программирования: Факты и правила можно рассматривать как определения процедур. Использование правил для условного ветвления программы. Правило, в отличие от процедуры, позволяет задавать множество альтернативных определений одной и той же процедуры.

В правиле может быть выполнено сравнение, как в условных операторах. Отсечение можно считать аналогом go to. Возврат вычисленного значения производится аналогично процедурам. В Прологе это делается путем связывания свободных переменных при сопоставлении цели с фактами и правилами.

Программа, написанная на Прологе, состоит из шести основных разделов: Ключевые слова domains, constants, facts databasepredicates, clauses и goal отмечают начала соответствующих разделов. Назначение этих разделов таково: Данный раздел программы является обязательным. Составными частями при этом могут являться некие подцели, из которых формируется единая цель программы. В Visual Prolog разрешает объявление разделов domains, facts, predicates, clauses как глобальных разделов, то есть с ключевым словом global.

Пролог имеет следующие встроенные типы доменов: PRO Если в программе необходимо использовать новые домены данных, то они должны быть описаны в разделе domains. Различие между symbol и string - в машинном представлении и выполнении, синтаксически они не различимы. Однако, по принятому соглашению, символическую строку в двойных кавычках нужно рассматривать как string, а без кавычек — как symbol: Symbol - имена, начинающиеся с символа нижнего регистра и содержащие только символы, цифры, и символы подчеркивания.

String — в двойных кавычках могут содержать любую комбинацию символов, кроме 0, который отмечает конец строки. Visual Prolog поддерживает и другие типы стандартных доменов данных, например, для работы с внешними БД или объектами. Предикаты описываются в разделе predicates. Предикат представляет собой строку символов, первым из которых является строчная буква.

Если предикаты имеют аргументы, то они определяются при описании предикатов в разделе predicates: Факты и правила определяются в разделе clauses, а вопрос к программе задается в разделе goal — в этом случае цель называется внутренней целью. В Visual Prolog раздел goal в тексте программы является обязательным. Разница в режимах исполнения программы состоит в разном использовании утилиты Test Goal.

Если утилита создается для запуска любой программы, то при этом ищутся все решения, если утилита создается для автономного запуска программы — то ищется одно решение. Терм, представляющий совокупность термов, называется составным термом или структурой.

Составные структуры данных в Прологе объявляются в разделе domains. Если термы структуры относятся к одному и тому же типу доменов, то этот объект называется однодоменной структурой данных.

Если термы структуры относятся к разным типам доменов, то такая структура данных называется многодоменной структурой данных. Использование доменной структуры упрощает структуру предиката. Аргументами составного терма данных могут быть простые типы данных, составные термы или списки. Синтаксически составной терм выглядит так же, как и предикат: Составной терм может быть унифицирован с простой переменной или составным объектом при этом переменные могут быть использованы как часть внутренней структуры терма.

Это означает, что составной объект 28 можно использовать для того, чтобы передавать целый набор значений, как единый объект, а затем применять унификацию для их разделения. Необходимо создать БД, содержащую сведения о книгах из личной библиотеки.

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