Главная » Просмотр файлов » Лекции в ворде

Лекции в ворде (1156536), страница 15

Файл №1156536 Лекции в ворде (Лекции в ворде) 15 страницаЛекции в ворде (1156536) страница 152019-09-18СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 15)

?- 3+2=5.

будет

нет

так как термы не отождествимы (оператор не вычисляет значения своих аргументов), но попытка доказать

?-строка(поз(Х)) -строка(поз(23)).

закончится успехом при

Х=23.

Унификация часто используется для доступа к подкомпонентам термов. Так, в вышеприведенном примере Х конкретизируется пер­вой компонентой терма поз(23), который в свою очередь является компонентой терма строка.

Бывают случаи, когда надо проверить, идентичны ли два терма. Выполнение оператора = = заканчивается успехом, если его аргумен­ты - идентичные термы. Следовательно, запрос

?-строка(поз(Х)) --строка (поз (23)).

дает ответ

нет

поскольку подтерм Х в левой части (X - свободная переменная) не идентичен подтерму 23 в правой части, Однако запрос

?- строка (поз (23)) --строка (поз (23)).

дает ответ

да

Отрицания операторов = и - = записываются как \= и \= = соот­ветственно.

Арифметические выражения

В этой главе показано, каким образом Пролог выполняет ариф­метические операции. Будут описаны арифметические операторы и их использование в выражениях, а также рассмотрены встроенные предикаты, служащие для вычисления и сравнения арифметических выражений.

Введение

Язык Пролог не предназначен для программирования задач с большим количеством арифметических операций. Для этого ис­пользуются процедурные языки программирования. Однако в лю­бую Пролог-систему включаются все обычные арифметические операторы:

+ сложение

— вычитание

* умножение

/ деление

mod остаток от деления целых чисел

div целочисленное деление

В некоторых реализациях языка Пролог присутствует более ши­рокий набор встроенных арифметических операторов.

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

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

–8388606 ... 8388607

Арифметические выражения

Арифметическое выражение является числом или структурой. В структуру может входить одна или более компонент, таких, как чис­ла, арифметические операторы, арифметические списковые выраже­ния, переменная, конкретизированная арифметическим выражени­ем, унарные функторы, функторы преобразования и арифметиче­ские функторы.

Числа. Числа и их диапазоны определяются в конкретной реали­зации Пролога.

Арифметические операторы. + - * / mod div

Арифметические списковые выражения. Если Х - арифметиче­ское выражение, то список [X ] также является арифметическим вы­ражением, например [1,2,3]. Первый элемент списка используется как операнд в выражении. Скажем,

X is ([l,2,3]+5)

имеет значение 6.

Арифметические списковые выражения полезны и при обработке символов, поскольку последние могут рассматриваться как неболь­шие целые числа. Например, символ "а" эквивалентен [97 ] и, буду­чи использован в выражении, вычисляется как 97. Поэтому значение выражения «р»+"А"-"а" равно 80, что соответствует коду ASCII для «Р».

Переменная, конкретизированная арифметическим выражени­ем. Примеры:

Х-5+2 и У-3*(2+А)

Унарные функторы. Примеры:

+(Х) и -(У)

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

float (X) преобразует целое число Х в число с плавающей точкой.

Математические функторы. Пример: квадрат(Х) объявлен как оператор и эквивалентен арифметическому выражению (Х*Х).

Арифметические операторы

Атомы +, -, *, /, mod и div - обычные атомы Пролога и могут использоваться почти в любом контексте. Указанные атомы - не встроенные предикаты, а функторы, имеющие силу только в преде­лах арифметических выражений. Они определены как инфиксные операторы. Эти атомы являются главными функторами в структуре, а сама структура может принимать только описанные выше формы.

Позиция, приоритет и ассоциативность арифметических опера­торов четко заданы и перечислены в таблице операторов в гл. 6.

Арифметический оператор выполняется следующим образом. Во-первых, вычисляются арифметические выражения по обе стороны оператора. Во-вторых, над результатом вычислений выполняется нужная операция.

Арифметические операторы определяются Пролог-системой. Ес­ли мы напишем предикат

