Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2docx-1.doc
Скачиваний:
3
Добавлен:
01.03.2025
Размер:
2.27 Mб
Скачать

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

Термы – основные смысловые объекты программы: 1. Простые: (a) Переменные – начинаются с заглавной буквы или подчеркивания, область действия – 1 правило. Как правило, заменяются внутр-ми ссылками. Анонимная переем-я «_» - неск.ее вхождений в одно и то же высказывание независимы. Своб.пер-я подразумевается изначально. Переменная получает значение (связывается) в рез-те унификации. Значение перем-й м.б. измене-но только в рез-те бэктрекинга. (b) Константы: i. Атомы- посл-ть лат.букв, цифр, под-черкиваний, начинающихся с мал.буквы, посл-ть знаков операторов, посл-ть любых символов, взятых в апострофы. Константы предметной области. 1 идентификатор <-> 1 объект. ii. Числа – введены в явном виде исключительно для удобства. Можно обойтись и без них, построив формальную арифметику на аксиомах Пеано. 2. Структурные f(t_1,... t_n), t_i – термы, f - функтор арности n. Обозначение: f/n. Используют: сложные факты:

появление(‘Тоня_Глоткина’, дата(11, июль, 1989))

Графика: в виде дерева. Возможны рекурсивные опр-ия. Предикаты – тоже структурные термы. Предикат – матем-е высказывание, зависящее от параметров.

15. Операторы. Представление и выч-ие арифметич-х выр-й. Опред-е польз-м операторы. Представление предикатов и правил структурными термами.

Операторы нужны для естественной, удобной записи арифметич-х выражений, исп-я инфиксной и постфиксной записи вместо префиксной. Св-ва: •Учёт приоритета опера-ций; •Группировка скобками; •Ассоциативность: левая (+, —, *, /), правая (степень). Представление и вычисление арифметических выражений • =, создаёт структурный терм;•is,вычисляет, правая часть должна быть правильным арифметич-м выражением, из констант может содержать только числа. Определяемые пользователем операторы. Для объявления оператора исп-ся встроенный системный предикат op. Формат вызова :— ор(<приоритет>, <шаблон>, <оператор>)// Обычно приоритет \in [1,255]. Чем больше число, тем меньше реальный приоритет. У :- он 255. Шаблон задает: •арность: унарный (fx; fy; xf; yf), бинарный (yfx, xfy, xfx); •позиционность: префиксный (xf; yf), инфиксный (yfx; xfy; xfx), постфиксный (fx; fy); •ассоциативность если нет скобок, допускает: x – оператор более высокого приоритета, y – оператор более высокого или равного приоритета. Левая(yfx), правая (xfy), никакая (xfx, xf, fx); просто она есть, ка-кая – не определено fy, yf. Оператор: посл-ть спецсимволов (<,=,>,|), функциональный символ (seq). Представление предикатов и правил структурными термами Эл-ты про-лог программы такие как, предикаты, и описывающие их факты и правила явл-ся структурными термами (f(t_1,... t_n), t_i – термы, f - функтор арности n)

  1. resistance(par(X, Y), R) : —

  2. resistance(X, RX),

  3. resistance(Y, RY),

4 R is RX * RY / (RX + RY).

В префиксной нотации (lisp forewer):

    1. :— ( resistance(par(X, Y), R),

16. Подходы к организации циклов в лп. Примеры. Преди­каты for, repeat.

Подходы: •рекурсия На каждом шаге создаётся новая среда, новое значение инварианта цикла. Ex – печать чисел от 1 до 10.

      1. print(11).

      2. print (X) :-

      3. X =< 10, write(X), X1 is X + 1, print(X1).

      4. print : -

      5. print(1).

Бесконечный цикл:

        1. iloop :-

        2. iloop.

Современные системы ЛП умеют распознавать хво­стовую рекурсию. •возврат - циклы управляемые неуспехом. Новое значение пер-й цикла можно генерировать каждый раз в процессе возврата.

          1. print : -

          2. gen(1, X), write(X), fail.

          3. gen(X, X).

          4. gen(Y, X):-

          5. Y < 10, Y1 is Y + 1, gen(Y1, X).

Бесконечный цикл:

            1. iloop : -

            2. loop, fail.

            3. loop.

            4. loop :- loop.

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

              1. repeat.

              2. repeat :— repeat.

Использование:

                1. read_dim: — %Требуется ввести число от 3 до 6

                2. repeat, read(X), X >= 3, X <= 6.

                3. read_ans: — % Требуется ввести да/нет

                4. repeat, read(X), member(X, [yes, no]).

Вообще говоря, это работает только с предикатами, у кот.есть побочный эффект. С классич.предикатами, repeat будет возвращаться один и тот же ответ. for:

                  1. for(A, A, _).

                  2. for(X, A, B): —

                  3. A < B, A1 is A + 1, for(X, A1, B).

Вариант другой, хуже, но можно его идею с (member) для организации цикла как в Python, (цикл по произвольному множеству).

  1. integer(A, A, [A]).

  2. integer(A, B, [A|R]): —

  3. A < B, A1 is A + 1,

  4. integer(A1, B, R).

  5. for(X, A, B): —

  6. integer(A, B, L), member(X, L).

Использование: ?— for(X, 1, 10), write(X), fail. %Печать чисел от 1 до 10