Вход

Логическое программирование

Методичка* по компьютерным сетям
Дата создания: 2002
Язык методички: Русский
Word, doc, 241 кб
Методичку можно скачать бесплатно
Скачать
Данная работа не подходит - план Б:
Создаете заказ
Выбираете исполнителя
Готовый результат
Исполнители предлагают свои условия
Автор работает
Заказать
Не подходит данная работа?
Вы можете заказать написание любой учебной работы на любую тему.
Заказать новую работу
* Данная работа не является научным трудом, не является выпускной квалификационной работой и представляет собой результат обработки, структурирования и форматирования собранной информации, предназначенной для использования в качестве источника материала при самостоятельной подготовки учебных работ.
Очень похожие работы
ВВЕДЕНИЕ
Лабораторные работы по курсу "Логическое программирование" являются эффективным средством развития у студентов навыков самостоятельной научноисследовательской работы. В ходе выполнения лабораторных работ студенты:
 практически усваивают наиболее важные теоретические положения курса;
 закрепляют навыки работы на ЭВМ и знакомятся с основными приемами реализации элементов систем программирования;
 развивают способности к самостоятельной творческой работе при решении системных задач.
Лабораторный практикум включает работы, предусмотренные учебной программой курса "Логическое программирование".
Первые три работы являются вводными в том смысле, что знакомят студентов с новым языком программирования, в основе построения которого положена иная математическая модель, если сравнивать этот язык с процедурноориентированными языками, такими, как Паскаль, Си и т.д. Простота математической модели этого языка позволяет студентам, имеющим опыт работы на персональном компьютере и знакомым с системой Турбо, уже на первых занятиях самостоятельно анализировать и разрабатывать простейшие логические, программы. Основной метод работы на этих занятиях  это работа по аналогии. Поэтому каждая программа, предлагаемая студентам для исследования, должна выполняться в режиме трассировки. Одна из основных целей первых трех работ – добиться полного понимания учащимися механизма унификации и механизма бектрекинга, которые являются основой вычислительной модели логического программирования.
В последующих трех работах студенты изучают основные приемы программирования на языке Пролог на примере обработки самых распространенных структур данных, таких, как списки, деревья, графы, строки и файлы. В этих работах, так же как и в трех первых, важной частью являются исследования и анализ готовых программ, но разработка индивидуальных заданий носит творческий характер.
Практические навыки и умения, полученные студентами в процессе выполнения данных лабораторных работ, позволят им в дальнейшем, в случае необходимости, продолжить более глубокое изучение данной проблемы.
Для каждой лабораторной работы определяется ее содержание и содержание отчета.
Отчет по каждой лабораторной работе защищается на занятиях в сроки, предусмотренные графиком самостоятельной работы. Защита отчета проходит в форме беседы между студентом и преподавателем. Она заключается в проверке результатов выполнения задания, выяснения теоретических положений темы задания и ответов на вопросы, которые приведены в конце каждой работы.
Зачет по лабораторному практикуму студент получает после выполнения и защиты всех установленных планом работ.
Зачет по лабораторному практикуму студент получает после выполнения и защиты всех установленных планом работ.
 
Лабораторная работа №1
Введение В ТурбоПролог
Цель работы
Ознакомиться с особенностью работы Турбооболочки для языка ПРОЛОГ, с принципами программирования па языке ПРОЛОГ, структурой программы в ТурбоПрологе.
Содержание работы
1. Изучить материал, изложенный в литературе [3, с. 645].
2. Изучить методические указания к лабораторным работам № 1,2 (с. )
2. Выполнить задания, приведенные в данной лабораторной работе.
3. Оформить отчет.
4. Защитить лабораторную работу, ответив на контрольные вопросы.
Содержание отчета
1.         Тексты задания.
2.         Тексты программ.
3.         Результаты выполнения.
4.         Схема поиска решения или пояснения к полученным результатам.
Методические указания
Для того чтобы лучше понять алгоритм поиска решения в Прологе и принцип программирования в этой системе, необходимо выполнить все предложенные упражнения и задания в режиме трассировки.
Задания
1.         Следующая программа представляет собой законченную программу ТурбоПролога, служащую небольшим телефонным справочником. Так как используются только стандартные типы данных – секция domains в этой программе не нужна.
predicates
    phone_number(symbol,symbol)
