Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаба_4.rtf
Скачиваний:
23
Добавлен:
27.03.2015
Размер:
143.41 Кб
Скачать

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. Практическая часть

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]