4. Лабораторная работа по теме «Реализация ветвлений в языке Пролог»
Учебные цели: Приобретение умений и навыков реализации ветвлений, решение задач упорядочение объектов и закрепление умений ввода и вывода данных различного типа на языке Пролог.
Порядок выполнения работы:
-
Изучить краткое теоретическое введение.
-
Выполните предложенные задания в практической части на компьютере.
-
Оформите отчет.
4.1. Краткое теоретическое введение Ввод и вывод данных в языке Пролог
Для организации ввода используются стандартные предикаты readint(X), readreal(X), readchar(X), позволяющие ввести соответственно целое, вещественное число, одну литеру или строку символов. Для вывода данных на экран служат стандартные предикаты write(Y) и nl – перевод курсора на новую строку.
Пример. Закончим раздел примером вычисления суммы двух введенных с клавиатуры целых чисел.
Predicates
vvod (integer, integer) .
summa(integer, integer, integer) .
Clauses
vvod (Х,Y) if write("введите X, Y"), readint(X), readint(Y).
summa (Х,Y,Z) if vvod (Х,Y), Z=X+Y.
Goal
summa (Х,Y,Z), write(Z), nl.
Система выведет на экран приглашение к вводу, дождется ввода с клавиатуры двух чисел и выведет полученное значение Z.
В языке ПРОЛОГ используется ряд встроенных функций для вычисления выражений, некоторые из которых перечислены Таблице 2.
Встроенные функции и операции Таблица 2 |
|
Обозначение |
Тип операции |
>,<,=,>=,<=,<> |
Операции сравнения |
+, -, *, / |
Арифметические операции |
X mod Y |
Остаток от деления X на |
X div Y |
Частное от деления X на |
abs(X) |
Абсолютная величина числа |
sqrt(X) |
Квадратный корень из X |
sin(X), cos(X), tan(X), arctan(X) |
Тригонометрические функции |
exp(X) |
Возведение в степень X |
log(X) |
Десятичный логарифм (ln) числа |
ln(X) |
Натуральный логарифм числа |
Реализация ветвления в языке Пролог
Язык PROLOG не содержит инструкций, аналогичных инструкциям разветвления и повторения в процедурных языках. Реализация этих процессов происходит в соответствии с правилами логического вывода. Поэтому для программирования нескольких реализаций одного и того же предиката следует построить столько же правил, сколько ветвей у разветвления. При этом у всех ветвей головой правил служит один предикат.
предикат if <первая ветвь разветвления>.
предикат if <вторая ветвь разветвления>.
предикат if <последняя ветвь разветвления>.
Пример 1. Рассмотрим программу определения типа образовательного учреждения, которое посещает ребенок, в зависимости от его возраста.
Predicates
vvod(integer)
vyvod(symbol)
posechaet(integer,symbol)
otvet
Clauses
vvod (Х) :- write("введите возраст ребенка"), readint(X), nl.
vyvod (Y) :- write("ребенок посещает"), readchar(Y).
posechaet (Х,Y) if X<3, Y="ясли".
posechaet (Х,Y) if X>=3, X<=6, Y="дет. сад".
posechaet (Х,Y) if X>6, Y="школа".
otvet :- vvod (Х), posechaet (X,Y), vyvod (Y).
Goal
otvet.
Пример 2. Решение задач на упорядочение объектов.
Рыбак поймал окуня, ерша и щуку. Щуку он поймал раньше окуня, ерша позже щуки, но раньше окуня. Какая рыба поймана раньше всех?
Predicates
ranshe(symbol, symbol)
porydok(symbol, symbol, symbol )
Clauses
ranshe(”щука”, ”окунь”).
ranshe (”щука”, ”ерш”).
ranshe (”ерш”, ”окунь”).
porydok (X,Y,Z) :- ranshe (Х,Y), ranshe (Y,Z).
Goal
porydok (X,Y,Z).
Пример 3. Решение логических задач.
Многие логические задачи связаны с рассмотрением нескольких конечных множеств с одинаковым количеством элементов, между которыми устанавливается взаимно-однозначное соответствие. На языке Пролог эти множества можно описывать как базы данных, а зависимости между объектами устанавливать с помощью правил.
В автомобильных гонках три первых места заняли Алеша, Петя и Коля. Какое место занял каждый из них, если Петя занял не второе и не третье место, а Коля – не третье?
Имя |
I место |
II место |
III место |
Алеша |
|
|
|
Петя |
|
– |
– |
Коля |
|
|
– |
Традиционным способом задача решается заполнением таблицы. По условию задачи Петя занял не второе и не третье место, а Коля –- не третье. Это позволяет поставить символ '–' в соответствующих клетках. Между множеством имен участников гонки и множеством мест должно быть установлено взаимно-однозначное соответствие. Поэтому определяем занятое место сначала у Пети, затем у Коли и, наконец, у Алеши. В соответствующих клетках проставляем знак '+'. В каждой строке и каждом столбце должен быть только один такой знак.
Имя |
I место |
II место |
III место |
Алеша |
– |
– |
+ |
Петя |
+ |
– |
– |
Коля |
– |
+ |
– |
Из последней таблице следует, что Алеша занял третье место, Петя – первое, Коля – второе.
На языке Пролог структура программы будет следующей: сначала перечисляются данные – имена и номер занятого места, а затем записываются правила, связывающие эти два множества.
/* База данных имен */
имя(алеша).
имя(петя).
имя(коля).
/* База данных призовых мест */
место(первое).
место(второе).
место(третье).
/* Устанавливаем взаимно-однозначное соответствие
между базами данных, 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.
Для получения ответа следует выполнить запрос
? – решение(X1,Y1,X2,Y2,X3,Y3).
В ответ Пролог должен выдать имена ребят и занятые ими места. Наберите программу в соответствии с синтаксисом языка Турбо Пролог и выполните рассмотренный запрос. Есть ли другие варианты ответов?
4.2. Практическая часть