clauses
   phone_number(“Albert”,”ETY3665”) .
   phone_number(“Betty”,”5555233”).
   phone_number(“Carol”,”9091010”).
   phone_number(“Dororty”,”4388400”).
Наберите эту программу в окне редактора, запустите программу на выполнение, а затем по очереди задайте ей следующие вопросы:
a.         phone_number(“Carol”, Number)
b.         phone_number(Who,”4388400”)
c.         phone_number(“Albert”, Number)
d.         phone_number(Who,Number)
Теперь измените предложения. Предположим, что Kim и Dorothy имеют один и тот же номер телефона. Добавьте этот факт в секцию clauses и введите цель:
       phone_number(Who,”4388400”)
2.         Наберите эту программу в окне редактора
 predicates
    isletter(char)
clauses
    isletter(Ch):  'a'<= Ch, Ch<='z'.
    isletter(Ch):  'A'<=Ch, Ch<='Z'.
Запустите программу и испытайте по очереди каждую из этих целей:
a.         isletter('x')
b.         isletter('2')
c.         isletter('hello')
d.         isletter(a)
e.         isletter(X)
Определите декларативный смысл предложений. Объясните, почему некоторые цели не обрабатываются ТурбоПрологом.
 3. Наберите следующую программу в окне редактора
predicates
       can_buy(symol,symbol) /* может купить*/
       person(symbol)               /*человек*/
       car(symbol)                     /*машина*/
      likes(symbol,symbol)        /*нравится*/
      for_sale(symbol)               /*продается*/
clauses
          can_buy(Name, Model) :   
           person(Name) and
           car(Name) and
           likes(Name, Model) and
           for_sale(Model).
           person (kelly).
            person (judy).
            car(lemon).
           car(hot_rod).
           likes(pizza, hot_rod).
           likes(judy, pizza).
           for_sale (pizza).
           for_sale (lemon).
            for_sale (hot_rod).
Что могут купить Judy и Kelly? Кто может купить hot_rod. На приглашение Goal в диалоговом окне вы можете задать следующие вопросы:
can_buy (Who, What)       /* Who    =? What = ? */
can_buy (judy, What)       /* What =?                     */
can_buy (kelly, What)      /* What =?                     */
can_buy (Who, hot_rod) /* Who =?                      */
Добавьте факты о стоимости машины и о текущих счетах в банке у Kelly, Judy и т.д. Измените правило покупки автомобиля с учетом этих фактов. Проверьте новую программу теми же вопросами, что и раньше. Пролог отвечает именно то, что вы и ждали?
4. Данное задание выполните в ТурбоПрологе. Считая, что отношение РОДИТЕЛЬ определено как
            РОДИТЕЛЬ(пам,боб).
            РОДИТЕЛЬ(том,боб).
            РОДИТЕЛЬ(том,лиз).
            РОДИТЕЛЬ(боб,энн).
            РОДИТЕЛЬ(боб,пат).
            РОДИТЕЛЬ(пам,джим).
а) найдите, какими будут ответы на следующие вопросы:
            РОДИТЕЛЬ(джим,Х)
            РОДИТЕЛЬ(Х,джим)
            РОДИТЕЛЬ(пам,Х), РОДИТЕЛЬ(X,пат)
            РОДИТЕЛЬ(пам,Х), РОДИТЕЛЬ(X,У). РОДИТЕЛЬ(У,джим)
 
б) сформулируйте на Прологе следующие вопросы об отношении      РОДИТЕЛЬ;
            Кто родитель Пат?
            Есть ли у Лиз ребенок?
            Кто является родителем родителя Пат?
в) Переведите следующие утверждения в правила на Прологе:
            Всякий, кто имеет ребенка,  счастлив, введя одноаргументное отношение СЧАСТЛИВ.
            Всякий X, имеющий ребенка, у которого есть сестра или брат, имеет двух детей, введя новое отношение ИМЕТЬ_ДВУХ_ДЕТЕЙ.
            Определите отношение ВНУК (Х,У), используя отношение РОДИТЕЛЬ.
            Определите отношение ТЕТЯ (Х,У) через отношения РОДИТЕЛЬ и СЕСТРА.
Сформулируйте вопросы к вновь введенным правилам.
Контрольные вопросы
 
1. Что такое Прологпрограмма?
           2. Синтаксис и семантика Пролог  предложений.
