Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 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 можно обозначить рекурсивной схемой:
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; просмотров: 733; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.196 (0.009 с.) |