среднее (X,Y,Z) :- Z is (X+Y)/2.

то хотя можно определить среднее как оператор

?- ор(250^х, среднее).

но Пролог выдаст сообщение об ошибке, если встретит выражение Z is X среднее Y.

Это произойдет потому, что Х среднее Y не образует арифметиче­ского выражения, а среднее не является арифметическим операто­ром, определенным в системе.

Вычисление арифметических выражений

В Прологе не допускаются присваивания вида Сумма=2+4.

Выражение такого типа вычисляется только с помощью систем­ного предиката is, например:

Сумма is 2 + 4.

Предикат is определен как инфиксный оператор. Его левый аргу­мент - или число, или неконкретизированная переменная, а правый аргумент - арифметическое выражение.

Попытка доказательства целевого утверждения Х is Y заканчи­вается успехом в одном из следующих случаев:

а) Х - неконкретизированная переменная, а результат вычисле­ния выражения Y есть число;

б) Х - число, которое равно результату вычисления выражения Y. Цель Х is Y не имеет побочных эффектов и не может быть согла­сована вновь. Если Х не является неконкретизированной переменной или числом, или если Y - не арифметическое выражение, возникает ошибка.

Примеры:

D is 10- 5 заканчивается успехом и D становится равным 5

4 is 2 * 4 - 4 заканчивается успехом

2 * 4 - 4 is 4 заканчивается неудачей

a is 3 + 3 заканчивается неудачей

X is 4 + а заканчивается неудачей

2 is 4 - X заканчивается неудачей

Обратите внимание, что предикат is требует, чтобы его первый аргумент был числом или неконкретизированной переменной. Поэтому М - 2 is 3 записано неверно. Предикат is не является встроен­ным решателем уравнений.

Сравнение результатов арифметических выражений

Системные предикаты =:=, =\=, >, <, >= и <= определены как инфикс­ные операторы и применяются для сравнения результатов двух арифметических выражений.

Для предиката @ доказательство целевого утверждения X@Y за­канчивается успехом, если результаты вычисления арифметических выражений Х и Y находятся в таком отношении друг к другу, кото­рое задается предикатом @.

Такое целевое утверждение не имеет побочных эффектов и не может быть согласовано вновь. Если Х или Y - не арифметические выражения, возникает ошибка.

С помощью предикатов описываются следующие отношения:

Х =:= Y Х равно Y

Х =\= Y Х не равно Y

Х < Y Х меньше Y

Х > Y Х больше Y

Х <= Y Х меньше или равно Y

Х >= Y Х больше или равно Y

Использование предикатов иллюстрируют такие примеры:

а > 5 заканчивается неудачей

5+2+7 > 5+2 заканчивается успехом

3+2 =:= 5 заканчивается успехом

3+2 < 5 заканчивается неудачей

2 + 1 =\= 1 заканчивается успехом

N > 3 заканчивается успехом, если N больше 3, и неудачей в противном случае

Структуры данных

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

Списки

СПИСКОВАЯ ФОРМА ЗАПИСИ

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

[джек, джон, фред, джилл, джон]

[имя (джон, смит), возраст (джек, 24), X]

[Х.У.дата (12,январь, 1986) ,Х]

[]

Запись [H|T] определяет список, полученный добавлением Н в начало списка Т. Говорят, что Н - голова, а Т - хвост списка [HIT]. На вопрос

?-L=[a | [b, c, d]]. будет получен ответ

L=[a, b, c, d]

а на запрос

?-L= [a, b, c, d], L2=[2 | L]. - ответ

L=[a, b, c, d], L2- [2, a, b, c, d]

Запись [Н | Т] используется для того, чтобы определить голову и хвост списка. Так, запрос

?- [X | Y]=[a, b, c]. дает

Х=а, Y=[b, c]

Заметим, что употребление имен переменных Н и Т необязательно. Кроме записи вида [H|T], для выборки термов используются пе­ременные. Запрос

?-[a, X, Y]=[a, b, c].

определит значения

X=b

Y=c

а запрос

?- [личность(Х) | Т]=[личность(джон), а, b].

значения