3. Типы предложений Пролога, их назначение и декларативный смысл.
4. Переменная, ее роль и область действия в Пролог  программе.
5. Что является результатом работы Пролог  программы? Как он формируется?
6. Структура программы в ТурбоПрологе (основные разделы), краткая характеристика каждого раздела.
7. Согласование типов и преобразование типов в ТурбоПрологе.
Лабораторная работа №2
Разработка первой программы на Прологе
Цель работы
На примере простейших баз данных научиться описывать факты и простейшие отношения между объектами на языке Пролог.
Содержание работы
 
1. Прочитать теоретический материал [1, с. 1343], [2, c. 1847] и методические указания.
2. Выполнить индивидуальное задание. 
3. Оформить отчет.
4. Ответить на контрольные вопросы.
5. Защитить лабораторную работу.
Содержание отчета
1. Текст задания.
2. Описать декларативный смысл фактов и предложений разрабатываемой программы.
3. Описать декларативный смысл целей и привести деревья поиска решения для поставленных целей.
Методические указания к выполнению лабораторных работ № 1,2.
      Используя знания, полученные при выполнении первой лабораторной работы, напишите свою первую программу по аналогии с ранее рассмотренными программами.
Ниже приведены основные начальные сведения о Прологе и ТурбоПрологе, с которыми Вы познакомились, выполняя первую лабораторную работу.
1. Программы на Прологе включают в себя фразы двух типов (также известных под названием "предложения"): факты и правила.
Факты соответствуют связям и свойствам, о которых вы (программист) знаете, что они всегда истинны.
Правила соответствуют зависимым связям, так как они позволяют Прологу выводить одно утверждение из другого. Правило становится истинным, если доказывается, что истинно заданное множество условий. Каждое правило зависит от доказательства истинности соответствующих условий.
2. Все правила в Прологе имеют две части: заголовок и тело, соединенные символом "if". Символ "if" можно заменить обозначением ":". Заголовок содержит заключение правила. Тело  это множество (конъюнкция) условий, которые    должны быть истинны, для того, чтобы Пролог мог доказать истинность заголовка правила.
Факт – это частный случай правила. Факт – это правило, состоящее из одного заголовка (не содержащее тала).
3. Определив для Пролога множество фактов и правил, вы можете задавать   вопросы (формировать цель): это называется   запросом к   системе. Вопрос – это частный случай правила (правило без заголовка), содержащий только условия, требующие доказательства. Вопрос может быть конъюнктивным (конъюнкция целей). Пролога.
4. Для доказательства цели (ответа на запрос) механизм вывода Пролога ищет в программе правило или факт, заголовок которого сопоставляется (унифицируется) с целью. Пролог всегда   ищет   решение, начиная   с первого факта или правила в программе, и просматривает   их    до   достижения   самого   последнего. Найдя нужное правило, механизм вывода Пролога берет   из тела   этого правила условия (поочередно, слева направо)   и пытается их доказать, ставя новые цели для разрешения. Если все условия из тела правила оказываются истинны (доказаны из программы),   то цель считается истинной. Если же не   все    условия истинны      использование    правила   ни   к   чему не приводит. В этом случае Прологсистема пытается найти другое правило для доказательства исходной цели. Если же ей не удается этого делать, то поставленная цель не может быть выведена из программы (является ложной).
5. Программа   на   Турбо  Прологе   имеет   следующую   общую    структуру:
domains      /* ...объявление доменов ... */
 predicates /* ...объявление предикатов ... */
goal             /* ...подцель_1, подцель_2, и т.д. ... */
clauses         /* ...предложения (факты и правила) ... */
6. В секции clauses размещаются факты и правила, с которыми будет работать   Турбо  Пролог,      пытаясь    доказать   цель    программы.   
7. В секции predicates   объявляются    предикаты   и   типы (домены) аргументов этих предикатов. Имена предикатов должны начинаться с буквы (строчной), за   которой следует последовательность латинских букв,   цифр и символов подчеркивания (до 250 знаков). В именах предикатов нельзя использовать символы пробела, минуса, звездочки, обратной и прямой   черты.
 Объявление предиката   имеет   следующую   форму:
 
predicates   
     predicateName (argument_ type1, argument_ type2, ..., argument_typeN)
 
