Адаменко Логическое Программирование
- Адаменко Логическое Программирование И Visual Prolog
- Адаменко Кучуков Логическое Программирование Скачать
Логическое программирование на языке Visual Prolog: Учебное пособие. Читать бесплатно онлайн. Логика, логические операции. Которая связана с программированием микроконтроллеров.
Функциональное и логическое программирование 1-3. Методические указания к выполнению практических работ 4.1. Арифметика и обработка списков в LISP.
Задание функций Цель работы: Знакомство с базовыми средствами языка LISP, реализующими арифметические операции и обработку списков. Освоение механизма реализации пользовательских функций. Изучение особенностей интерпретатора XLISP-PLUS.
Основные понятия Для выполнения данной лабораторной работы вам понадобятся следующие системные функции 4, 5: 1) Задание пользовательской функции: defun. 2) Арифметические функции: sin, cos, tan, asin, acos, atan, log, exp, sqrt, expt. При вводе выражений в диалоговом режиме (т.е. Непосредственно в интерпретаторе) для немедленного прерывания ввода текущего выражения может быть использована комбинация клавиш Ctrl+ C.
С помощью стрелок ( и?) вы получаете доступ к истории команд. Обратите внимание, что при работе с интерпретатором языка XLISP- PLUS вы можете использовать внешние файлы с программами (расширение файла: lsp). Загрузить внешний файл можно с помощью меню или системной функции load. Задание на лабораторную работу 1. В соответствии с индивидуальным заданием реализуйте средствами Лиспа две пользовательские функции UF1 и UF2. Свяжите с символом UFR двухэлементный список, элементами которого будут результаты вычисления соответственно первой и второй пользовательской функций, полученные при произвольном значении их аргументов.
Свяжите с символом X1 список, обратный к списку UFR; с символом X2 – длину списка, а с символом X3 – результат сложения его элементов. Организация итерационных вычислений в LISP. Свойства символов Цель работы: Знакомство с базовыми средствами языка LISP для организации итерационных вычислений, а также функциями манипулирования свойствами символов. Основные понятия Достаточно часто решение какой-либо задачи требует организации нелинейных вычислений.
В LISP для их организации предусмотрены следующие функции 4, 5: – логические функции: not, and, or; – условные предложения: cond, if, when, unless; – условный выход из функции: return; – циклические предложения: loop, do, dotimes. Кроме того, для выполнения данной лабораторной работы вам могут понадобиться следующие системные функции: задание пользовательской функции ( defun); задание локальных символов ( let); объединение последовательных вычислений ( prog, prog1, prog2, progn); работа с консолью ( read, print). При работе с системой XLISP- PLUS прервать выполнение текущей итерации цикла позволяет комбинация клавиш Ctrl+ B. В языке LISP с любым символом может быть связано не только какое-то значение, но и дополнительная информация, представляемая как именованное свойство этого символа или набор таких свойств.
Данная возможность никак не зависит от типа символа, является ли он системным или пользовательским, связан в настоящий момент с каким либо значением или нет. Для работы со списком свойств символа в XLISP- PLUS предусмотрены специальные функции, в том числе 4: symbol- plist, get, setf, putprop, remprop.
Задание на лабораторную работу Средствами LISP и без применения рекурсии необходимо реализовать две пользовательские функции UF1 и UF2 в соответствии с вашим индивидуальным заданием. Табл. Индивидуальные задания.
№ Задание 1 1) Вычислить произведение двух целых положительных чисел (используя суммирование). 2) У имени города есть свойства x и y, которые содержат координаты местонахождения города. Определить функцию, вычисляющую расстояние между городами. 2 1) Вычислить значение n?го члена ряда Фибоначчи: f (0)=0, f(1)=1, f( n)= f( n–1)+ f( n–2). 2) Определить функцию, удаляющую все свойства символа. 3 1) Вычислить сумму ряда целых четных чисел от n до 2 n. 2) Определить предикат, проверяющий, обладает ли символ заданным свойством.
4 1) Вычислить x n (без использования функций exp и expt). 2) Пусть имена родителей некоторого лица хранятся как значения соответствующих свойств символа, обозначающего это лицо. Написать функцию ( parents x), возвращающую имена родителей, и предикат (sister s x y), который истинен, если x и y – сёстры.
5 1) Вычислить факториал n. 2) Пусть имена родителей некоторого лица хранятся как значения соответствующих свойств символа, обозначающего это лицо. Написать функцию ( parents x), возвращающую имена родителей, и предикат ( brothers x y), который истинен, если x и y – братья. 6 1) Вычислить произведение ряда целых нечетных чисел от 1 до 2 n+1.
2) Определить функцию, возвращающую список имён свойств символа (вы можете использовать системный предикат oddp). 7 1) Вычислить сумму n первых членов ряда x i = 1 / i.
2) Пусть имена родителей некоторого лица хранятся как значения соответствующих свойств символа, обозначающего это лицо. Написать функцию ( children x), возвращающую имена детей (если они есть), и предикат ( bcousins x y), который истинен, если x и y – двоюродные братья. 8 1) Вычислить сумму n первых (от 1 до n) нечётных членов ряда x i = x i -1 / i, где x 0=1. 2) Пусть имена родителей некоторого лица хранятся как значения соответствующих свойств символа, обозначающего это лицо. Написать функцию ( children x), возвращающую имена детей (если они есть), и предикат ( scousins x y), который истинен, если x и y – двоюродные сёстры. 9 1) Вычислить произведение n первых (от 1 до n) чётных членов ряда x i = x i?1 / i, где x 0=1. 2) Определите предикат ( EquPLсимвол1 символ2), проверяющий обладают ли два указанных символа одинаковым перечнем свойств (вы можете использовать системные предикаты member и oddp).
10 Составить список из n первых (от 1 до n+3) чисел, кратных трём Составить предикат, определяющий совпадает ли перечень свойств у двух заданных символов. Организация рекурсивных вычислений в LISP Цель работы: Знакомство с базовыми средствами языка LISP для организации рекурсивных вычислений и работы с файлами. Основные понятия Функция является рекурсивной, если в её определении содержится вызов этой же функции.
Рекурсия является простой, если вызов функции встречается в некоторой ветви лишь один раз. Простой рекурсии в процедурном программировании соответствует обыкновенный цикл. Пример: построение копии списка. (defun listcopy (list) (cond ((null list) nil);;граничноеусловие (t (cons (car list) (listcopy (cdr list))))));;рекурсия LISTCOPY (listcopy '(a b c)) (A B C) Язык LISP изначально был разработан для обработки списков. Однако с их помощью можно реализовать работу и с другими структурами данных, например, с деревьями. Пример: Пусть дерево имеет вид, представленный на рисунке.
Ему соответствует следующий список: (1 (2 (4 5) 3 (6))). Теперь вывести список всех непосредственных потомков вершины 2 можно, например, следующим образом: ( setq a '(1 (2 (4 5) 3 (6))) ) (1 (2 (4 5) 3 (6))) ( let ((b (car (cdr (second a))))) (cond ((listp b ) b)) ) (4 5) Для выполнения данной лабораторной работы вам могут понадобиться следующие системные функции 4, 5: 1) Задание пользовательской функции: defun. 2) Условные предложения: cond, if, when, unless. 3) Проверка типа символа: atom, listp, numberp. 4) Списковыефункции: car, cdr, cadr, first, second, last, nth. 5) Работаспотоками: open, read, write, close. 6) Трассировка выполнения функций: trace, untrace.
Задание на лабораторную работу 1. Создайте на жёстком диске файл inpdata. Txt, в который запишите список, представляющий ваше дерево.
Считайте описание дерева из файла и свяжите его с символом UTree. Разработайте рекурсивную функцию UFunc, выполняющую ваше индивидуальное задание.
Запишите результат выполнения функции UFunc на жёсткий диск в файл outdata. Исследуйте результаты применения отладочной функции trace к рекурсивной функции UFunc.
Исследуйте возможность применения функции print для получения отладочной информации в процессе выполнения функции UFunc. Табл. Индивидуальные задания. № Задание 1 Найти сумму положительных узлов бинарного дерева. 2 Проверить, входит ли заданный элемент в упорядоченное бинарное дерево.
3 Проверить, является ли заданное бинарное дерево упорядоченным. 4 Определить количество вершин в дереве.
5 Построить список листьев дерева. 6 Построить список вершин дерева, не являющихся листьями. 7 Определить количество листьев у дерева. 8 Построить дерево, каждый элемент которого образуется удвоением соответствующего элемента исходного дерева. 9 Вывести на экран дерево, начиная с корневой вершины и заканчивая его листьями.
10 Вывести на экран дерево, начиная с листьев и заканчивая корнем. Основы работы в системе Visual Prolog 5.2.
Цель работы: Получение основных навыков работы в системе. Изучение технологии подготовки и отладки Пролог-программ.
Основные сведения и порядок выполнения работы Среда Visual Prolog может быть запущена обычными средствами Windows. При этом будет открыт последний рабочий проект. Для создания новый проект командой главного меню Project New Project и настройте его параметры в диалоговом окне Application Expert. На закладке General необходимо указать название проекта, имя файла проекта ( VPR-файла) и базовый каталог проекта.
На закладке Target рекомендуется установить целевую платформу – “ Windows 32” и тип интерфейса ( UI Strategy) – Easywin. Нажмите кнопку Create для создания необходимых файлов проекта. Эксперт приложений автоматически создал программный модуль ( PRO-файл). Вы можете открыть его на редактирование с помощью команды File Open или двойным щелчком мыши на его имени в окне проекта. Данный модуль содержит минимальный код, необходимый для запуска программы. Вы можете модифицировать его необходимым образом.
Созданный вами проект может быть откомпилирован ( Ctrl+ F9) и запущен на выполнение ( F9) с помощью команд меню Project. При этом сообщения компилятора и сообщения об ошибках будут отображаться в специальных окнах. В состав Visual Prolog входит специальная утилита Test Goal ( Ctrl+ G). Она имитирует работу Пролог-интерпретатора, но выполняет только одну цель, указанную в секции GOAL текущего окна редактирования. При этом утилита обеспечивает вывод значений переменных, входящих в цель, и отображает результат вычисления цели (истина/ложь).
ВНИМАНИЕ: Для вновь созданного проекта в опциях компиляции ( Options Project Compiler Options Warnings) установите тип предиката по умолчанию как недетерминированный ( Default Predicate Type: Nondeterm). Любая Пролог-программа должна содержать секции CLAUSES и GOAL. В первой из них описываются известные факты и правила.
Факты описывают свойства объектов либо отношения между ними. Правила позволяют получать новые знания на основе уже имеющихся. Во второй секции указывается цель, выполняемая после запуска программы.
Кроме того, программа может включать в себя такие секции, как FACTS, DOMAINS и PREDICATES и др. Задание на лабораторную работу 1.
Создание программы Hello world. Запустите на исполнение среду Visual Prolog и создайте новый программный модуль ( File New).
Введите текст следующей программы: goal write('Привет мир'), nl. Запустите утилиту Test Goal.
Создание программы Parent Test. Запустите на исполнение среду Visual Prolog и создайте новый проект. Введите бинарное отношение РОДИТЕЛЬ и постройте на его основе программу, содержащую только факты вида parent (“Андрей”, “Игорь”), т.е. « Андрей является родителем Игоря». Пример в таблице.
Predicates parent(STRING, STRING) clauses parent('Николай ', 'Никита '). Parent('Николай', 'Ольга'). Goal parent('Николай ', X). Составьте перечень из 3-4 вопросов, которые могут быть сформулированы относительно данных фактов. ВНИМАНИЕ: однотипные вопросы не допускаются! Получите ответы на свои вопросы с помощью утилиты Test Goal.
Запустите проект на исполнение и сравните получаемые при этом результаты с выводом утилиты Test Goal. Добавьте информацию о том, каков пол людей, участвующих в отношении РОДИТЕЛЬ, с использованием унарных отношений ЖЕНЩИНА и МУЖЧИНА, например, woman ('Ольга'). Составьте перечень из 3-4 разнотипных вопросов, которые могут быть сформулированы относительно данных фактов, например. Goal parent('Николай ', X), woman(X).% Ищет дочь Николая 2.7. Получите ответы на свои вопросы с помощью утилиты Test Goal. Работа с отношениями на языке Пролог Цель работы: Изучение реляционного подхода к программированию. Получение практических навыков работы с отношениями на языке Пролог (на примере отношений родства).
Основные сведения и порядок выполнения работы При использовании реляционного подхода программа рассматривается как множество отношений между объектами, возможно, очень сложных. Основными задачами при составлении прикладной программы должны быть: анализ значимых сущностей и отношений в предметной области, выбор ограничений для представления этих сущностей и отношений, а затем – определение каждого отношения при помощи предложений языка Пролог. Для анализа бинарные отношения часто оказывается удобным представлять в виде графа.
Определяемые вами бинарные отношения должны соответствовать определённым свойствам сущностей, а также определённым ограничениям, обеспечивающим их целостность. Для аргументов любого бинарного отношения будет справедливо одно из следующих ограничений: «один-к-одному», «один-ко-многим», «многие-к-одному», «многие-ко-многим». После того, как отношение будет точно определено (т.е.
С учётом всех его свойств и ограничений), его можно использовать как независимый модуль при определении других отношений. В данной работе используются бинарные отношения, определённые на множестве людей. Введённые в разделе 4.4 отношения: РОДИТЕЛЬ ( parent), ЖЕНЩИНА ( woman) и МУЖЧИНА ( man), а также бинарное отношение СУПРУГИ ( married couple) являются базовыми и задаются в виде фактов. На основе базовых родственных отношений определяются производные отношения. Последние можно разбить на три группы: А) Близкие кровные родственники. Правнук (greatgrandson); 2.
Правнучка (greatgranddaughter); 3. N-правнук (ngrandson); 4. N-правнучка (ngranddaughter); 5. Двоюродныйбрат, кузен (firstcousinbrother); 6. Двоюроднаясестра, кузина (firstcousinsister); 7. Троюродныйбрат (secondcousinbrother); 8.
Троюроднаясестра (secondcousinsister); 9. N-юродныйбрат (ncousinbrother); 10. N-юроднаясестра (ncousinsister); 11. Двоюродныйдядя (firstcousinuncle); 12. Двоюроднаятётя (firstcousinaunt); 13. Троюродныйдядя (secondcousinuncle); 14.
Троюроднаятётя (secondcousinaunt); 15. N-юродныйдядя (ncousinuncle); 16. N-юроднаятётя (ncousinaunt); 17. Двоюродныйплемянник (firstcousinnephew); 18.
Двоюроднаяплемянница (firstcousinniece); 19. Троюродныйплемянник (secondcousinnephew); 20. Троюроднаяплемянница (secondcousinniece); 21. N-юродныйплемянник (ncousinnephew); 22. N-юроднаяплемянница (ncousinniece); 23. Отпрыск (любого уровня) (shoot); 24. N-юродный брат (любого уровня) (anycousinbrother); 25.
N-юродная сестра (любого уровня) (anycousinsister); 26. N-юродный дядя (любого уровня) (anycousinuncle); 27. N-юродная тётя (любого уровня) (anycousinaunt); 28.
N-юродный племянник (любого уровня) (anycousinnephew); 29. N-юродная племянница (любого уровня) (anycousinniece). Задание на лабораторную работу 1.
Составьте все перечисленные базовые отношения. Опишите их в виде ориентированного графа.
Каждому бинарному отношению должен соответствовать свой тип дуг. Представьте базовые отношения на языке Пролог. Определите в виде правил и представьте на языке Пролог отношения родства, соответствующие вашему индивидуальному заданию.
Адаменко Логическое Программирование И Visual Prolog
Пример: шурин брат жены wifesbrother(A,B):– man(B), marriedcouple(B,C), parent(D,C), parent(D,A), man(A), write(A, ' шурин для ', B), nl. Составьте перечень вопросов касающихся родственных отношений, следующих типов: 4.1.
Находится ли субъект a в отношении R с субъектом b? тип: R(a,b) 4.2. Кто находится в отношении R с субъектом a? тип: R(a,Y), R(X,b) 4.3. Найти все пары субъектов, находящихся в отношении R. тип: R ( X, Y ) 5. Получите ответы на свои вопросы с помощью утилиты Test Goal и проверьте их вручную.
Табл. Индивидуальные задания. № Задание № Задание 1 А1, А11, Б7, Б24, В1 2 А2, А12, Б8, Б18, Б25, В2 3 А3, А13, Б9, Б19, Б23, В10 4 А4, А14, Б10, Б20, В9, В11 5 А5, Б1, Б11, Б21, В8, В12 6 А6, Б2, Б12, Б22, В7 7 А7, Б3, Б13, Б26, В6 8 А8, Б4, Б14, Б27, В5 9 А9, Б5, Б15, Б28, В4 10 А10, Б6, Б16, Б29, В3 4.6. Работа со списками в языке Пролог Цель работы: Изучение реализации списков в языке Пролог. Получение практических навыков разработки процедур для обработки списков. Основные сведения и порядок выполнения работы Список в Прологе – это упорядоченный набор объектов одного и того же доменного типа, следующих друг за другом. Этот набор записывается в квадратных скобках, а сами объекты разделяются запятыми: 1,2,3,.
Длина списка ограничена только доступной системе памятью. Составляющие списка связаны между собой, поэтому с ними можно работать и как с одним целым (со всем списком сразу), и как с набором индивидуальных объектов (элементов списка).
Любой непустой список можно рассматривать как состоящий из головы (первый элемент списка) и хвоста (остальная часть списка). Голова является отдельной и неделимой частью списка, а хвост зачастую, если он не пуст, можно делить дальше.
Разделение на голову и хвост выполняется с помощью символа « ». С его помощью можно реализовать любую операцию над списками. В качестве примера рассмотрим реализацию базовых строковых функций языка Лисп средствами Пролога (результат формируется в последнем параметре): domains tlist = integer.% объявление домена-списка чисел predicates car(tlist,integer) cdr(tlist,tlist) cdar(tlist,integer) second(tlist,integer) cons(integer,tlist,tlist) length(tlist,integer) append(tlist,tlist,tlist) clauses car(H ,H).% H – голова списка cdr( T,T).% T – хвост списка cdar( X ,X). Second(,X ,X).% голова содержит два элемента списка cons(X,Y,X Y). Length( T,X):– length(T,Y),X=Y+1.
Append(H T1,X,H,T2):– append(T1,X,T2). Обратите внимание, предикаты length и append рекурсивны!
Многие предикаты можно использовать двояко: для получения результата и для проверки, правильным ли является некоторое утверждение (предположение) истинным при заданных значениях аргументов. Рассмотрим примеры: goal car(10,20,30, X).% X=10 goal cdr(10,20,30,X).% X=20,30 goal cdar(10,20,30,20).% yes goal second(10,20,30,15).% no goal cons(10,20,30,X).% X=10,20,30 goal cons(10,X,10,20,30).% X=20,30 goal length(10,20,30,22).% no goal length(10,20,30,X).% X=3 goal append(10,20,30,40,X).% X=10,20,30,40 goal append(10,20,X,10,20,30).% X=30 Списки можно использовать для реализации других составных типов данных, например, множеств, со всеми необходимыми операциями 10. Задание на лабораторную работу 1. Разработайте предикаты, реализующие функции, указанные в вашем индивидуальном задании. Предикаты типа а) предназначены для работы с одноуровневыми списками, а предикаты типа б) – для работы с множествами, допускающими повторение элементов. Разработайте всевозможные тесты для проверки ваших предикатов. Запустите на исполнение среду Visual Prolog.
Адаменко Кучуков Логическое Программирование Скачать
П олучите ответы на свои вопросы с помощью утилиты Test Goal и проверьте их вручную. Табл. Индивидуальные задания.
№ Задание 1 а) REMOVEODD – Удаление всех чётных элементов списка. Б) INTERSECT – Пересечение двух множеств. 2 а) REMOVE – Удаление заданного элемента из списка. Б) UNION – Объединение двух множеств (без повторения элементов). 3 а) REMOVEF – Удаление из списка первого вхождения заданного элемента. Б) DIFF – Разность двух множеств.
4 а) SUBSTITUTE – Замена всех вхождений заданного элемента в списке на новый элемент. Б) SIMDIFF – Симметрическая разность двух множеств.
5 а) MEMBER – Проверка принадлежности заданного элемента списку. Б) SUBSET – Проверка, является ли первое заданное множество подмножеством второго. 6 а) PARITY – Проверка чётности числа элементов в списке.
Б) EQU – Проверка равенства двух множеств. 7 а) REVERSE – Изменение порядка элементов в списке на обратный. Б) SETOFF – Нормализация множества (исключение из списка повторяющихся элементов). 8 а) ADDLAST – Добавление заданного элемента в конец списка.
Б) CART – Декартово произведение двух множеств. 9 а) SHIFT – Циклический сдвиг списка на один элемент вправо. Б) CHECKP – Проверка, является ли список «правильным» множеством (т.е. Каждый элемент «уникален», входит в множество лишь один раз). 10 а) REMOVESUBLIST – Удаление из списка всех подсписков.
Б) REMOVESINGLE – Удаление «уникальных» элементов из множества. Список литературы 1. Основные концепции языков программирования. — М.: Вильямс, 2001, 672. Филд А., Харрисон П. Функциональное программирование.
— М.: Мир, 1993, 637. Алгоритмы и рекурсивные функции. – М.: Наука, 1965, 392. Хювёнен Э., Сеппянен Й. — М.: Мир, 1990. Tom Almy XLISP-PLUS: Another Object-oriented Lisp (Version 3.0), 1997, 129. Дехтяренко И.А.
Декларативное программирование. — Сайт « SoftCraft», 2004. Функциональное программирование. Применение и реализация. — М.: Мир, 1983, 349. Городняя Л.В. Основы функционального программирования.
— М.: изд?во «ИНТУИТ.РУ», 2004, 280. Искусственный интеллект: стратегии и методы решения сложных проблем. – Вильямс, 2003, 864. Дискретная математика для программистов. — СПб: Питер, 2003, 304. Адаменко А.Н., Кучуков А.М. Логическое программирование и Visual Prolog.
— СПб.: BHV-Петербург, 2003, 992. Введение в экспертные системы. — М.: Вильямс, 2001, 624.
Программирование экспертных систем на Турбо Прологе. – М.: Финансы и статистика, 1994, 256. Программирование на языке Пролог для систем искусственного интеллекта. – М.: Мир, 1990, 560.