2 Solutions
Так, как ему известно, что
likes(bill, cindy).
и
likes(bill, dogs) .
Если бы мы спросили:
What does Cindy like? (Что любит Синди?)
likes(cindy, What).
то Пролог ответил бы:
What = bill
What = cindy
What = dogs
3 solutions
поскольку Пролог знает, что Синди любит Билла, и что Синди любит то же, что и Билл, и что Билл любит Синди и собак.
Мы могли бы задать Прологу и другие вопросы, которые можно задать человеку. Но вопросы типа "Какую девушку любит Билл?" не получат решения, т. к. Прологу в данном случае не известны факты о девушке, а он не может вывести заключение, основанное на неизвестных данных: в этом примере мы не дали Прологу какого-нибудь отношения или свойства, чтобы определить, являются ли какие-либо объекты девушками.
6. Размещение фактов, правил и запросовПредположим, есть следующие факты и правила:
Быстрая машина — приятная. (A fast car is fun).
Большая машина — красивая. (A big car is nice).
Маленькая машина — практичная. (A little car is practical).
Биллу нравится машина, если она приятная. (Bill likes a car if the car is fun).
Исследуя эти факты, вы можете сделать вывод, что Биллу нравится быстрый автомобиль. В большинстве случаев Пролог придет к подобному решению. Если бы не было фактов о быстрых автомобилях, вы не смогли бы логически вывести, какие автомобили нравятся Биллу. Вы можете делать предположения о том, какой тип машин может быть крепким, но Пролог знает только то, что вы ему скажете. Пролог не строит предположений.
Вот пример, демонстрирующий, как Пролог использует правила для ответа на запросы. Посмотрите на факты и правила в этой части программы ch02e01.pro:
likes(ellen, tennis).
likes (John, football).
likes (torn, baseball).
likes (eric, swimming).
likes (mark, tennis).
likes (bill, Activity):- likes (torn, Activity).
Последняя строка в программе является правилом. Это правило соответствует предложению естественного языка:
Биллу нравится занятие, если Тому нравится это занятие. (Bill likes an activity if Tom likes that activity)
В данном правиле заголовок — это likes (bill, Activity), а тело — likes (torn, Activity). Заметим, что в этом примере нет фактов о том, что Билл любит бейсбол. Чтобы выяснить, любит ли Билл бейсбол, можно дать Прологу такой запрос:
likes (bill, baseball).
Пытаясь отыскать решение по этому запросу, Пролог будет использовать правило:
likes(bill, Activity):- likes(torn, Activity).
Загрузите программу ch02e01.pro в среду визуальной разработки Visual Prolog и запустите ее утилитой Test Goal.
predicates
likes(symbol,symbol)
clauses
likes(ellen,tennis).
likes(John,football).
likes(torn,baseball).
likes(eric,swimming).
likes(mark,tennis).
likes(bill,Activity):-likes(torn, Activity).
goal
likes(bill, baseball).
Утилита Test Goal ответит в окне приложения:
yes (да)
Система использовала комбинированное правило
likes(bill, Activity):- likes(torn, Activity).
с фактом
likes(torn, baseball). для решения, что likes(bill, baseball).
Попробуйте также следующий запрос в GOAL-разделе:
likes (bill, tennis).
Утилита Test Goal ответит:
no (нет)
поскольку:
· нет фактов, которые говорят, что Билл любит теннис;
· отношение Билла к теннису не может быть логически выведено с использованием данного правила и имеющихся в распоряжении фактов.
Вполне возможно, что Билл любит теннис в реальной жизни, но ответ Visual Prolog основан только на фактах и правилах, которые вы дали ему в тексте программы.
7. ПРОГРАММЫ НА VISUAL PROLOG
Синтаксис Visual Prolog разработан для того, чтобы отображать знания о свойствах и взаимосвязях.
В отличие от других версий Пролога, Visual Prolog — компилятор, контролирующий типы: для каждого предиката объявляются типы объектов, которые он может использовать. Это объявление типов позволяет программам Visual Prolog быть скомпилированными непосредственно в машинные коды, при этом, скорость выполнения сравнима, а в некоторых случаях — и превышает скорости аналогичных программ на языках С и Pascal.
8. Основные разделы Visual Prolog-программОбычно программа на Visual Prolog состоит из четырех основных программных разделов, к которым относятся:
· раздел clauses (предложений);
· раздел predicates (предикатов);
· раздел domains (доменов);
· раздел goal (целей).
Раздел clauses — это сердце Visual Prolog-программы; именно в этот раздел записываются факты и правила, которыми будет оперировать Visual Prolog, пытаясь разрешить цель программы.
Раздел predicates — это тот, в котором объявляются предикаты и домены (типы) их аргументов (вам не нужно объявлять предикаты, встроенные в Visual Prolog).
Раздел domains служит для объявления доменов, не являющихся стандартными доменами Visual Prolog.
В раздел goal помещается цель Visual Prolog-программы.
9. Раздел предложенийВ раздел clauses (предложений) помещаются все факты и правила, составляющие программу. Все предложения для каждого конкретного предиката в разделе clauses должны располагаться вместе. Последовательность предложений, описывающих один предикат, называется процедурой.
Пытаясь разрешить цель, Visual Prolog (начиная с первого предложения раздела clauses) будет просматривать каждый факт и каждое правило, стремясь найти сопоставление. По мере продвижения вниз по разделу clauses, он устанавливает внутренний указатель на первое предложение, являющееся частью пути, ведущего к решению. Если следующее предложение не является частью этого логического пути, то Visual Prolog возвращается к установленному указателю и ищет очередное подходящее сопоставление, перемещая указатель на него (этот процесс называется поиск с возвратом).
10. Раздел предикатовЕсли в разделе clauses программы на Visual Prolog описан собственный предикат, то его необходимо объявить в разделе predicates (предикатов). В результате объявления предиката сообщается, к каким доменам (типам) принадлежат аргументы этого предиката.
11. ОБЪЯВЛЕНИЕ ПОЛЬЗОВАТЕЛЬСКОГО ПРЕДИКАТАОбъявление предиката начинается с имени этого предиката, за которым идет открывающая (левая) круглая скобка, после чего следует ноль или больше доменов (типов) аргументов предиката:
predicateName (argument_typel OptionalNamel,
argument_type2 OptionalName2, …,
argument_typeN OptionalNameN)
После каждого домена (типа) аргумента следует запятая, а после последнего типа аргумента — закрывающая (правая) скобка. В отличии от предложений в разделе clauses, декларация предиката не завершается точкой. Доменами (типами) аргументов предиката могут быть либо стандартные домены, либо домены, объявленные вами в разделе domains. Можно указывать имена аргументов OptionalNameK — это улучшает читаемость программы, и не сказывается на скорости ее исполнения, т. к. компилятор их игнорирует.
Имена предикатовИмя предиката должно начинаться с буквы, за которой может располагаться последовательность букв, цифр и символов подчеркивания. Буквы должны быть в нижнем регистре! Имя предиката может иметь длину до 250 символов.
В именах предикатов запрещается использовать пробел, символ минус, звездочку и другие алфавитно-цифровые символы.
Аргументы предикатовАргументы предикатов должны принадлежать доменам, известным Visual Prolog. Эти домены могут быть либо стандартными, либо пользовательскими.
12. Раздел доменовДомены позволяют задавать разные имена различным видам данных, которые, в противном случае, будут выглядеть абсолютно одинаково. В программах Visual Prolog объекты в отношениях (аргументы предикатов) принадлежат доменам, причем это могут быть как стандартные, так и описанные пользователем специальные домены. Раздел domains служит двум полезным целям. Во-первых, можно задать доменам осмысленные имена, даже если внутренне эти домены аналогичны уже имеющимся стандартным. Во-вторых, объявление специальных доменов используется для описания структур данных, отсутствующих в стандартных доменах.
Иногда очень полезно описать новый домен — особенно, когда вы хотите прояснить отдельные части раздела predicates. Объявление собственных доменов, благодаря присваиванию осмысленных имен типам аргументов, помогает документировать описываемые вами предикаты. Рассмотрим пример, показывающий, как объявление доменов помогает документировать предикаты:
Франк — мужчина, которому 45 лет.
Используя стандартные домены, вы можете так объявить соответствующий предикат:
person(symbol, symbol, integer).
В большинстве случаев такое объявление будет работать хорошо, но не наглядно для чтения программы. Более правильным было бы следующее описание:
domains
name, sex = symbol
age = integer
predicates
person(name, sex, age)
Одним из главных преимуществ объявления собственных доменов является то, что Visual Prolog может отслеживать ошибки типов, например, такие:
same_sex(X,Y):-
person(X, Sex, _),
person(Sex, Y, _).
Несмотря на то, что и name и sex описываются как symbol, они не эквивалентны друг другу. Это и позволяет Visual Prolog определить ошибку, если вы перепутаете их. Это полезно в тех случаях, когда ваши программы очень велики и сложны.
Аргументы с типами из специальных доменов не могут смешиваться между собой, даже если эти домены одинаковы.
Следующий пример программы при его загрузке приведет к ошибке типа.
Domains product, sum = integer
predicates
add_em_up(sum,sum,sum)
multiply_em(product,product,product)
clauses
add_em_up(X, Y, Sum):-Sum=X+Y.
multiply_em(X,Y,Product):-Product=X*Y.
Эта программа выполняет две операции: складывает и умножает. Зададим ей следующую цель:
add_em_up(32, 54, Sum) .
Visual Prolog (Test Goal) ответит:
Sum=86
... отдаетесь учебе? YTS · Yes · No На основе этих данных построим базу знаний продукционной модели с помощью простой конструкции : Если (условие), то (действие), Набор правил для экспертной системы прогнозирования сдачи сессии студентами на основании текущей успеваемости: 3. If LIO=”Yes” and LIK=”Yes” then LI = “Yes” 4. If LIO=”Yes” and LIK=”No” then LI = “Yes” 5. If LIO=”No” ...
... названием "Prolog", а внутри него ярлык на файл "Prolog.exe" с названием "Prolog with databases", ярлык на help-файл и на файл "readme.txt". 3.3 Руководство пользователя программы интерпретатора языка Пролог 3.3.1 Запуск программы Запуск программы можно произвести несколькими способами. Нажать кнопку "Пуск", выбрать в меню пункт "Программы", выбрать пункт "Prolog". После того, как ...
... проектирование и программирование 0.8 Структурное проектирование включает в себя: - нисходящее проектирование ("сверху вниз"), - модульное программирование, - структурное программирование. 0.8.1.Нисходящее проектирование Метод предполагает последовательное разложение функции обработки данных на простые функциональные элементы ("сверху ...
... набор процедур и функций языков программирования Basic и Pascal, позволяют управлять графическим режимом работы экрана, создавать разнооборазные графические изображения и выводить на экран текстовые надписи. ГЛАВА 2. ГРАФИЧЕСКИЕ ВОЗМОЖНОСТИ ЯЗЫКА ПРОГРАММИРОВАНИЯ В КУРСЕ ИНФОРМАТИКИ БАЗОВОЙ ШКОЛЫ (НА ПРИМЕРЕ BASIC И PASCAL) 2.1 Разработка мультимедиа курса «Графические возможности языков ...
0 комментариев