Здесь argument_ type1, argument_ type2, ..., argument_typeN – либо стандартные домены, либо домены, объявленные вами в секции domains. Объявление домена аргумента и описание типа аргумента суть одно и то же.
8. Секция   domains – это секция, в которой вы объявляете любые нестандартные   домены, используемые вами для аргументов ваших предикатов. Домены в Прологе являются аналогами типов в других языках. Основными стандартными доменами Турбо  Пролога   являются – char,   integer, real, string,   и symbol; более   подробно   стандартные   домены описаны в следующих разделах. Основная форма объявления доменов имеет следующий вид:
domains 
argument _type1, … , argument _typeN = < стандартный   домен >
 argument 1, … , argument N = < составной   домен 1 >;
                                                        < составной   домен 2 >;            
                                                                        <...>;
                                                        < составной домен N >.
9. В секции goal вы задаете внутреннюю цель своей программы, что позволяет программе запускаться независимо от среды разработки. Если внутренняя цель включена в программу, то Турбо Пролог выполняет поиск только первого решения, и связываемые с переменными значения не выводятся на экран. Если внутренняя цель не используется, то в процессе работы вы будете вводить в диалоговом окне внешнюю цель. При использовании внешней цели (без использования секции goal) ТурбоПролог ищет все решения и выводит в диалоговое окно все значения, связываемые с переменными, присутствующими в цели.
10. Арность (размерность) предиката   это число принимаемых им аргументов. Два предиката с одним именем могут иметь различную арность. Предикаты с одним именем, но с различными версиями арности должны собираться вместе и в секции predicates, и в секции clauses; при этом   предикаты с различными арностями (но с одним именем) рассматриваются как абсолютно разные.
11. Правила имеют форму:
ЗАГОЛОВОК :  <Подцель1>, <Подцель2>,…,<ПодцельN>.
 Для разрешения правила Пролог должен разрешить все его подцели, создав при этом соответствующее   множество связанных переменных. Если же одна из подцелей ложна, Пролог возвратится назад и просмотрит альтернативные решения предыдущих подцелей, а затем вновь пойдет вперед, но с   другими   значениями переменных. Такой процесс    называется   " поиск с возвратом ".
12. Символ Пролога "if" отличается от "IF", используемых в других языках: правило Пролога работает в соответствии с условной формой then/if, тогда как оператор других языков IF работает в соответствии с условной формой if/then.
13. Менее часто используемыми секциями программ на ТурбоПрологе являются секции database и constans, а также различные глобальные (global) секции (секция database будет нами использоваться в следующей лабораторной работе).
Задания
1. Разработайте   базу данных, содержащую сведения об игрушках: название игрушки (кукла, кубики, мяч, и т.д.), ее стоимость и возрастные границы детей, для которых игрушка предназначена. Получить следующие сведения:
а) название игрушек, цена которых не превышает 4 руб. и которые подходят детям 5 лет;
б) название игрушек, которые подходят как детям 4 лет, так и детям 10 лет;         
в) цены всех кубиков;
г) можно ли подобрать игрушку, любую, кроме мяча, подходящую ребенку 3 лет, и дополнительно мяч так,
чтобы суммарная стоимость покупки не превосходила 6 руб.;
д) название наиболее дорогих игрушек (цена которых отличается от самой дорогой игрушки не более чем на 1 руб.
2. Сведения об ученике состоят из его имени и фамилии, названии класса, отметок, полученных учениками в последней четверти. Составьте предложения, которые позволяли бы получить самую разнообразную информацию об учениках. Например:
а) можно было узнать, имеются ли в школе однофамильцы;
б) сколько отличников в такомто классе и т.д.
3. Разработайте базу данных библиотеки с самыми типичными отношениями между объектами (поиск книг по автору, поиск автора по названию книги, должники и т.д).
4. Разработайте базу данных  городской транспорт. (Простейший вариант.)
5. Разработайте базу данных  лекарства. Необходимо учесть симптомы болезни, возраст больного, противопоказания, стоимость, наличие и т.д.
6. Разработайте базу данных  продукты (магазины, ассортимент, стоимость, фирма производитель и т.д.).
7. Разработайте базу данных  одежда (по аналогии с заданием 1) .
8. Разработайте базу данных  кафедра (списочный состав, читаемые курсы, время и место проведения занятий, взаимозаменяемость и т.д.).
Контрольные вопросы
1. Что такое унификация? Алгоритм унификации. Приведите примеры.
2. Сравните операцию унификации с операцией присваивания в традиционных языках программирования.
3. Сравните вычислительные модели логического программирования: Пролога и ТурбоПролога.
4. Основной механизм управления в Прологе.
5. Дерево поиска решений. Способы обхода дерева. Влияет ли порядок правил и порядок целей в предложении на дерево поиска решений.
Лабораторная работа №3
Внутренняя база данных Турбо   Пролога
Цель работы
Понять принципы создания, управления и использования внутренних баз данных в ТурбоПрологе, научиться использовать их при проектировании программ.
Содержание работы
1.Ознакомиться со справочным   материалом,   приведенным в    методических указаниях.
2.В процессе изучения   справочного материала необходимо выполнить программы, приведенные в тексте, анализируя полученные результаты.      
3. Выполнить задание.
4. Оформить отчет.
5.Защитить работу.
 
