- •Вопрос 1) Сравнительная характеристика декларативных и процедурных языков программирования
- •Вопрос 2) Предикаты. Предложения: факты и правила. (Prolog)
- •Вопрос 3) Переменные. Анонимные переменные. Конкретизация переменных Prolog
- •Унификация составных объектов
- •Использование знака равенства для унификации составных объектов
- •Унификация.
- •Сравнение термов.
- •Вопрос 4) Сопоставление и унификация. Предикат равенства. (Prolog)
- •Вопрос 5) Основные секции программы Prolog
- •Вопрос 6) Основные стандартные домены (Prolog)
- •Вопрос 7) Основные принципы поиска с возвратом. (Prolog)
- •Вопрос 8) Управление поиском решений(Prolog)
- •Вопрос 9) Простые и составные объекты данных
- •Унификация составных объектов
- •Использование знака равенства для унификации составных объектов
- •Использование нескольких значений как единого целого
- •Пример использования составных объектов
- •Вопрос 10) Аргументы множественных доменов. (Prolog )
- •Аргументы множественных типов
- •Вопрос 11) Рекурсия (Prolog)
- •Cхема вычисления факториала с помощью нисходящей стратегии рекурсии
- •12. Списки: объявление и примеры работы. (Prolog)
- •13. Строки. Работа со строками. (Prolog)
- •Вопрос 14) Метод отката после неудачи Prolog
- •Вопрос 15) Основы языка lisp. Символьные выражения: атомы и списки. (Lisp)
- •Вопрос 16) Базовые функции и предикаты. (Lisp)
- •Вопрос 17) Функции, определение функций.
- •Вопрос 18) простая рекурсия. (Lisp)
Вопрос 10) Аргументы множественных доменов. (Prolog )
В этом разделе мы обсудим различные типы определений доменов, которые можно добавлять к программам. Эти объявления позволят использовать предикаты, которые имеют возможность:
получать аргумент более чем одного типа;
получать различное количество аргументов, все разных указанных типов;
получать различное количество аргументов, некоторые из которых могут быть более чем одного из возможных типов.
Аргументы множественных типов
Для того чтобы позволить предикатам получать аргументы, которые содержат информацию различных типов, вам нужно добавить описание функтора.
В следующем примере предложение уоur_age (ваш возраст) получает аргумент типа age (возраст), который может иметь тип string, real или integer.
domains
age = i(integer);r(real);s(string)
predicates
your_age(age)
clauses
your_age(i(Age)):-
write(Age).
your_age(r(Age)):-
write(Age).
your_age(s(Age)):-
write(Age).
Пролог не допустит следующего описания домена:
domains
age=integer;real;string% He разрешено
Списки
Предположим, вы хотите заполнить расписание занятий по различным предметам, которые могут проводить разные преподаватели. Вы можете написать следующую программу:
predicates
teacher(symbol First_name,symbol Last_name,symbol Class)
% учитель(имя,фамилия,класс)
clauses
teacher(ed,willis,englishl).
teacher(ed,willis,mathl).
teacher(ed,willis,historyl).
teacher(marу,maker,history2).
teacher(marу,maker,math2).
teacher(chris,grahm,geometry).
Здесь вы должны повторять имя учителя для каждого предмета, который он или она ведет. Для каждого предмета вам приходится добавлять факт к базе данных. Хотя это и совершенно правильно в такой ситуации, но можно найти школу, где преподают сотни предметов; такой тип данных становится слишком сложным. Здесь было бы удобно создать аргумент для предиката, который содержит одно или несколько значений.
Список в Прологе - это как раз то, что нужно. В следующей программе аргумент class (класс) имеет тип "список". Мы покажем здесь, как список представляется в Прологе, а предикаты, работающие со списками, опишем на шаге 42.
domains
classes=symbol* % объявляем домен-список
predicates
teacher(symbol First,symbol Last,symbol Classes)
% имя,фамилия,предметы
clauses
teacher(ed,willis,[englishl,mathl,historyl]).
teacher(marу,maker,[history2,math2]).
teacher(chris,grahm,[geometry]).
В этом примере текст программы более краток и понятен, чем в предыдущем. Обратите внимание на определение домена:
domains
classes=symbol*
Звездочка (*) обозначает, что classes - это список идентификаторов. Так же просто объявить список целых:
domains
integer_list=integer*
После того, как домен определен, его очень просто использовать; поместите его в аргумента в предикат в разделе predicates. Ниже приведен пример использования списка целых:
domains
integer_list=integer*
predicates
test_scores(symbol First,symbol Last,integer_list Test_Scores)
/*список_результатов(имя,фамилия,список_результатов */
clauses
test_scores(lisa,lavender,[86,91,75]).
test_scores(libby,dazzner,[79,75]).
test_scores (jeff,zheutlin,[]).
В случае jeff zheutlin обратите внимание, что список может вообще не иметь элементов.