Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лисп ответы.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
83.17 Кб
Скачать

27. В Прологе отношение между объектами называется фактом (fact).

Ниже представлено несколько предложений на естественном языке с отношением "любит" (likes):

Билл любит Синди. (Bill likes Cindy)

Синди любит Билла. (Cindy likes Bill)

Билл любит собак. (Bill likes dogs)

А теперь перепишем ли же факты, используя синтаксис Пролога:

likes (bill,cindy).

likes(cindy,bill).

likes(bill,dogs).

Факты, помимо отношений, могут выражать и свойства. Так, например, предложения естественного языка "Kermit is green" (Кермит зеленый) и "Caitlin is girl" (Кейтлин - девочка) на Прологе, выражая те же свойства, выглядят следующим образом:

green(kermit).

girl(caitlin).

Правила

Правила позволяют вам вывести один факт из других фактов. Другими словами, можно сказать, что правило - это заключение, для которого известно, что оно истинно, если одно или несколько других найденных заключений или фактов являются истинными. Ниже представлены правила, соответствующие связи "любить" (likes):

Синди любит все, что любит Билл. (Cindy likes everything that Bill likes)

Кейтлин любит все зеленое. (Caitlin likes everything that is green)

Используя эти правила, вы можете из предыдущих фактов найти некоторые вещи, которые любят Синди и Кейтлин:

Синди любит Синди. (Cindy likes Cindy)

Кейтлин любит Кермит. (Caitlin likes Kermit)

Чтобы перевести эти правила на Пролог, вам нужно немного изменить синтаксис, подобно этому:

likes(cindy,Something):-

likes(bill,Something).

likes(caitlin,Something):-

green(Something).

Символ :- имеет смысл "если", и служит для разделения двух частей правила: заголовка и тела.

Вы можете рассматривать правило и как процедуру. Другими словами, эти правила

likes(cindy,Something):-

likes(bill,Something)

likes(caitlin,Something):-

green(Something).

28. ТЕРМЫ

Объекты данных в Прологе называются термами. Терм может быть константой, переменной или составным термом (структурой). Константами являются целые и действительные числа, например:

0, -l, 123.4, 0.23E-5,

(некоторые реализации Пролога не поддерживают действительные числа).К константам относятся также атомы, такие, как:

голди, а, атом, +, :, 'Фред Блогс', [].

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

abcd, фред, ':', Джо.

Полный синтаксис атомов описан ниже.

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

Имена переменных начинаются с заглавных букв или с символа подчеркивания "_". Примеры переменных:

X, Переменная, _3, _переменная.

Если переменная используется только один раз, необязательно называть ее. Она может быть записана как анонимная переменная, состоящая из одного символа подчеркивания "_". Переменные, подобно атомам, являются элементарными объектами языка Пролог.

Завершает список синтаксических единиц сложный терм, или структура. Все, что не может быть отнесено к переменной или константе, называется сложным термом. Следовательно, сложный терм состоит из констант и переменных.

29. Переменные служат для обозначения объектов, значения которых меняются в ходе выполнения программы.

Имена переменных могут начинаться:

- или с прописной буквы

- или с символа подчеркивания

X

Y

Result

_result

Eсли значение переменной не интересует, то можно использовать анонимные переменные в виде символа подчеркивания '_'.

Например,

haschild(X):-parent(X, Y).

Здесь значение Y не интересует, можно записaть

haschald(X):-parent(X, _).

Значение анонимной переменной не выводится на печать. Если несколько анонимных переменных, то они все разные. Использование анонимных переменных позволяет не выдумывать имена переменных, когда не надо.

Пусть задано отношение parents для двух родителей.

parents(ann, tom, bob).

Тогда в правиле:

child(X):-parents(_, _, X).

Y Z

обе анонимные переменные разные.

! Внимание. Область действия переменных - одно предложение.

Одноименные переменные в разных предложениях могут иметь разные значения.

В прологе выполняются следующие операции:

+ - */ mod - остаток от целочисленного деления.

Если записать:

?-X = 2+1.

X=2+1

т.к. это просто сопоставление переменной и структуры.

Чтобы арифметическое выражение рассчитывалось, необходимо использовать встроенный оператор is, который заставляет выполнять арифметические операции.