Содержание отчета
1.         Текст задания.
2.         Тексты разработанных программ.
3.         Результаты выполнения.
4.         Привести схему поиска решения одной из поставленных целей.
В этой работе мы опишем, как нужно объявлять секции database и как можно изменить содержание вашей внутренней базы данных в процессе выполнения Пролог  программы.
Внутренняя база данных состоит из фактов, которые вы можете непосредственно добавлять и удалять из вашей программы на ТурбоПрологе во время ее исполнения. Вы можете объявлять предикаты, описывающие внутреннюю базу данных в секции database вашей программы и использовать эти предикаты таким же образом, как используются   предикаты,   описанные в секции predicates.
Для добавления новых фактов в базу данных в ТурбоПрологе используются предикаты asserta   и   assertz, а предикаты   retract   и   retractall служат для удаления существующих фактов. Вы можете изменить содержание вашей базы данных, сначала удалив факт, а потом вставив новую версию этого факта (или совершенно другой факт). Предикат   consult   считывает факты из файла и добавляет их к внутренней базе данных, a предикат   save сохраняет содержимое внутренней секции   database   в файле.
ТурбоПролог интерпретирует факты, принадлежащие к базе данных, таким же образом, как обычные предикаты. Факты предикатов внутренней базы данных хранятся в таблице, их можно легко изменять, тогда как обычные предикаты для достижении максимальной скорости компилируются в двоичный код. 
Объявление внутренней базы данных
Для того чтобы воспользоваться внутренней базой данных, необходимо объявить ее в секции database. Ключевое слово database определяет начало последовательности объявлений предикатов, описывающих внутреннюю базу данных. Секция database может выглядеть, например, так, как в следующем примере:
 
domains
        name, address=string
        age=integer
        genter=male; female
database
       person(name, address, age, gender)
 predicates
       male(name, address, age)
       female(name, age, gender)
       child(name, age, gender)
clauses
       male(Name, Address, Age) : person(Name, Address, Age, male) …
 
В этом примере вы можете использовать предикат person таким же образом, как используются другие предикаты ( male, female, child). Единственное отличие состоит в том, что вы можете добавлять и удалять факты для предиката person во время работы программы.
Важно отметить следующее:
1. Вы можете добавлять в базу данных только факты, но не правила.
2. Факты базы данных не могут содержать свободных переменных.
Информация о том, как обойти эти два ограничений, содержится в приложении "Метапрограммирование", в Справочном руководстве по Турбо  Прологу.
Допускается наличие нескольких секций database в программе, но для этого нужно явно указать  имя каждой секции database. Это требуется потому, что предикаты   consult   и   save могут загружать и сохранять определенную секцию database   по имени.
 
database – mydatabase
      myFirstRelation(integer) 
      mySecondRelation(real, string)
      myThirdRelation(string)
goal
       consult(“example.dba”, mydatabase),    
       retract(myFirstRelation(1)),
       asserta(myFirstRelation(0)),
       save(“example.dba”, mydatabase).
 
Такое описание создает базу данных с именем mydatabase. Если вы не дадите имени для внутренней базы данных, то по умолчанию ей присваивается стандартное имя dbasedom.
Важно понимать, что имена предикатов базы данных в модуле являются уникальными. В двух различных секциях database нельзя использовать одинаковые имена предикатов.
Для того, чтобы ввести в программу факты, существует три основных способа:
– включение фактов в состав вашей секции clauses;
– во время выполнения программы с помощью предикатов asserta и assertz;
– загрузка файла, содержащего факты базы данных, с использованием предиката consult.
 
