Cамарский государственный архитектурно-строительный университет О. В. Прохорова Практикум по интеллектуальным информационным системам Специализированное учебно – методическое пособие по организации самостоятельной работы студентов по дисциплине «Интеллектуальные информационные системы» САМАРА 2012г. В пособии рассматривается ряд задач из области искусственного интеллекта. Приводятся решения задач с помощью языков логического и функционального программирования. Даются необходимые комментарии. Оглавление 1. Сопоставление фактов, правил, вопросов на языке ПРОЛОГ ........................... 3 2. Работа со структурами на языке ПРОЛОГ ........................................................... 6 3. Операторы и операции языка ПРОЛОГ .............................................................. 11 4. Операции сравнения на языке ПРОЛОГ............................................................. 14 5. Сопоставление в языке ПРОЛОГ ........................................................................ 14 6. Представление списков в языке ПРОЛОГ ......................................................... 15 7. Синтаксис языка ЛИСП. Представление списков. ............................................ 16 8. Работа с базовыми функциями в языке ЛИСП. ................................................. 19 9. Определение функций в ЛИСПе ......................................................................... 20 10. Логические функции. Управляющие структуры ЛИСПа ............................... 22 11. Ввод – вывод информации в ЛИСПе ............................................................... 23 ЛИТЕРАТУРА ........................................................................................................... 24 1. Сопоставление фактов, правил, вопросов на языке ПРОЛОГ Задача 1.1. Составить базу данных и программу на языке ПРОЛОГ для поиска ответов на вопросы: 1. Кто сестра Юли? 2. Кто ребенок Тома? Решение. На языке Пролог, представленном для обработки транслятором эта программа имеет вид: 3 parent(pam, bob). parent(tom, bob). parent(tom, liz). parent(tom, juli). parent(bob, ann). parent(bob, pat). parent(mary, ann). parent(pat, juli). male(tom). male(bob). male(jim). female(liz). female(juli). female(pam). female(pat). female(ann). child(X, Y) :- parent(Y, X). mother(X, Y) :- parent(X, Y), female(X). different(X, Y) :- not(X=Y). sister(X, Y) :- parent(Z, X), parent(Z, Y), female(X), different(X, Y). ?- sister(X, liz). Ответ системы Пролог: X=juli. ?-child(X, tom). 4 Ответ системы Пролог: X=juli. X=liz. Задача 1.2. Составьте программу на языке Пролог, которая могла бы ответить на вопрос – способен ли Сократ ошибаться? Решение. 1. Составим базу данных из следующих фактов: man (socrates). woman ( sofia_kovalevskay). 2. Составим правило, использование которого на основе известных фактов из базы данных может дать ответ на поставленный вопрос: fallible ( X ) : - man ( X ); woman ( X ). % Все люди способны ошибаться 3. Сформулируем вопрос и найдем на него ответ, используя программу: ? – fallible ( socrates). % Сократ способен ошибаться? Ответ системы Пролог: Yes Задача 1.3. Составить базу данных, правила (программу) на языке ПРОЛОГ для поиска ответа на вопрос: ? – пробабушка(Х,ира). 5 Решение. parent(tanya, peter). parent(serj, peter). parent(katia, ira). parent(peter, ira). male(peter). male(serj). female(tanya). female(ira). grandmother(H, X) :- parent(Y, X), parent(H, Y), female(H). ?- grandmother(H, ira). Ответ системы Пролог: H=tanya. 2. Работа со структурами на языке ПРОЛОГ Задача 2.1. Составить программу, проверяющую дату рождения сотрудника фирмы, используя первый или второй уровень понимания ИС. Решение. birthday(pam,date(21,april,1990)). birthday(bob,date(22,april,1990)). birthday(tom,date(23,april,1990)). birthday(mary,date(24,april,1990)). getday(X,Y,L,M) :- birthday(X,date(Y,L,M)). ?- getday(X,21,april,1990)? 6 Ответ системы Пролог: X=pam. ?- getday(mary,X,Y,Z). Ответ системы Пролог: X=24. Y=april. Z=1990. Задача 2.2. Создать объект прямоугольник. Решение. point(p1,coord(0,0)). point(p2,coord(22,22)). point(p3,coord(0,22)). point(p4,coord(22,0)). point(p5,coord(32,22)). point(p6,coord(32,0)). point(p7,coord(22,2)). point(p8,coord(2,22)). /* квадрат длины отрезка */ leng(X1,Y1,X2,Y2,Z):- Z is(X1-X2)*(X1-X2)+(Y1-Y2)*(Y1-Y2). /* у прямоугольника равны диагонали и равны противоположные стороны*/ rectangle (P1,P2,P3,P4,Z1,Z2,Z3,Z4) :point(P1,coord(X1,Y1)),point(P2,coord(X2,Y2)), 7 point(P3,coord(X3,Y3)),point(P4,coord(X4,Y4)), P1 \= P2, P1 \= P3, P1 \= P4, P2 \= P3, P2 \= P4, P3 \= P4, leng(X1,Y1,X3,Y3,Z1),leng(X2,Y2,X4,Y4,Z2),Z1=Z2, leng(X1,Y1,X2,Y2,Z3),leng(X3,Y3,X4,Y4,Z4),Z3=Z4. ?- rectangle (X,Y,Z,P,K,_,_,_,_). Ответ системы Пролог: X=P1. Y=P2. Z=P3. K=P4. X=P1. Y=P3. Z=P5. K=P6. … Задача 2.3. Составить базу данных, правила (программу) на языке ПРОЛОГ для поиска ответа на вопрос: ? – квадрат(Z1,Z2,Z3,Z4). Решение. Будем использовать предыдущую БД, поменяв последнее правило, получим: /* у квадрата равны диагонали и равны смежные стороны*/ sqr(P1,P2,P3,P4,Z1,Z2,Z3,Z4) :- point(P1,coord(X1,Y1)),point(P2,coord(X2,Y2)), point(P3,coord(X3,Y3)),point(P4,coord(X4,Y4)), P1 \= P2, P1 \= P3, P1 \= P4, P2 \= P3, P2 \= P4, P3 \= P4, leng(X1,Y1,X3,Y3,Z1),leng(X2,Y2,X4,Y4,Z2),Z1=Z2, leng(X1,Y1,X2,Y2,Z3),leng(X3,Y3,X4,Y4,Z4),Z3=Z4. 8 ?- sqr(X,Y,Z,P,K,_,_,_,_). Ответ системы Пролог: X=P1, Y=P2, Z=P3, K=P4, Z1=Z2,Z2=484, Z3=Z4,Z4=968; X=P1, Y=P2, Z=P4, K=P3, Z1=Z2,Z2=484, Z3=Z4,Z4=968; и тд. Задача 2. 4. Составить базу данных, правила (программу) на языке ПРОЛОГ для поиска ответа на вопрос: ? – прямоугольный_треугольник(Z1,Z2,Z3). Решение. Воспользуемся БД предыдущего примера, вставив правило, определяющее прямоугольный треугольник. /* у прямоугольного треугольника сумма квадратов сторон равна квадрату гипотенузы*/ right_triangle(X1,Y1,X2,Y2,X3,Y3) :- point(P1,coord(X1,Y1)), point(P2,coord(X2,Y2)), point(P3,coord(X3,Y3)), P1 \= P2, P1 \= P3, P2 \= P3, leng(X1,Y1,X2,Y2,Z1), leng(X1,Y1,X3,Y3,Z2), P is Z1+Z2 , leng(X3,Y3,X2,Y2,Z3), P=Z3. ?- right_ triangle (X1,Y1,X2,Y2,X3,Y3). Ответ системы Пролог: 9 X1=Y1,Y1=X2,X2=0,Y2=X3,X3=22,Y3=0. Задача 2.5. Составить программу на языке ПРОЛОГ для поиска ответа на вопрос: ? – отрезок(X1,Y1,X2,Y2). Решение. point(p1,coord(0,0)). point(p2,coord(22,22)). point(p3,coord(0,22)). point(p4,coord(22,0)). point(p5,coord(32,22)). point(p6,coord(0,22)). point(p7,coord(32,0)). point(p8,coord(22,2)). point(p9,coord(2,22)). segment(X1,Y1,X2,Y2):-point(P1,coord(X1,Y1)),point(P2,coord(X2,Y2)),P1 \= P2. Ответ системы Пролог: X1=Y1,Y1=0, X2=Y2,Y1=22. Задача 2.6. Составить программу на языке ПРОЛОГ для вопрос: поиска ответа на ? – прямая(Z,R). Решение. point(5,6). 10 point(5,8). point(4,2). point(5,1). point(3,8). koeff(5). koeff(8). len(15). removal(0). /* смещение */ removal(1). /* прямая задается по точке, по коэффициенту и по смещению: y(x)=k*x+b */ line(K, B,X, Y) :- koeff(K), removal(B), point(X,Y). ?-line(5, 0,5, 6). Ответ системы Пролог: Yes. 3. Операторы и операции языка ПРОЛОГ Задача 3.1. Записать операторную запись в виде структуры 4*f - r*a Решение. -(*(4,f),*(r,a)) 11 Задача 3.2. Найдите ответ ?-Y = 2+5. Решение. Система выдаст ответ: Y=2+5. Задача 3.3. Составьте решение предыдущего примера Решение. ?-Y is 2+5. Система выдаст ответ: Y=7 Задача 3.4. Составьте на языке ПРОЛОГ решение арифметического примера: Y = 18\(5+1) Решение. ?-Y is 18\(5+1). Система выдаст ответ: Y=3 12 Задача 3.5. Пусть функция f в системе известна и имеет вид: f(X, Y, Z):-Z is Y*Y - Y*X. Как система ответит на вопрос: ?- f(2, 3, R). Решение. Система выдаст ответ: R= 4 Задача 3.6. Если определить сумму как функцию выражением: sum(X1, X2, X):-X is X1 + X2. а произведение: mul(X1, X2, X):-X is X1 * X2. Какой выдаст ответ система на запрос: ?-mul(1,sum(2, 3, X),Y). Решение. Система выдаст ответ: Y=5 Задача 3.7. Что система ответит на запрос ?- sum(1, 1, X1), mul(X1, X1, X). 13 Решение. Система выдаст ответ: X=4 4. Операции сравнения на языке ПРОЛОГ Задача 4.1. Определить отношение "ниже" lower/2 для двух точек поверхности, определенных структурой point(X, Y). Решение. Составим правило, характерное для проверки такого утверждения: lower (point(X1, Y1), point(X2, Y2):-Y1<Y2. тогда на вопрос ?- lower (point( 1, 1), point( 2, 2). Система выдаст ответ: Yes 5. Сопоставление в языке ПРОЛОГ Задача 5.1. Найти ответ на вопрос: ?-a(B,c(x,D))=a(d,c(3,Х)). Решение. No B=d 14 х=3 (ошибка!) D=Х (ошибка!) Задача 5.2. Найти ответ на вопрос: ? - triangle(point(1, 5), A, point(B, 8))= triangle(X, point(2, 1), point(3, 8)) Решение. Yes X=point(1, 5) A=point(2, 1) B=3 6. Представление списков в языке ПРОЛОГ Задача 6.1. Представить структуру в виде дерева или диаграммой "виноградная лоза": .(а ,.(b,.(c,[ ]))) Решение. 15 Задача 6.2. Представить структуру в виде дерева или диаграммой "виноградная лоза": .(а ,[ ],.(b,.(c) Задача 6.3. Представить структуру диаграммой "виноградная лоза"для вложенных списков [a,b,[c,d]] : Решение. - на верхнем уровне три элемента - на втором уровне два элемента. Задача 6.4. Представить структуру диаграммой "виноградная лоза"для вложенных списков [a,[b,e],[c,d]]. 7. Синтаксис языка ЛИСП. Представление списков. Задача 7.1. Сколько элементов в списке? 16 ((((( первый ) 2) второй) 4) 5) Ответ: 2 Задача 7.2. Сколько элементов в списке? (NIL()) Ответ: 2 Задача 7.3. Записать на языке ЛИСП функцию a*c \ (b + a ) Ответ: ( \ ( ( *a c) (+b a ) ) ) Задача 7.4. Вычислить на языке ЛИСП функцию *(*(- 2 1 ) ( - 4 2 )) Ответ: 2 Задача 7.5. Вывести только выражение, а не результата вычисления от 5 отнять 3. Ответ: a) b) *(‘(-5 3 ) ) ( -5 3 ) *( quote (- 5 3 )) ( - 5 3 ) Задача 7.6. Какой результат дает вычисление следующей функции: * ’( b c ’( a d ) Ответ: ( b c a d ) Задача 7.7. Найти результат выполнения функции: 17 * ‘ 2.15 Ответ: 2.15 Задача 7.8. Найти результат выполнения функции: *(+‘(35)) Ответ: 8. 18 8. Работа с базовыми функциями в языке ЛИСП. SET, SETQ, SETF, CAR, CDR, CONS, NTH, LENGTH SET Функция связывает символ со значением, предварительно вычисляя значение аргументов. В качестве значения функция возвращает значение второго аргумента. SETQ Функция связывает символ со значением, не вычисляя значение первого аргумента. SETF Функция связывает значения символов со значением функции или со списком. CAR Функция извлекает голову из списка CDR Функция извлекает хвост из списка CONS Функция объединяет элементы в список NTH Функция извлекает элемент из списка LENGTH Функция определяет число элементов списка Задача 8.1. Что получится, если применить функцию: 1) *( set’a’( x y ) ) ? Ответ ( x y ). 2) *( set a’ bb ) ? Ответ bb. 3) *( setq a’ b ) ? Ответ b. 4) *( car ’( m n k ) ) ? 5) *( cdr ’( m n k ) ) ? 6) *( cdr ’( l ( n k ) ) ) ? 7) *( cdr ’k k k ) ? Ответ ( m ). Ответ ( n k ). Ответ (( n k )). Ответ ошибка! Нет списка. 19 8) *( cdr ’((a) ( c d ) ) ) ? Ответ (( c d )). 9) *( car ( cdr ’( a b c d ) ) ) ? Ответ ( b ). 10) *( cons ( - 2 1 ) ‘ ( - 3 4 )) ) ? Ответ ( 1 – 3 4 ). 11) *( cons ’( + 1 2 ) ‘ ( + 3 4 ) ) ? 12) *( cons ’( a b c ) d ) ? Ответ ( + 1 2 + 3 4 ). Ответ (a b c d ). 13) *( cons nil ( d )) ? Ответ (( d )). 14) *( cons ‘ ( a b )) ? Ответ ( a b ). 15) *( length ‘ ( ‘ (1) ‘ (( 2 ) ( + 3 4 ) ) ) ) ? Ответ ( 1 ( 2 ) 7 ) 3. 16) *( nth 3 ‘( a d b g f d s )) ? Ответ ( b ). 9. Определение функций в ЛИСПе Задача 9.1. Необходимо поместить три элемента в начало списка, причем эту операцию нужно выполнить несколько раз с разными элементами. Решение. Введем функцию с именем cons_3 и с параметрами x y c oldlist, тогда ее можно записать в виде: *(defun cons_3 ( x y c oldlist) (cons x ( cons y ( cons c oldlist ) ) ) ) *( cons_3 ‘a’b’c’ ( d x )) Ответ: ( a b c d x ). Задача 9.2. Определить функцию возведение в квадрат многочлена. 20 Решение. Введем функцию с именем square и с параметром num, тогда ее можно записать в виде: *(defun square (num) (* num num) *( square ( 7 ) ) Ответ 49. Задача 9.3. Применить введенную функцию предыдущего примера , как встроенную в присвоении значения переменной. Решение. *(setq z ( square ( + 2 3 ) ) ) ) Ответ 25. Задача 9.4. Определить функцию, которая помещает элемент new в список на последнее место, т.е. пусть был список ( a c d ) , после действия функции список должен принять вид ( a c d new). Решение. Введем функцию с именем insert_last с параметрами ( oldlist item), тогда ее можно записать в виде: *(defun insert_last ( oldlist item) (cons ( oldlist item ) ) ) Применение. *( insert_last ( ( a b c ) new ) ) Ответ: ( a b c new ). 21 Задача 9.5. Определить функцию, которая помещает элемент new в список на предпоследнее место, т.е. пусть был список ( a b c ) , после действия функции список должен принять вид ( a b new c). Решение. Введем функцию с именем insert с параметрами ( item oldlist ). Для простоты выкладок введем обозначение: А = (cons ( item ( cdr ( revers(oldlist ) ) ) Тогда искомую функцию можно записать в виде: *(defun insert (item oldlist ) ( revers ( cons ( ( last ( oldlist ) ) A ) ) ) Применение. *( insert ( new ( a b c ) ) ) Ответ ( a b new c ). 10. Логические функции. Управляющие структуры ЛИСПа Задача 10.1. Найти ответ системы на запрос выполнить функции: 1) * (member ‘c’ ( ( c) a b c ) ) Ответ: ( с) 2) *( member ‘ c’ ( ( c ) a b d ) ) Ответ: NIL Задача 10.2. Найти ответ системы на запрос выполнить функции: 1) *(not ‘( x y ) ) Ответ: NIL 2) *( or ‘( a b ) ( < 3 4 ) ‘ ( b c d ) ) Ответ: ( a b ) ( возвращает первый непустой элемент) 22 3) *( and ( atom x ) ( atom 1)) Ответ: NIL 4) *( and ( atom x ) ( atom y)) Ответ: y Задача 10.3. Определить функцию, которая проверяет, если l - список, то выбирает из него второй аргумент. Решение. Определим функцию: ( defun g_f ( l ) ( cond ( ( listp l ) ( car ( cdr ( l ) )) ( t nil ) ) ) Истинное выражение будет выполняться, если ни одно другое условие не выполняется. Проверка. *(g_f ( a b c )) Ответ: b 11. Ввод – вывод информации в ЛИСПе Задача 11.1. Ввести функцию чтения выражения, вычисляя его Решение. *( defun f1 ( l ) ( print ( set ‘ l ‘ ( read ) ) ) ) Проверка. *( f1 ( l) 23 +3 2 ( ввод) Ответ: 5 ( печать) ЛИТЕРАТУРА 1. Братко И. Алгоритмы искусственного интеллекта на языке PROLOG. Изд.: Вильямс, 2004. – 637 с. 2. Ездаков А.Л. Функциональное и логическое программирование. Изд.: Бином, 2009. – 119 с. 3. http://www.mari-el.ru/mmlab/home/prolog/study_l.html 4. http://www.marstu.mari.ru:8101/mmlab/home/lisp/title.htm 24