Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Примеры программ




Рассмотрим некоторые программы, демонстрирующие обработку числовых данных. Отметим важную особенность процедур, создаваемых на языке Прологе: они, в отличии от встроенных функций, не могут появляться в арифметических выражениях. Если требуется, например, переменной R присвоить значение, равное умноженному на три большему из двух выражений X и Y, то, используя определенную ниже процедуру максимум, это можно записать так:

максимум(X,Y,Z), R is 3*Z.

Пример: Написать процедуру, вычисляющую максимум из двух чисел.

максимум(X,X,X).максимум(X,Y,X):- X>Y.максимум(X,Y,Y):- X<Y.

В предикате максимум/3 третий аргумент является максимумом из двух чисел - первого и второго аргументов. Нетрудно понять смысл каждого из правил данной процедуры. Посмотрим на реакцию интерпретатора Пролога на запросы, содержащие данный предикат.

?- максимум(20,50,X).X = 50Yes?- максимум(100,50,X).X = 100Yes?- максимум(X,50,100).X = 100Yes

Последний ответ показывает, что наш предикат позволяет находить ответ на вопросы типа: "Каково должно быть число, чтобы максимум из искомого числа и числа 50, равнялся бы 100?".

Задание
Объясните, почему интерпретатор Пролога ответил "No" в следующем запросе:

?- максимум(X,50,40).No

Пример: Составить процедуру гипотенуза/3, которая по двум катетам прямоугольного треугольника вычисляет его гипотенузу.

Воспользуемся теоремой Пифагора и встроенной функцией sqrt для вычисления квадратного корня:

гипотенуза(X,Y,Z):- Z is sqrt(X**2 + Y**2).

Программа корректно вычисляет гипотенузу, но если мы попробуем при ее помощи найти один из катетов, то убедимся, что процедура работает не вполне правильно. Чтобы избежать этого добавим проверку того, что первые два аргумента предиката - числа, для чего используем встроенный предикат integer/1:

гипотенуза(X,Y,Z):- integer(X), integer(Y), Z is sqrt(X**2 + Y**2).

Теперь наша программа работает корректно:

?- гипотенуза(3,4,X).X = 5Yes?- гипотенуза(3,'a',X).No?- гипотенуза(3,X,5).No

Пример: Написать предикат, который по двум парам чисел - длинам катетов прямоугольных треугольников – определяет величину меньшей из гипотенуз.

Воспользуемся процедурой гипотенуза/3, разобранной выше, и встроенной функцией min/2:

мин_гип(A1,B1,A2,B2,Min):- гипотенуза(A1,B1,C1), гипотенуза(A2,B2,C2), Min is min(C1,C2).

Запросы к интерпретатору Пролога могут выглядеть так

?- мин_гип(3,4,8,6,X).X = 5Yes?- мин_гип(3,4,Y,6,X).No

Пример: Факториалом натурального числа n называют произведение всех целых чисел от 1 до n включительно. Для записи факториала числа n используют обозначение n!:

n!=n*(n-1)*(n-2)*...*2*1=n*(n-1)!

Следующая процедура вычисляет факториал числа. Обратите внимание на использование рекурсии в данной процедуре:

факториал(1,1).факториал(N,R):- integer(N), N>1, N1 is N-1, факториал(N1,R1), R is N*R1.

Первое правило (так называемый терминальный случай, то есть тот момент выполнения процедуры, когда она перестает вызывать сама себя) гласит, что факториал единицы равен единице.

Второе правило есть просто запись определения факториала: результат R получается умножением числа N на факториал числа, меньшего на единицу. Оно будет срабатывать при всех n>1 потому, что интерпретатор Пролога просматривает базу данных сверху вниз и переходит к следующему правилу или факту только в том случае, когда он не может выполнить текущее правило.

Пример: Написать программу на языке Пролог, печатающую сумму всех цифр введенного с клавиатуры числа.

Для решения данной задачи воспользуемся двумя предикатами. Предикат сумма/2 имеет своим первым аргументом число, сумма цифр которого, является его вторым аргументом. Второй предикат - печать_суммы/0 - запрашивает число, вызывает предикат сумма/2 и печатает полученный результат.

сумма(X,Y):- integer(X), X<10, Y is X.сумма(X,Y):- integer(X), X1 is X//10, сумма(X1,Y1), Z is X mod 10, Y is Y1+Z. печать_суммы:- write('Введите число (в конце точка): '), read(X), nl, сумма(X,Y), write('Сумма цифр числа '), write(X), write(' равна '), write(Y), nl.

Правило печать_суммы не имеет аргументов, данные вводятся с клавиатуры и затем при помощи механизма унификации передаются другим подцелям данного правила.

В заключение приведем процедуру для решения известной головоломки "Ханойская башня", изобретенной французским математиком Люка в 1883 году и украшенной им же легендой:

"Где-то в непроходимых джунглях, недалеко от города Ханоя, есть монастырь бога Брамы. В начале времен, когда Брама создавал Мир, он воздвиг в этом монастыре три высоких алмазных стержня и на один из них возложил 64 диска, сделанных из чистого золота. Он приказал монахам перенести эту башню на другой стержень (в соответствии с правилами, разумеется). С этого времени монахи работают день и ночь. Когда они закончат свой труд, наступит конец света."

Правила перемещения дисков таковы: разрешается снимать со стержня только верхний диск, запрещается класть больший диск на меньший, при каждом ходе передвигается только один диск.

Процедура move/4 дает решение этой головоломки.

% move(число_дисков, откуда, куда, через)move(1,X,Y,_):- write('Move top disk from '), write(X), write(' to '), write(Y), nl. move(N,X,Y,Z):- N>1, M is N-1, move(M,X,Z,Y), move(1,X,Y,_), move(M,Z,Y,X).

Запрос для решения задачи о трех дисках выглядит так

?- move(3,left,right,center).

Как видите, здесь снова применяется рекурсия. Попробуйте изменить процедуру так, чтобы сообщения выводились на русском языке. После этой попытки Вы поймете, почему с естественно-языковыми системами чаще всего общаются на английском языке.




Поделиться с друзьями:


Дата добавления: 2014-12-27; Просмотров: 503; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.014 сек.