ИИСС. Практикум решения задач по курсу Основы искусственного интеллекта
Скачать 0.73 Mb.
|
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫВычислить сумму 1+2+3+…+N. Подсчитать сумму ряда целых четных чисел от 2 до N. Вычислить сумму ряда целых нечетных чисел от 1 до n. Найти значение произведения: 2*4*6*...*26 Найти значение произведения: 1*3*5*...*11 Вычислить значение n-го члена ряда Фибоначчи: f(0)=0, f(1)=1, f(n)=f(n-1)+f(n-2). Используя базу данных и правило предок из примера 2 составить правило для определения всех потомков-мужчин. Используя базу данных и правило предок из примера 2 составить правило для определения всех потомков-женщин. Отчет о выполненной самостоятельной работе должен содержать: тему лабораторной работы; условие задачи; листинг программы; результаты ее тестирования. 1.8 Решение логических задач в ПРОЛОГе ПРОЛОГ позволяет наиболее естественным образом решать логические задачи, моделируя процесс размышления человека с помощью правил. Многие логические задачи связаны с рассмотрением нескольких конечных множеств с одинаковым количеством элементов, между которыми устанавливается взаимно-однозначное соответствие. В ПРОЛОГе эти множества можно описывать как базы данных, а зависимости между объектами устанавливать с помощью правил. Пример 1 В автомобильных гонках три первых места заняли Алеша, Петя и Коля. Какое место занял каждый из них, если Петя занял не второе и не третье место, а Коля - не третье? Решение Традиционным способом задача решается заполнением таблицы. По условию задачи Петя занял не второе и не третье место, а Коля - не третье. Это позволяет поставить символ '-' в соответствующих клетках.
Между множеством имен участников гонки и множеством мест должно быть установлено взаимнооднозначное соответствие. Поэтому определяем занятое место сначала у Пети, затем у Коли и, наконец, у Алеши. В соответствующих клетках проставляем знак '+'. В каждой строке и каждом столбце должен быть только один такой знак.
Из последней таблицы следует, что Алеша занял третье место, Петя - первое, Коля - второе. Программа на ПРОЛОГе будет выглядеть следующим образом: PREDICATES имя(string) место(string) соответствие(string,string) решение(string,string,string,string,string,string) CLAUSES имя(алеша). имя(петя). имя(коля). место(первое). место(второе). место(третье). /* Устанавливаем взаимнооднозначное соответствие между множеством имен и множеством мест, X - имя,Y - место */ /* Петя занял не второе и не третье место */ соответствие(X, Y):-имя(X), X=петя, место(Y),not(Y=второе), not(Y=третье). /* Коля занял не третье место */ соответствие(X, Y):- имя(X), X=коля, место(Y), not(Y=третье). соответствие(X, Y):- имя(X), X=алеша, место(Y). /* У всех ребят разные места */ решение(X1,Y1,X2,Y2,X3,Y3):- X1=петя,соответствие(X1,Y1), X2=коля,соответствие(X2,Y2), X3=алеша,соответствие(X3,Y3), Y1<>Y2, Y2<>Y3, Y1<>Y3. GOAL решение(X1,Y1,X2,Y2,X3,Y3), write(X1," - ",Y1),nl, write(X2," - ",Y2),nl,write(X3," - ",Y3),nl. Результат выполнения программы петя - первое коля - второе алеша - третье Пример 2 Наташа, Валя и Аня вышли на прогулку, причем туфли и платье каждой были или белого, или синего, или зеленого цвета. У Наташи были зеленые туфли, а Валя не любит белый цвет. Только у Ани платье и туфли были одного цвета. Определить цвет туфель и платья каждой из девочек, если у всех туфли и платья были разного цвета. Решение PREDICATES имя(string) туфли(string) платье(string) соот(string,string,string) решение(string,string,string,string,string,string, string,string,string) CLAUSES имя(наташа). имя(валя). имя(аня). туфли(белый). туфли(синий). туфли(зеленый). платье(белый). платье(синий). платье(зеленый). % X – имя, Y – цвет туфель, Z – цвет платья соот(X,Y,Z):-имя(X),туфли(Y),платье(Z), X=наташа,Y=зеленый,Y<>Z. соот(X,Y,Z):-имя(X),туфли(Y),платье(Z), X=валя,not(Y=белый), not(Z=белый), Y<>Z. соот(X,Y,Z):-имя(X),туфли(Y),платье(Z),X=аня,Y=Z. решение(X1,Y1,Z1,X2,Y2,Z2,X3,Y3,Z3):- X1=наташа,соот(X1,Y1,Z1), X2=валя, соот(X2,Y2,Z2), X3=аня, соот(X3,Y3,Z3), Y1<>Y2, Y2<>Y3, Y1<>Y3, Z1<>Z2, Z2<>Z3, Z1<>Z3. GOAL решение(X1,Y1,Z1,X2,Y2,Z2,X3,Y3,Z3), write(X1," туфли- ",Y1," платье- ",Z1),nl, write(X2," туфли- ",Y2," платье- ",Z2),nl, write(X3," туфли- ",Y3," платье- ",Z3),nl. Результат выполнения программы наташа туфли - зеленый платье - синий валя туфли - синий платье - зеленый аня туфли - белый платье - белый Пример 3 Витя, Юра и Миша сидели на скамейке. В каком порядке они сидели, если известно, что Миша сидел слева от Юры, а Витя слева от Миши. Решение PREDICATES слева(string,string) ряд(string,string,string) CLAUSES /* МишасиделслеваотЮры */ слева(миша, юра). /* Витя сидел слева от Миши */ слева(витя, миша). /* Объекты X, Y и Z образуют ряд, если Х слева от Y и Y слева от Z */ ряд(X, Y, Z):- слева(X,Y), слева(Y, Z). GOAL ряд(X, Y, Z), write(X,"-",Y,"-",Z),nl. Результат выполнения программы витя-миша-юра Пример 4 Известно, что тополь выше березы, которая выше липы. Клен ниже липы, а сосна выше тополя и ниже ели. Определить самое высокое и самое низкое дерево. Решение DOMAINS name=string PREDICATES выше(name,name) ряд(name,name,name,name,name,name) CLAUSES выше(тополь,береза). выше(липа,клен). выше(ель,сосна). выше(береза,липа). выше(сосна,тополь). ряд(X1,X2,X3,X4,X5,X6):-выше(X1,X2),выше(X2,X3), выше(X3,X4),выше(X4,X5), выше(X5,X6). GOAL ряд(X,_,_,_,_,Y),write("Самое высокое - ",X),nl, write("Самое низкое - ",Y),nl. Результат выполнения программы Самое высокое - ель Самое низкое - клен |