Х=джон

Т=[а, Ь]

НЕКОТОРЫЕ СТАНДАРТНЫЕ ЦЕЛЕВЫЕ УТВЕРЖДЕНИЯ ДЛЯ ОБРАБОТКИ СПИСКОВ

Покажем на примерах, как можно использовать запись вида [Н | T] вместе с рекурсией для определения некоторых полезных це­левых утверждений для работы со списками,

Принадлежность списку. Сформулируем задачу проверки при­надлежности данного терма списку.

Граничное условие:

Терм R содержится в списке [H|T], если R=H.

Рекурсивное условие:

Терм R содержится в списке [H|T], если R содержится в списке Т.

Первый вариант записи определения на Прологе имеет вид:

содержится (R, L) :-

L=[H I T],

H=R.

содержится(Р, L) :-

L=[H|T],

содержится (R, T).

Цель L=[H I T] в теле обоих утверждений служит для того, чтобы разделить список L на голову и хвост.

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

принадлежит (R, [R | Т]).

принадлежит (R, [H | Т]) :- принадлежит (R, T).

На запрос

?- принадлежит(а, [а, Ь, с]).

будет получен ответ

да

на запрос

?- принадлежит(b, [a, b, с]).

- ответ

да

но на запрос

?- принадлежит(d, (a, b, c)).

Пролог дает ответ

нет

В большинстве реализации Пролога предикат принадлежит яв­ляется встроенным.

Соединение двух списков. Задача присоединения списка Q к списку Р, в результате чего получается список R, формулируется следующим образом:

Граничное условие:

Присоединение списка Q к [] дает Q.

Рекурсивное условие:

Присоединение списка Q к концу списка Р выполняется так: Q присоединяется к хвосту Р, а затем спереди добавляется голова Р.

Определение можно непосредственно написать на Прологе:

соединить([],0,0).

соединить(Р,Q,Р) :-

Р=[НР | ТР],

соединить(TP, Q, TR),

R=[HP | TR].

Однако, как и в предыдущем примере, воспользуемся тем, что Пролог сопоставляет с целью голову утверждения, прежде чем пы­таться согласовать тело:

присоединить([] ,Q,Q).

присоединить(HP | TP], Q, [HP | TR]) :-

присоединить (TP, Q, TR).

На запрос

?- присоединить [а, b, с], [d, e], L).

будет получен ответ

L = [a, b, c, d].

но на запрос

?- присоединить([a, b], [c, d], [e, f]).

ответом будет

нет

Часто процедура присоединить используется для получения спи­сков, находящихся слева и справа от данного элемента:

присоединить (L [джим, р], [джек,.билл, джим, тим, джим, боб] ) .

L = [джек, билл]

R = [тим, джим, боб]

другие решения (да/нет)? да

L=[джек, билл, джим, тим]

R=[боб]

другие решения (да/нет)? да

других решений нет

Индексирование списка. Задача получения N-ro терма в списке определяется следующим образом:

Граничное условие:

Первый терм в списке [Н | Т] есть Н.

Рекурсивное условие:

N-й терм в списке [Н | Т] является (N-I)-м термом в списке Т.

Данному определению соответствует программа:

/* Граничное условие:

получить ([H | Т], 1, Н). /* Рекурсивное условие:

получить([Н | Т], N, У) :-

М is N - 1,

получить (Т, М ,Y).

Построение списков из фактов. Иногда бывает полезно предста­вить в виде списка информацию, содержащуюся в известных фактах. В большинстве реализации Пролога есть необходимые для этого пре­дикаты:

bagof(X,Y,L) определяет список термов L, конкретизирующих переменную Х как аргумент предиката Y, которые делают истинным предикат Y

setof(X,Y,L) все сказанное о предикате bagof относится и к setof, за исключением того, что список L отсортирован и из него удалены все повторения.

Если имеются факты:

собака(рекс).

Характеристики

Тип файла
Документ
Размер
892 Kb
Тип материала
Высшее учебное заведение

Список файлов лекций

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6353
Авторов
на СтудИзбе
311
Средний доход
с одного платного файла
Обучение Подробнее