Ниже приведен текст программы (файл v8_212.prw)
%2.1.2.
МАМА(Оля,Петя);
ПАПА(Сергей,Катя);
МАМА(Лена,Сергей);
ПАПА(Толя,Оля);
БАБУШКА(X,Y)<-МАМА(X,Z),МАМА(Z,Y);
БАБУШКА(X,Y)<-МАМА(X,Z),ПАПА(Z,Y);
ДЕДУШКА(X,Y)<-ПАПА(X,Z),ПАПА(Z,Y);
ДЕДУШКА(X,Y)<-ПАПА(X,Z),МАМА(Z,Y);
Далее рассмотрим применение программы. Программа отвечает на вопросы о составе семьи.
Приведем примеры запросов:
? ДЕДУШКА(X,Петя);
? МАМА(X,Y);
Результат работы программы:
X=Коля
X=Оля
Y=Катя
X=Лена
Y=Сергей
Задача 2.2.4
2.2.4. На языке Пролог-Д напишите базу знаний, в которой определяется функция, заданная соотношением:
ìx, если x <-1,
F(x)= í x+1, если -1<x<1,
îx, если x >1.
Разрабатываемая программа предназначена для вычисления значений функции, указанной в задании. Программа вычисляет значения функции для аргументов, задаваемых пользователем.
Ниже приведен текст программы (файл v8_224.prw)
%2.2.4
ЗНАЧЕНИЕ(X,F)<-МЕНЬШЕ(X,-1),РАВНО(-1,F);
ЗНАЧЕНИЕ(X,F)<-МЕНЬШЕ(-1,X),МЕНЬШЕ(X,1),СЛОЖЕНИЕ(X,1,F);
ЗНАЧЕНИЕ(X,F)<-МЕНЬШЕ(1,X),РАВНО(X,F);
Приведем примеры запросов:
%Примеры вычислений
?ЗНАЧЕНИЕ(2,F);
?ЗНАЧЕНИЕ(-3,F);
?ЗНАЧЕНИЕ(0.2,F);
Результат работы программы:
F=2
F=-1
F=1.2
Нетрудно убедиться, что вычисления выполненны верно.
Чтобы работать с программой необходимо делать запросы: ЗНАЧЕНИЕ(аргумент,F);
После выполнения запроса в F будет содержатся значение вычисленного выражения.
Задача 2.2.5
2.2.5. Какие сложности могут возникнуть в базе знаний о мамах, если у двух мам дети будут тезками? Напишите программу на Прологе-Д, которая находит имя мамы мальчика Петя второго по порядку в базе знаний. Его маму зовут Оля, а не Саша.
Если в базе знаний о мамах, двух мам дети будут тезками, могут возникнуть сложности с однозначным определением имени матери.
Разрабатываемая программа предназначенна для того, чтобы определять имена матерей по именам их детей.
Ниже приведен текст программы (файл v8_225.prw)
%2.2.5.
%База мам и детей
МАМА(1,Наташа,Катя);
МАМА(2,Саша,Петя);
МАМА(3,Света,Ваня);
МАМА(4,Лена,Катя);
Пример запроса в ситуации, когда у матерей дети – тезки
%Какие сложности могут возникнуть в базе знаний о мамах, если у двух мам дети будут тезками?
? МАМА(_,X,Катя);
X=Наташа
X=Лена
Итак, для ребенка мы получили 2-х матерей.
Следующая часть задания:
%Поиск имя мамы мальчика Петя второго по порядку в базе знаний. Его маму зовут Оля, а не Саша.
? МАМА(2,X,Петя),РАВНО(X,Саша),НЕ(РАВНО(X,Оля));
Результат работы:
X=Саша
Итак, мы определили имя мамы мальчика Петя второго по порядку в базе знаний. Его маму зовут Оля, а не Саша.
Задача 2.3.2
2.3.2. Написать на языке Пролог-Д базу знаний, описывающую вычисление суммы чисел натурального ряда.
Разрабатываемая программа предназначена для вычисления суммы ряда натуральных чисел. Для выполнения задания воспользуемся следующим рекурсивным определением искомой cуммы:
1)S(0)=0
2)S(n)=n+S(n-1)
Ниже приведен текст программы (файл v8_232.prw)
%2.3.2.
%унификация вычисленного значения с выходной переменной
Сумма(0,S,S);
%рекурсивный вызов процедуры поиска суммы пока N>0
Сумма(N,P,S)<-СЛОЖЕНИЕ(N,P,L),СЛОЖЕНИЕ(M,1,N),Сумма(M,L,S),!;
Пример использования программы:
%пример вызова предиката
? Сумма(10,S);
Результат:
S=55
Несложная проверка показывает правильность произведенных вычислениий.
Для использования программы, надо вызывать предикат Сумма(X,S), подставляя вместо X число, до которого надо найти сумму.
Задача 2.3.1
2.3.1. Написать на языке Пролог-Д базу знаний, описывающую вычисление факториала.
Программа предназначенна для вычисления факториала числа n!=1*2*3…*n.
Воспользуемся следующим рекурсивным определением факториала:
1)0!=1
2)n!=n*(n-1)!
Итак, будем рекурсивно вызывать факториал, пока аргумент не станет равным – 0.
Программа аналогична программе для поиска суммы натуральных чисел.
Ниже приведен текст программы (файл v8_231.prw)
%2.3.1.
Факториал(N,F)<-Факториал(N,1,F);
%унификация вычисленного значения с выходной переменной
Факториал(0,F,F);
%рекурсивный вызов процедуры вычисления факториала, N*(N-1)*(N-2).....2*1 пока N>0
Факториал(N,P,F)<-УМНОЖЕНИЕ(N,P,S),СЛОЖЕНИЕ(M,1,N),Факториал(M,S,F),!;
Пример использования программы:
%пример вызова предиката
? Факториал(5,F);
Результат:
F=120
Несложная проверка показывает правильность произведенных вычислениий.
Для использования программы, надо вызывать предикат Факториал(X,F), подставляя вместо X число, факториал которого надо найти . Следует учесть, что факториал растет очень быстро и не задавать больших значений аргумента.
Задача 2.4.1
2.4.1. Напишите на языке Пролог-Д базу знаний, описывающую прямоугольный треугольник.
Разрабатываемая программа предназначена для рисования прямоугольного треугольника по его катетам. Задача заключается в том, чтобы по катетам найти координаты вершин и соединить их прямыми линиями.
Ниже приведен текст программы (файл v8_241.prw)
%2.4.1.
%рисуем прямоугольный треугольник с катетами a и b
ПрямоугТреуг(a,b)<-ЗАПИСЬ_В("grp:"),СЛОЖЕНИЕ(10,a,c),СЛОЖЕНИЕ(10,b,d),
ЛИНИЯ(10,10,c,10,1),ЛИНИЯ(c,10,10,d,1),ЛИНИЯ(10,d,10,10,1);
Пример использования программы:
%Пример
? ПрямоугТреуг(100,150);
Для того, чтобы построить треугольник с требуемыми катетами, достаточно вызвать предикат ПрямоугТреуг, задав параметры.
Результат выполнения примера:
Задача 2.5.4
2.5.4. Напишите базу знаний, описывающую удаление n-oго элемента списка
Разрабатываемая программа предназначена для удаления элемента с заданным номером из списка.
Для реализации решения нам потребуется один раз прочитать список и записать все элементы, за исключением удаляемого, в другой в обратном порядке. После чего потребуется переписать список, с удаленным заданным элементом, в прямом порядке.
Ниже приведен текст программы (файл v8_254.prw)
% 2.5.4
%Предикат удаления N-ого символа из списка L и помещение результата в список S
%Первый вызов DELNEL(L,N,1,[],Z) - удаляет символ и записывает результат в обратном порядке
% второй вызов DELNEL(L,0,1,[],S) - обращает обратно
DELNEL(L,N,S)<-DELNEL(L,N,1,[],Z),DELNEL(Z,0,1,[],S);
DELNEL([],_,_,S,S);
%если не N-ный символ
DELNEL([X|T],N,I,Y,S)<- НЕ(РАВНО(N,I)),ДОБАВИТЬ(X,Y,Z),СЛОЖЕНИЕ(1,I,J),DELNEL(T,N,J,Z,S);
%если N-ный символ
DELNEL([X|T],N,I,Y,S)<-РАВНО(N,I),СЛОЖЕНИЕ(I,1,J),DELNEL(T,N,J,Y,S);
%добавление элемента X в начало списка Y
ДОБАВИТЬ(X,Y,[X|Y]);
Пример использования программы, удалим 3-й элемент из списка:
%пример работы.
? DELNEL([1,8,9,7,5],3,S);
Результат выполнения примера:
S=[1,8,7,5]
Для того, чтобы удалить элемент из списка необходимо вызвать предикат DELNEL, задав в качестве параметров, список, номер удаляемого элемента и имя результирующего списка.
Список литературы
1. Абдикеев Н.М. Проектирование интеллектуальных систем в экономике. Учебник / М.: Экзамен, 2004 – 526с.
2. Алексеев М.Н., Бешенков С.А., Гейн А.Г., Григорьев С.Г. Информатика и информационные технологии: практические работы / Миасс, 2000 - 42 с.
3. Бешенков С.А., Гейн А.Г., Григорьев С.Г. Информатика и информационные технологии. Екатеринбург: Уральский рабочий, 1995 - 134 с.
4. Бешенков С.А. Школьная информатика: новый взгляд, новый курс// Педагогическая информатика. N2. 1993 с. 5-10
5. Гаврилова Т.А., Хорошевский В.Ф., Базы знаний интеллектуальных систем. Учебник/ Санкт-Петербург:Питер, 2000- 382 с.
6. Григорьев С.Г., Морозова Е.В. Информатика и информационные технологии: Сборник задач / ЛБЛ-Балтика. Санкт-Петербург, 1996 – 32 с.