Все стандартные предикаты ТурбоПролога ( asserta,    assertz,    retract,   retractall, consult   и save) могут иметь один или два аргумента. Необязательный второй аргумент представляет собой имя внутренней базы данных. Мы опишем эти предикаты далее. Обозначение "/1" и "/2" после каждого имени предиката указывает необходимое число аргументов для данной версии предиката.
Предикат asserta ставляет новый факт в базу данных перед имеющимися фактами для данного предиката, предикат assertz вставляет факты после данного предиката.
Добавление фактов имеет следующий формат:
 
аsserta(<факт>) 
аsserta(<факт>, databaseName)   
assertz(<факт>)    
assertz(<факт>, databaseName)
 
 Поскольку имена предикатов базы данных уникальны внутри программы или модуля, для предикатов asserta   и   assertz всегда известно, куда нужно добавлять факт. Однако, для того чтобы обеспечить работу с нужной базой данных, в целях проверки типа можно использовать необязательный второй аргумент.
Первый предикат следующего примера вставит факт о Suzanne, описанный предикатом person, после всех фактов person, хранящихся в текущий момент в памяти. Второй вставит факт о Michael перед всеми имеющимися фактами предиката   person, третий  вставит факт о   John    после всех других фактов likes   в базе данных перед всеми другими фактами likes.
 
         assertz (person(“Suzanne”, ”New Haven”, 35, female))
         asserta (person(“Michael”, ”New York”, 26, male))
         assertz (likes(“John”, “money”), likesDatabase)
         asserta (likes(“Susanne”, “hard work”))
 
После вызова этих предикатов база данных в памяти с произвольным обращением будет выглядеть так, как будто вы начали работу со следующими фактами:
         /* Внутренняя база данных  dbasedom*/
        person(“Michael”, ”New York”, 26, male).
         /*… другие факты person … */
        person(“Suzanne”, ”New Haven”, 35, female).
        /* Внутренняя база данных  likesDatabase */
        likes(“John”, “money”).
       /* … другие факты likes …*/
       likes(“Susanne”, “hard work”). 
                               
Предикат   retract(<факт>) удаляет первый факт в вашей базе данных, который совпадает с фактом <факт>. Этот предикат является недетерминированным (возвращает не одно решение). При поиске с возвратом предикат retract   возвращает альтернативные решения и удаляет все совпадающие факты до тех пор, пока они имеются. В случае базы данных с именем databaseName предикат retract имеет следующий формат:
retract(<факт>, databaseName ).
 
Предположим, в вашей программе имеются следующие секции database:
 
     database
      person(string, string, integer)
database – likesDatabase
 likes(sting, string)      
 dislikes(string, string)
    clauses
/ * база данных   dbasedom */
asserta(person(“Fred”, “Capitola”, 35, male)).
assert (person(“Fred”, “Omaha”, 37, male)).
assert (person(“Michael”, “Brooklin”, 26, male)).
/*база данных  likesDatabase*/
assert(likes(“John”, “money”)).  
assert(likes(“Jane”, “money”)).
assert(likes(“Chris”, “chocolate”)).  
assert(likes(“John”, “broccoli”)).
dislikes(“Fred”, “broccoli” ).
dislikes(“Michael”, “beer”).
   
Для программы с такими секциями database можно последовательно задать следующие цели:
retract(person("Fred", _, _, _))
retract(likes( _,"broccoli")) 
retract(likes( _, "money"), likesDatabase)
retract(person("Fred", _, _, _), likesDatabase)
 
Первая цель удалит первый факт person о Fred из базы данных dbasedom (имя которой задается по умолчанию). С помощью второй цели из базы данных likesDatabase будет удален первый факт, унифицируемый с likes(X, “broccoli”). При этом ТурбоПролог знает, из какой базы производить удаление, поскольку имена предикатов базы данных уникальны; предикат person находится только в неименованной базе данных, а предикат likes только в базе likesDatabase.
Третья и четвертая цель показывают, как Вы можете использовать для проверки типа второй аргумент. Третья цель успешно реализуется, удаляя первый факт, унифицируемый с likes(X,”money”)   из   likesDatabase. А четвертая цель выдаст ошибку, потому что нет (и не может быть) факта person в базе данных likesDatabase. Сообщение об ошибке выглядит следующим образом:
506 Type Error: The functor does belong to the domain (функтор не относится к данному домену).
Следующая цель иллюстрирует, как Вы можете получить и вывести на печать все значения базы данных с помощью недетерминированного предиката    retract:  
goal
    retract(person(Name, _, Age,_)),
   write(Name, “, ”, Age),
   fail.
 