?-X is 2+1.

X=3

?-Y is 2*(5+6).

Y=22

Могут быть переменные, но они должны иметь значение к моменту вычисления.

f(X, Y, Z):-Z is X*X + Y*Y.

и задать вопрос

?- f(2, 3, R).

R=13

Если определить:

sum(X1, X2, X):-X is X1 + X2.

?-sum(2, 3, X).

X=5

?- sum(1, 1, X1), sum(X1, X1, X).

4.

30. Переменные служат для обозначения объектов, значения которых меняются в ходе выполнения программы.

Имена переменных могут начинаться: - или с прописной буквы - или с символа подчеркивания

X  Y  Result _result

Eсли значение переменной не интересует, то можно использовать анонимные переменные в виде символа подчеркивания '_'.

Например,

haschild(X):-parent(X, Y).

Здесь значение Y не интересует, можно записaть

haschald(X):-parent(X, _).

Значение анонимной переменной не выводится на печать. Если несколько анонимных переменных, то они все разные. Использование анонимных переменных позволяет не выдумывать имена переменных, когда не надо.

После записи утверждений в базу данных вычисления могут быть инициированы вводом запроса.

Запрос выглядит так же, как и целевое утверждение, образуется и обрабатывается по тем же правилам, но он не входит в базу данных (программу). В Прологе вычислительная часть программы и данные имеют одинаковый синтаксис. Программа обладает как декларативной, так и процедурной семантикой. Мы отложим обсуждение этого вопроса до последующих глав. Запрос обозначается в Прологе утверждением ?-, имеющим арность 1. Обычно запрос записывается в операторной форме: за знаком ?- следует ряд хвостовых целевых утверждений (чаще всего в виде конъюнкции).

Приведем примеры запросов:

?-собака(X). ?- родитель(Х.У),собака (Y).

или, иначе,

'?-'(собака(Х)) С?-') ','(родитель(Х„У”,собака (Y)).

Последняя запись неудобна тем, что разделитель аргументов в структуре совпадает с символом конъюнкции. Программисту нужно помнить о различных значениях символа ','.

Запрос иногда называют управляющей командой (директивой), так как он требует от Пролог-системы выполнения некоторых действий. Во многих реализациях Пролога для управляющей команды используется альтернативный символ, а символ ?- обозначает приглашение верхнего уровня интерпретатора Пролога. Альтернативным символом является :-. Таким образом,

:-write(co6aкa).

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

32. Константы - это поименованные конкретные объекты или отношения.

Атомы - аналогичны атомам или символам в лиспе.

Атомы могут задаваться:

1) Цепочкой букв, цифр и символом подчеркивания '_', начиная со строчной буквы.

a

sister

x_23

2) специальными символами*: ====>

Числа

Целые ( диапазон -32768 32767)

Действительные ( диапазон 1Е-307 1Е+308)

Переменные служат для обозначения объектов, значения которых меняются в ходе выполнения программы.

Имена переменных могут начинаться:

- или с прописной буквы

- или с символа подчеркивания

X

Y

Result

_result

Eсли значение переменной не интересует, то можно использовать анонимные переменные в виде символа подчеркивания '_'.

Например,

haschild(X):-parent(X, Y).

Здесь значение Y не интересует, можно записaть

haschald(X):-parent(X, _).

Значение анонимной переменной не выводится на печать. Если несколько анонимных переменных, то они все разные. Использование анонимных переменных позволяет не выдумывать имена переменных, когда не надо.

Пусть задано отношение parents для двух родителей.

parents(ann, tom, bob).

Тогда в правиле:

child(X):-parents(_, _, X).

Y Z

обе анонимные переменные разные.

! Внимание. Область действия переменных - одно предложение.

Одноименные переменные в разных предложениях могут иметь разные значения.

Структура - это единый объект состоящий из совокупности других объектов, называемых компонентами.

Компоненты в свою очередь могут быть также структурами.

Структура data:

Название структуры стоит перед скобками,а компоненты внутри скобок, через запятую.

Название структуры - ФУНКТОР.

Структуры можно изображать в виде деревьев:

data

/ | \