Факты в языке пролог
ПРОЕКТ «ЧЕЛОВЕК. ЗЕМЛЯ. ВСЕЛЕННАЯ»
Инструменты пользователя
Инструменты сайта
Боковая панель
Содержание
Факты и правила в Прологе
Факты используются для представления данных, а правила используются для вывода логических заключений, то есть новых фактов. Факты и правила называются утверждениями. Типичная программа на Прологе (Prolog) содержит факты и правила, основанные на самых различных взаимосвязях предикатов.
Факты в Прологе
Факт записывается как предикат с одним или более объектами. Но факт может быть предикатом, не содержащим объектов, то есть предикатом с нулевой арностью. См. «Предикаты разных арностей»
finds(john,gold). /* Джон нашел золото */
В программе на Прологе утверждения для одного и того же предиката группируются вместе.
Правила в Прологе
Правило используется Прологом (Prolog) для проверки условия вывода нового факта. Правила в Прологе (Prolog) записываются в разделе утверждений (clauses). Программа может содержать достаточно много правил, вырабатывающих различные заключения. Эффект введения правил точно такой же, как если бы программа содержала большое число утверждений-фактов.
Правила имеют левую часть (голову) и правую часть, следующую за символом :- (условия правила или тело). Левая часть правила истинна, если истинна правая часть правила. Правила генерируют новые факты, когда все утверждения в теле оказываются вычисленными.
Так как головы утверждений, являющиеся правилами, имеют форму фактов, то правила могут рассматриваться как факты. Но, тем не менее, различия между фактами и правилами весьма существенны.
При трансляции утверждений Пролог (Prolog) контролирует правильность написания имени предиката, количество объектов и типы их доменов.
Пример использования правила:
отношение(объект1,объект2) | условие | отношение(объект1,объект2) |
любит (бет, X) | если | любит (мэри, X) |
Как Пролог определяет, что надо подставить «яблоки» вместо X в этом правиле? Пролог сопоставляет все доступные ему факты (в данном случае, кто что любит) с любым правилом, с помощью которого могут быть выведены новые факты. Пролог не предоставляет возможность программисту выполнить такой приказ, как «на данном этапе сравнить X с яблоками и проверить, что это сравнение удовлетворяет некоторым условиям».
Пролог построен так, что он автоматически пытается выполнить сопоставление, используя принципы логики предикатов. Программисту только необходимо, используя синтаксис Пролога, описать к каким заключениям приведут какие условия. То есть необходимо сформулировать логические взаимоотношения, а программа использует эти утверждения о логических связях для получения заключения (новых фактов).
Для слова if (если) использует специальный символ :- (двоеточие с последующим тире).
Связки в правилах
Часто условия требуют более одной предпосылки. Например:
Данное правило имеет два условия, соединенные словом and (и). Это есть связка двух условий, объединенных словом and. В Прологе вместо слова and часто используется запятая (,).
Также в Прологе может использоваться уловие ИЛИ (or). В Прологе вместо слова or часто используется точка с запятой (;).
Пример использования условия and:
На запрос цели необходимо ввести married(john,mary) или married(mary,john)
Prolog урок 3. Факты и правила, родственные отношения
Условные отношения или правила в Prolog
Рассмотрим пример, когда факты связаны условным отношением с другими уже известными фактами, в таком случае они могут называться правилами:
likes(cindy, X):- likes(bill, X). /* Синди любит все, что любит Билл */
likes(cindy, X) является заголовком правила.
likes(bill, X) является телом правила или его хвостовой целью.
Чтобы правило стало истинным, необходимо чтобы его хвостовая цель/цели была/были истинными. Т.е. в нашем случае, если Билл любит что-то (т.е. если высказывание истинно), тогда и Синди любит это (т.е. тогда правило истинно).
Правило может содержать несколько хвостовых целей, которые должны быть истинными для того, чтобы правило было истинным:
Переменные могут быть свободными или связанными.
Свободная переменная пока не имеет значения. Такие переменные еще называют неконкретизированными.
Переменная, которая получила какое-то значение и оказалась связанной с определенным объектом, называется связанной.
likes (bill, Something)if green(Something).
Это правило можно интерпретировать, как «Билл любит все зеленое». В данном примере Something — это переменная, т.к. начинается с заглавной буквы и без кавычек.
Выполнение:
domains a=symbol b=integer predicates pol(a,a) vozrast (a,b) clauses pol(ivan,boy). pol(sergey,boy). pol(mary,girl). vozrast(ivan,3). vozrast(sergey,4). vozrast(mary,5).
Добавьте недостающие фрагменты и реализуйте запросы в окне dialog:
Проанализируйте ответы на запросы.
domains a=symbol predicates likes (a,a) green(a) clauses likes (mary,apples). likes (beth,apples). likes(mary,oranges). likes (mary, tomatoes). likes (mary,apples)if ________. likes(___,__) if likes(___,__). likes (___,__)if green(__). green(apples). green(goroh).
Порядок выполнения команд компилятором TProlog
Пусть программа на Турбо-Прологе содержит факт:
likes(mary,apples). /* Мэри любит яблоки */
И правило:
likes(beth,X) if likes(mary,X). /* Бет любит это, если Мэри любит это */
Вводим цель:
likes(beth,apples). /* бет любит яблоки */
Турбо-Пролог воспринимает утверждение цели и начинает поиск правил и фактов программы для сопоставления с предикатом likes :
Правило или факт?
Если правило выглядит как:
likes (beth,apples)if likes(mary,apples).
То это и правило и факт одновременно, т.к. голова правила имеет форму факт.
Но в другом случае, в голове правила может быть расположена переменная:
1.1. Факты
1.1. Факты
Начнем обсуждение с фактов об объектах. Предположим, мы хотим сообщить Прологу[1]факт: «Джону нравится Мэри». Этот факт включает в себя два объекта, обозначенных именами «Мэри» и «Джон», и отношение, обозначенное словом «нравится». В языке Пролог используется стандартная форма записи фактов:
нравится (джон, мэри).
Важно соблюдать следующие правила:
• Имена всех отношений и объектов должны начинаться со строчной буквы. Например, нравится, джон, мэри.
• Сначала записывается имя отношения. Затем через запятую записываются имена объектов, а весь список имен объектов заключается в круглые скобки.
• Каждый факт должен заканчиваться точкой.
Определяя с помощью фактов отношения между объектами, необходимо учитывать, в каком порядке перечисляются имена объектов внутри круглых скобок. Этот порядок может быть произвольным, но, выбрав один раз какой-то определенный порядок, мы должны везде следовать ему и далее. Например, в приведенном выше факте мы поставили на первое место в списке объектов «того, кому нравится», а объект «который нравится» стоит во второй позиции. Таким образом, факт нравится(джон,мэри) не одно и тоже, что нравится(мэри,джон). В соответствии с принятой нами (хотя и произвольным образом) договоренностью первый факт говорит о том, что Джону нравится Мэри, в то время как второй факт говорит, что Мэри нравится Джон. Если мы хотим сказать, что Мэри нравится Джон, то мы должны сформулировать это утверждение явно, в виде факта
Взгляните на следующие примеры фактов, приведенные вместе с возможной их интерпретацией на естественном языке:
ценный(золото). Золото является ценным,
женщина(джейн). Джейн — женщина.
владеет(джон,золото). Джон владеет золотом.
отец(джон,мэри). Джон является отцом Мэри.
дает(джон,книга,мэри). Джон дает Мэри книгу.
Всякий раз когда используется некоторое имя, оно указывает на определенный индивидуальный объект. В силу жизненного опыта нам совершенно ясно, что имена джон и джейн относятся к индивидуальным объектам. Но в некоторых других фактах мы использовали имена золото и ценный, и совсем не очевидно, что они значат. Логики называют имена такого сорта «словами, не имеющими определенного значения вне контекста». Используя такие имена, мы должны решить, как интерпретировать эти имена. Например, имя золото могло бы относиться к некоторому объекту. В этом случае мысленный образ объекта имеет вид конкретного куска золота, который мы обозначаем именем золото. И когда мы записываем на Прологе ценный(золото), мы должны понимать это в том смысле, что этот конкретный кусок золота, для обозначения которого мы использовали имя золото, является ценным. С другой стороны, мы могли бы интерпретировать имя золото как слово, обозначающее химический элемент золото с атомным весом 79, и, когда мы записываем ценный(золото), мы должны понимать это так, что химический элемент золото является ценным. Таким образом, имеется несколько способов интерпретировать имя и именно автор программы определяет конкретную интерпретацию. До тех пор пока последовательно используется одна и та же интерпретация имен, никаких проблем не возникает. Выявлять отличия между различными интерпретациями необходимо с самого начала, с тем чтобы быть совершенно уверенным в том, что обозначают,имена.
Теперь пришла пора сказать несколько слов о терминологии. Имена объектов, список которых в каждом факте заключен в круглые скобки, называются аргументами. Заметим, что в программировании значение слова «аргумент» не имеет ничего общего с его общеупотребительным значением, используемым в контексте слов «диспут», «дебаты», «дискуссия», «спор» и т. п. Имя отношения, которое записывается непосредственно перед круглыми скобками, называется предикат.[2] Таким образом, ценный – это предикат, имеющий один аргумент, а нравится – предикат с двумя аргументами.
Имена объектов и отношений являются полностью произвольными. Например, вместо терма нравится(джон,мэри) мы могли бы с таким же успехом представить это как a(b,c), помня при этом, что а значит нравится, b означает Джон, а с – Мэри. Однако обычно мы выбираем имена таким образом, чтобы они сами напоминали нам, что они значат. Следовательно, мы заранее должны решить, что значат наши имена и каким должен быть порядок аргументов. С этого момента необходимо последовательно придерживаться принятых соглашений.
Отношения могут иметь произвольное число аргументов. Если мы хотим определить предикат играть, в котором упоминаются два игрока и игра, в которую они играют между собой, то необходимы три аргумента. Здесь приведены два примера, показывающие, как это можно сделать:
Как мы увидим далее, такой способ обеспечивает возможность представления сложных взаимодействий между отношениями.
В Прологе можно объявить факты, которые не являются истинными в реальном мире. Например, можно было бы написать король(джон, франция), чтобы объявить, что Джон является королем Франции. В реальном мире этот факт со всей очевидностью является ложным, в частности, потому, что монархия во Франции уничтожена приблизительно в 1792 г. Но Пролог не знает этого и не заботится об этом. Факты в Прологе просто позволяют выражать произвольные отношения между объектами.
Совокупность фактов в Прологе называется базой данных. Мы будем пользоваться термином база данных всякий раз при объединении вместе некоторых фактов (а в дальнейшем и правил) для совместного их использования при решении некоторой конкретной задачи.
Читайте также
1.3. Важные факты в создании систем Unix
1.3. Важные факты в создании систем Unix Хотя большая часть общего кода Linux разрабатывалась независимо от традиционных исходных баз Unix, на интерфейсы, предоставляемые Linux, сильно влияли существующие системы Unix.На заре восьмидесятых годов прошлого столетия разработчики Unix
Интересные факты
Интересные факты В этом разделе я привожу самые интересные факты, которые можно узнать при работе с Radmin. Некоторые из них вы уже знаете, потому что встречали по тексту ранее, однако здесь они собраны все вместе, этим и интересен раздел.? Если удаленный компьютер начинает
1.1. Факты
1.1. Факты Начнем обсуждение с фактов об объектах. Предположим, мы хотим сообщить Прологу[1]факт: «Джону нравится Мэри». Этот факт включает в себя два объекта, обозначенных именами «Мэри» и «Джон», и отношение, обозначенное словом «нравится». В языке Пролог используется
Интересные факты из жизни багов
Интересные факты из жизни багов Каждый тестировщик знает, что такое баги и баг-репорты. Поиск багов, сортировка багов, исправление багов, отлов регрессионных багов — основной костяк работы по контролю качества программных продуктов. Эта часть тестирования, пожалуй,
Кафедра Ваннаха: Знания, модели, факты Ваннах Михаил
Кафедра Ваннаха: Знания, модели, факты Ваннах Михаил Опубликовано 28 октября 2010 года Достоинства, как давно заметил мудрец, есть продолжения наших недостатков. И каждой новой технологии неизбежно сопутствует новый искус. Вот двигатель внутреннего
Факты в языке пролог
Билл любит собак. (Bill likes dogs.)
устанавливает отношение между объектами Bill и dogs ( Билл и собаки ); этим отношением является likes ( любит ). Ниже представлено правило, определяющее, когда предложение «Билл любит собак» является истинным:
Билл любит собак, если собаки хорошие. (Bill likes dogs if the dogs are nice.)
Факты
Ниже представлено несколько предложений на естественном языке с отношением «любит» (likes) :
Билл любит Синди. (Bill likes Cindy)
Синди любит Билла. (Cindy likes Bill)
Билл любит собак. (Bill likes dogs)
А теперь перепишем ли же факты, используя синтаксис Пролога :
Правила
Синди любит все, что любит Билл. (Cindy likes everything that Bill likes)
Кейтлин любит все зеленое. (Caitlin likes everything that is green)
Используя эти правила, вы можете из предыдущих фактов найти некоторые вещи, которые любят Синди и Кейтлин:
Синди любит Синди. (Cindy likes Cindy)
Кейтлин любит Кермит. (Caitlin likes Kermit)
Символ :- имеет смысл «если», и служит для разделения двух частей правила: заголовка и тела.
Вы можете рассматривать правило и как процедуру. Другими словами, эти правила
Запросы
На естественном языке мы спрашиваем:
Does Bill like Cindy? ( Билл любит Синди? )
По правилам Пролога мы спрашиваем:
Получив такой запрос, Пролог мог бы ответить:
потому что Пролог имеет факт, подтверждающий, что это так. Немного усложнив вопрос, мы могли бы спросить вас на естественном языке:
What does Bill like? ( Что любит Билл? )
По правилам Пролога мы спрашиваем:
Пролог всегда ищет ответ на запрос, начиная с первого факта, и перебирает факты, пока они не закончатся. Получив запрос о том, что Билл любит, Пролог ответит:
Так как ему известно, что
Надеемся, что вы пришли к такому же выводу.
Если бы мы спросили вас (и Пролог ):
What does Cindy like? ( Что любит Синди? )
поскольку Пролог знает, что Синди любит Билла, и что Синди любит то же, что и Билл, и что Билл любит Синди и собак.
Мы могли бы задать Прологу и другие вопросы, которые можно задать человеку. Но вопросы типа «Какую девушку любит Билл?» не получат решения, т.к. Прологу в данном случае не известны факты о девушке, а он не может вывести заключение, основанное на неизвестных данных: в этом примере мы не дали Прологу какого-нибудь отношения или свойства, чтобы определить, являются ли какие-либо объекты девушками.
Лабораторная работа №1 Тема: Факты и правила на Прологе. Основные приемы работы в Visual Prolog (стр. 1 )
| Из за большого объема этот материал размещен на нескольких страницах: 1 2 3 4 |
Лабораторная работа №1
Тема: Факты и правила на Прологе. Основные приемы работы в Visual Prolog
В Прологе решение достигается логическим выводом из ранее известных положений. Обычно, программа на Прологе представляет собой набор фактов с правилами, обеспечивающими получение заключений на основе этих фактов.
Пролог использует упрощенную версию синтаксиса логики предикатов, т. к. он является простым для понимания и очень близок к естественному языку.
Одной из важнейших особенностей Пролога является то, что (в дополнение к логическому поиску ответов на поставленные вами вопросы) он может иметь дело с альтернативами и находить все возможные решения, а не одно. Пролог может возвращаться назад и просматривать более одного пути, при решении всех составляющих задачу частей.
1. Программа на Прологе состоит из предложений, которые могут быть фразами двух типов: фактами или правилами.
2. Факты могут иметь вид:
property (object, object. object). или
relation (object, object. object).
3. Каждый факт программы задает либо связь, влияющую на один или более объектов, либо свойство одного или более объектов. Например, в факте Пролога
likes (tom, baseball).
4. В общем виде правила имеют заголовок и тело, которые выглядят следующим образом:
relation (object, object. object) if
relation (object. object) and
relation (object. object).
5. Сообразуясь со следующими ограничениями, можно устанавливать любые имена для связей и объектов в своей программе:
#Имя объекта должно начинаться со строчной буквы, за которой может быть любое число символов. Этими символами могут быть: буквы верхнего и нижнего регистров, цифры и символы подчеркивания.
# Имена свойств и связей должны начинаться с буквы, за которой может следовать любая комбинация букв, цифр и символов подчеркивания.
7. Переменные позволяют вам записывать общие факты и правила и задавать общие вопросы.
# Имя переменной в Прологе должно начинаться с заглавной буквы или символа подчеркивания (_), после которой вы можете использовать любое число букв (верхнего и нижнего регистра), цифр и символов подчеркивания.
# Вы не можете длительно хранить информацию с помощью «связывания» переменной со значением, т. к. переменная является связанной только в пределах предложения.
8. Если в запросе вас интересует только определенная информация, то для игнорирования не нужных вам значений вы можете использовать анонимные переменные. В Прологе анонимные переменные обозначаются одиночным символом подчеркивания (_).
Анонимная переменная может быть использована вместо любой другой переменной; она сопоставляется с чем угодно. Анонимная переменная никогда не принимает какого-либо значения.
9. Задание Прологу вопросов о фактах в вашей программе называется запросами к системе Пролога; более общим термином для запроса является «цель». Пролог пытается разрешить цель (ответить на вопрос), начиная с первого факта и просматривая все факты до достижения последнего из них.
11. Комментарии делают вашу программу более удобной для чтения. Вы можете заключать комментарии в разделители /*как здесь */ или предварять их одним символом процента, % как здесь.
12. В Прологе имеется несколько способов сопоставления одного с другим:
# Идентичные структуры сопоставляются друг с другом.
#Свободная переменная сопоставляется с константой или с ранее связанной переменной (и становится связанной с соответствующим значением).
# Две свободные переменные могут сопоставляться (и связываться) друг с другом. С момента связывания они трактуются как одна переменная: если одна из них принимает какое-либо значение, то вторая немедленно принимает то же значение.
age (Person1, Age1) and age (Person1, Age1),
age (Person2, Age2) and age (Person2, Age2),
Age1 > Age2. Age1 > Age2.
15. Программа на Прологе имеет следующую обобщенную структуру:
предложения (факты и правила)
predicateName (argument_type1, argument_type2.
20. В Пролог включено более 200 встроенных стандартных предикатов и более дюжины стандартных доменов: в случае использования этих предикатов и доменов у вас нет необходимости объявлять их.
22. Правила имеют форму:
Для разрешения правила Пролог должен разрешить все его подцели, создав при этом соответствующее множество связанных переменных. Если же одна из подцелей ложна, Пролог возвратится назад и просмотрит альтернативные решения предыдущих подцелей, а затем вновь пойдет вперед, но с другими значениями переменных. Это процесс называется «поиск с возвратом».
23. Символ Пролога «if» отличается от «IF», используемых в других языках: правило Пролога работает в соответствии с условной формой then/if, тогда как оператор других языков IF работает в соответствии с условной формой if/then.
24. Менее используемыми секциями программ на Прологе являются секции database и constants, а также различные глобальные (global) секции. Кроме этого, вы можете задавать компилятору (в форме директив) особые инструкции, располагая их в начале исходного текста вашей программы.
Одним из наиболее важных аспектов программирования на Прологе являются понятия унификации (отождествления) и конкретизации переменных.
Пролог пытается отождествить термы при доказательстве, или согласовании, целевого утверждения. Например, в программе имеется факт собака(рекс). Для согласования запроса?- собака(Х) целевое утверждение собака(X) будет отождествлено с фактом собака (рекс), в результате чего переменная Х станет конкретизированной: Х= рекc.
В том случае, когда переменные содержатся только в хвостовых целевых утверждениях, правило считается доказанным, если хвостовое целевое утверждение истинно для одного или более значений переменных. Переменные, содержащиеся только в хвостовых целевых утверждениях, связаны квантором существования. Таким образом, они принимают конкретные значения на то время, когда целевое утверждение, в котором переменные были согласованы, остается доказанным.