С помощью предиката retract вы можете также удалить все факты из заданной секции базы данных. Если при вызове retract в качестве первого аргумента указана свободная переменная, то для определения того, из какой секции database нужно произвести удаление, будет анализироваться второй аргумент. Например:
goal
retract(X, mydatabase), write(X), fail.
  
Предикат retractall(<факт>) удаляет из вашей базы данных все факты, унифицируемые с термом <факт>. Этот предикат всегда завершается успешно и является детерминированным. Из retractall выходные значения переменных получить нельзя. Это означает, что нужно использовать анонимные переменные, обозначаемые символом подчеркивания   "_". Для задания имени базы данных в предикат    retractall   вводится второй аргумент:
      retractall(<факт>, databaseName).
Так же как и в случае предикатов    assert   и   retract , для проверки типа можно использовать второй аргумент. Если при вызове предиката retractall в качестве первого аргумента используется символ подчеркивания, то из указанной секции database можно удалить все факты.
 Следующая цель удаляет все факты о мужчинах из базы данных с фактами person: 
         retractall(person(_, _ , _ male )).
Следующая цель удаляет все факты из базы mydatabase:
        retractall(_ , mydatabase).
 
Предикат   consult   считывает из файла   fileName   факты, описанные в секции database, и вставляет их в конец соответствующей секции внутренней базы данных (аналогично тому, как предикат assertz включает факты). Предикат consult имеет один или два аргумента:
consult(fileName) 
consult(fileName, databaseName)
Однако, в отличии от assertz, если вы вызовете consult только с одним аргументом (без имени базы данных ), то в файле должны находиться только факты из указанной базы данных.   Если файл содержит чтонибудь кроме фактов указанной базы, то предикат consult, когда он дойдет до этого, возвратит ошибку.
Обратите внимание, что предикат   consult считывает по одному факту. Если файл содержит десять фактов, а в седьмом факте имеется какаянибудь синтаксическая ошибка, consult занесет шесть первых фактов в базу данных, после чего система выдаст сообщение об ошибке.
Отметим, что предикат   consult может считывать файлы только в том формате, который создает предикат save (для включения фактов с максимально возможной скоростью). Файлы не должны содержать:
 прописных символов;
 пробелов за исключением тех, которые содержатся внутри;
 строк в двойных кавычках;
 комментариев;
 пустых строк;
 символов без двойных кавычек.
При создании или изменении файла с фактами в редакторе, а не программно, нужно соблюдать аккуратность.
 
Предикат save сохраняет факты из указанной базы данных в файле. Этот предикат имеет один или два аргумента.
save( fileName)
save( fileName, databaseName)
 
При вызове предиката   save только с одним аргументом (без имени базы данных ) в файле   fileName   будут сохранены факты из базы данных databasedom, используемой по умолчанию.
При вызове предиката save с двумя аргументами (имя файла и имя базы данных) в указанном файле будут сохранены факты из секции   databaseName   внутренней базы данных.
 
Итак, перед выполнением лабораторной работы суммируем полученные сведения:
1. Внутренняя база ТурбоПролога состоит из фактов вашей программы, сгруппированных в секции database. Предикаты, определяемые пользователем и используемые в этих группах фактов, можно объявлять с помощью ключевого слова database.
2.Секциям database можно давать имена (с помощью которых создается соответствующий внутренний домен). По умолчанию доменом для неименованной секции database является домен dbasedom. В программе может присутствовать несколько секций   database, но каждая из них при этом должна иметь уникальное имя. Заданный предикат базы данных можно описать только в одной секции database.
3. С помощью стандартных предикатов asserta, assertz и consult можно добавлять факты к внутренней базе данных во время работы программы. Можно также с помощью предикатов   retract   и   retractall   удалять эти факты во время работы программы.
4. Предикат   save сохраняет факты из секции database в файле (в определенном формате). С помощью редактора можно создавать или редактировать такой файл фактов, а затем можно вносить факты из файла в программу с помощью предиката consult.
5. Вы можете обращаться к предикатам базы данных в программе таким же образом, как и ко всем другим предикатам.
6. При использовании внутренних доменов, сгенерированных для секции database, можно работать с фактами, как с термами.
© Рефератбанк, 2002 - 2024