Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Отрицание как неудача. Предикат not
Рассмотрим фразу: «Ваня любит все игры кроме баскетбола.». Попробуем записать её на Прологе. Первая часть этого утверждения выражается легко: «Ваня любит Х, если Х – игра», или же: Like(wanja,X):-game(X). Однако необходимо исключить баскетбол. Это можно сделать, воспользовавшись иной формулировкой: Если Х – баскетбол, тогда „Ваня любит Х” не будет истиной, иначе, если Х – игра, то „Ваня любит Х”. Для реализации этого на Прологе воспользуемся предикатом fail, который всегда завершается неуспешно и при этом влечёт неуспешное завершение и той фразы, являющейся для него родительской. like(wanja, X):- basketball(X),!,fail. Like(wanja, X):- game(X). Тут отсечение отбросит рассмотрение другого правила, если игра – баскетбол, а fail вызовет неуспех. Этот пример показывает, что желательно иметь унарный предикат not, такой, что not(Цель) будет истиной в случае, когда Цель является ложью. На Прологе его можно описать так: not(P):- P,!, fail; True. Пролог-система имеет встроенный предикат not, реализованный подобным образом. Тогда пример можно переписать следующим образом: Like(wahja,X):- game(X), Not(basketball(X)) Важно отметить: предикат not выполняется успешно, когда подцель не является истиной, т.е. тогда, когда ассоциированная с ним подцель не может дать истину. Следующая программа показывает использование предиката not. Domains name = symbol gpa = real
Predicates honor_student(name) student(name, gpa) Probation(name)
Clauses honor_student(Name):- Student(Name, GPA), GPA>=3.5, Not(probation(Name)). student("Betty Blue", 3.5). student("David Smith", 2.0). student("John Johnson", 3.7). probation("Betty Blue"). probation("David Smith").
На запрос honor_student(Name) она выдаст список студентов, средний балл которых больше или равен 3,5 за исключением студентов Betty Blue и David Smith, которые проходят практику. ТРУДНОСТИ В ИСПОЛЬЗОВАНИИ ОТСЕЧЕНИЯ И ОТРИЦАНИЯ Отметим сначала достоинства использования отсечения: 1. С помощью предиката cut можно повысить эффективность программы. 2. Используя cut, можно описать взаимоисключающие правила, поэтому существует возможность запрограммировать утверждения типа: если P, то Q, иначе R. Ограничения на использование отсечения выходят за пределы декларативной стороны Пролог-программы. Если в программе нет отсечения, то можно менять порядок фактов и целей. Когда же предикат cut присутствует в программе, то изменение порядка фактов может выйти на её декларативное изменение (дать другое решение).
Если исключение отсечения из программы не меняет её декларативный смысл, то такое отсечение называют «зелёным». В другом случае отсечение называют «красным». Работать с отрицанием также нужно с осторожностью. Трудности возникают потому, что отрицание, которое здесь используется, не полностью соответствует математическому отрицанию. Если задать системе следующий запрос: Цель: not(dog(baks)), она возможно ответит „да”. Однако этот ответ нельзя рассматривать как утверждение о том, что „Бакс не собака”. Просто системе не достаточно информации для подтверждения высказывания „Бакс - собака”. Такой подход берёт своё начало от предположения о замкнутости мира. Согласно данному предположению мир замкнут в том смысле, что всё существующее в нем либо указано в программе, либо может быть выведено из неё. И в другом случае, когда чего-то нет в программе (или не может быть выведено), то оно является ложным, и следовательно будет истинным его отрицание. Мы же традиционно не считаем мир замкнутым: если в программе явно не указано, что dog(baks), то это не означает, что мы хотим сказать: Бакс не собака. Приведём ещё один пример осторожного применения not: Predicates R(symbol) G(symbol) P(symbol) Clauses r(a). g(b). P(X):-not(r(X)). На запрос цель: g(X), p(X) система ответит X=b, а на цель: p(X),g(X) – no (нет). Вся разница в том, что в первом случае переменная Х в момент обработки p(X) была уже связанной, а в другом – этого ещё не произошло. ПРАКТИЧЕСКИЕ ЗАДАНИЯ
класс(Число, положительное): - Число>0. Класс(0, нуль). класс(Число, отрицательное): - Число<0. Сделать данную процедуру более эффективной с помощью отсечения.
Р(4). р(5):-!. Р(6). Напишите ответы Пролог-системы на такие запросы: а) цель: p(X). б) цель: p(X), p(Y). c) цель: p(X),!, p(Y). Объясните полученные ответы.
4. Индивидуальное задание 1. Разработать программу на языке Пролог, использующую метод отсечения и отката для решения следующей задачи: из состава студенческой группы выбрать и вывести на экран фамилии студентов, удовлетворяющих одному из условий таблицы 1.
Примечание: фамилии, годы рождения студентов и пр., используемые при построении базы данных программы, не обязательно должны соответствовать фактическим данным. Таблица 1.
Индивидуальное задание 2. Составить программу на языке Пролог для вычисления функций А = А (x, y, z) и В = В (x, y, z) при условиях, заданных в таблице 2. Задачу решить для двух значений x, заданных соответственно в верхней и нижней строках. Таблица 2.
КОНТРОЛЬНЫЕ ВОПРОСЫ 1. Для чего предназначен предикат fail и как его использовать? 2. Что такое cut? Для чего его применяют? 3. назовите положительные стороны предиката cut. 4. Дерево типа «И/ИЛИ»: методы построения и работы с ним. 5. В чём суть стратегии поиска в глубину? 6. Достоинства и недостатки стратегии поиска в глубину. 7. Устранение недостатков поиска в глубину с помощью Пролога. 8. Что значит «зелёное отсечение»? «красное отсечение»? Как эти виды отсечений влияют на декларативный смысл программ? 9. Объясните назначение и работу предиката not. 10. Какие трудности могут возникнуть при работе с предикатами отсечения и отрицания?
ЛАБОРАТОРНАЯ РАБОТА №4 ТЕМА: Рекурсия. ЦЕЛЬ: Научиться использовать возможности Пролога при организации повторяющихся действий. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ ИТЕРАЦИЯ И РЕКУРСИЯ
Рассмотрим сначала организацию циклической обработки, а затем рекурсивные структуры данных. Пролог реализует только два типа повторяющихся действий: бэктрекинг и рекурсию. В следующей части программы показано использование бэктрекинга для реализации цикла. На поставленный запрос будут выводится все возможные решения. Clauses country(england). Country(france). Country(germany). Country(denmark). print_countries:-country(X), write(X), % печать значения Х nl, % перевод курсора на новую строку Fail. print_countries. Первая фраза говорит: «Найдя решение для предиката country(X), вывести страну X и перейти на новую строку». Затем вызывается предикат fail. В данном случае fail означает: если для поставленной цели могут быть найдены альтернативные решения, то вернуться и найти их. Встроенный предикат fail всегда имеет ложное значение. Однако мы могли бы форсировать бэктрекинг, используя какой-нибудь другой, всегда ложный предикат типа 10=3+4 или country(abracadabra) (проверьте данное утверждение, заменив в своей программе fail на один из указанных предикатов). Таким образом, будут получены все страны, и процесс обработки системой первой фразы завершиться. После этого начнётся обработка другой фразы того же предиката print_countries. Она ничего не делает, а только завершает успехом работу системы. Получите конечный вывод решения. Чем он отличается от вывода, если из программы убрать последнюю фразу print_countries? Для наглядности в рассматриваемую программу можно внести следующие изменения: 1. напечатать заголовок; 2. напечатать все возможные решения запроса; 3. напечатать в конце заключительную фразу. Тогда нужно модифицировать описание предиката print_countries. print_countries:-write(“Some delightful places to live are:”), nl, fail. print_countries:-country(X), write(X), nl, fail. print_countries:-write(“And may be some others…”), nl. Нужно ли теперь писать в конце фразу print_countries как факт? Почему? Рассмотрим следующий предикат: repeat. Repeat:-repeat. Такой трюк позволяет реализовать управляющую структуру, которая позволяет получить бесконечное число развязок. Более детально её работу понять после изучения понятия ''хвостовая рекурсия''. Для примера рассмотрим следующую программу: Clauses Repeat. Repeat:-repeat. Typewriter:- repeat, Readchar(C), Write(C), char_int(C,13). Эта программа показывает, как работает repeat. Правило typewriter… описывает процедуру, которая воспринимает символы с клавиатуры и печатает их на экране, пока не будет нажата клавиша ENTER (ASCII код = 13).
Она работает следующим образом: 1. Выполняется repeat (который ничего не делает). 2. Потом считывается символ в переменную С. 3. Затем печатается значение С. 4. Потом проверяется, не имеет ли С значение 13 в коде ASCII. 5. Если это так, программа завершается. Иначе начинается бэктрекинг и пересмотр альтернатив. Ни write, ни readchar не генерируют альтернативных развязок, поэтому бэктрекинг идёт до repeat, который позволяет получить альтернативные развязки. 6. Теперь обработка может вернуться в начало, считывать другой символ, печатать его, проверять на равенство 13. Другой путь реализации повторений – это использование рекурсии. Рассмотрим рекурсивную программу вычисления значения факториала n!, которую можно интерпретировать следующим образом. Если n=1, то n!=1 (запишем factorial(1,1):-!), иначе n!=n*(n-1). Последнее вычисление обеспечивается следующей фразой определения factorial(Х,FactX). factorial(1,1):-!. factorial(Х,FactX):-Y=X-1, Factorial(Y,FactY), FactX=X*FactY. Предыдущая рекурсивная программа вычисления факториала может быть описана на Паскале в следующем итерационном виде: p:=; for i:=1 to n do p:=p*I; FacN:=p; Или же используя цикл while: p:=1; i:=1; while i<=n do Begin p:=p*i; i:=i+1 end; FacN:=p; ПРАКТИЧЕСКИЕ ЗАДАНИЯ 1. Наибольший общий делитель G(M,N) для двух чисел M и N можно обозначить рекурсивной схемой:
M, если N=0; G(M,N) = G(N,mod(M,N)), если N<>0.
Написать программу, которая использует рекурсивно описанный предикат G(M,N) для нахождения наибольшего общего делителя пары чисел. 2. Индивидуальное задание. Разработать программы на языке Пролог: а) использующую метод повтора, определяемый пользователем (задача А); б) использующую правило рекурсии (задача В). В задаче А надо вычислить таблицу значений функции y = f (x) для значений аргумента x 1, x 2, …, x 6. В задаче В (вид функции тот же, что и в задаче А) надо вычислить таблицу значений функции для значений аргумента х в интервале от x н до x к с шагом D x. Таблица 1.
КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Организация бесконечной рекурсии. 2. Метод повтора, определяемый пользователем. 3. Хвостовая рекурсия. 4. Какие операторы сравнения используются в Прологе? 5. Перечислите арифметические функции, реализованные в Прологе.
ЛАБОРАТОРНАЯ РАБОТА №5 Тема: Организация работы со списками средствами Visual Prolog. Цель: Научиться работать со списковыми структурами Visual Prolog. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ СПИСКИ
Списки – это объекты, которые могут содержать различное число однотипных данных. Например: [1,2,3], [dog, cat, canary]. Предположим, нам необходимо создать справочную базу, в которой будем сохранять данные о лекционных курсах, которые могут читать профессора. Её можно реализовать с помощью следующей программы: Predicates
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-12-30; просмотров: 580; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.225.149.32 (0.079 с.) |