1. Запустите среду Visual Prolog. Закройте окно проекта (если оно открыто) и откройте новый файл (File|New) (рис.2)
В появившемся окне наберите текст программы, содержащий разделы: PREDICATES (описание предиката родитель), CLAUSES (перечисляются имеющиеся факты) и GOAL (запрос).
рис.2. Рабочее окно редактора
DOMAINS
имя=string
PREDICATES
nondeterm родитель(имя, имя)
CLAUSES
родитель(илья, марина).
родитель(марина, ира).
родитель(елена, иван).
родитель(николай, ира).
родитель(ольга, алексей).
родитель(марина, саша).
родитель(сергей, иван).
GOAL
родитель(марина, саша).
Запустите и протестируйте программу с помощью команды Project | Test Goal (можно использовать кнопку на панели инструментов <G> или сочетание клавиш <Ctrl>+<G>). Результат выполнения программы будет выведен в отдельном окне
рис3. Окно вывода результата
Указание: перед следующим запуском программы следует закрыть это окно.
2. Для ответа на вопрос: верно ли, что Алексей является родителем Ольги, измените запрос:
GOAL
родитель(алексей, ольга).
После запуска программы (Project | Test Goal) будет получен ответ:
no
3. Для ответа на вопрос: кто является ребенком Николая, запишите цель:
GOAL
родитель(николай, X).
Результат:
X=ира
1 Solution
4. Для ответа на вопрос: кто родители Ивана, укажите запрос:
GOAL
родитель(X, иван), родитель(Y, иван), X<>Y.
Результат:
X=елена, Y=сергей
X=сергей, Y=елена
2 Solutions
5. Для определения всех родителей и их детей, запишите:
GOAL
родитель(X, Y).
Результат:
X=илья, Y=марина
X=марина, Y=ира
X=елена, Y=иван
X=николай, Y=ира
X=ольга, Y=алексей
X=марина, Y=саша
X=сергей, Y=иван
7 Solutions
Пример 2
Имеются факты вида: родитель(имя, имя) и женщина(имя).
а) составить правило мать и определить, кто мать Маши.
Решение:
DOMAINS
имя=string
PREDICATES
родитель(имя, имя)
женщина(имя)
мать(имя,имя)
CLAUSES
родитель("Марина","Ирина").
родитель("Елена", "Анна").
родитель("Ольга","Марина").
родитель("Ольга","Татьяна").
родитель("Татьяна","Катя").
родитель("Анна", "Маша").
женщина("Ольга").
женщина("Маша").
женщина("Ирина").
женщина("Елена").
женщина("Анна").
женщина("Марина").
женщина("Татьяна ").
женщина("Катя").
мать(X,Y):-родитель(X,Y),женщина(X).
GOAL
мать(X,"Маша").
Результат:
X=Анна
1 Solution
b) составить правило бабушка и определить, кто бабушка Маши.
Решение:
DOMAINS
имя=string
PREDICATES
nondeterm родитель(имя,имя)
женщина(имя)
nondeterm мать(имя,имя)
nondeterm бабушка(имя,имя)
CLAUSES
родитель("Марина","Ирина").
родитель ("Елена", "Анна").
родитель("Ольга","Марина").
родитель("Ольга","Татьяна").
родитель("Татьяна","Катя").
родитель ("Анна", "Маша").
женщина("Ольга").
женщина("Маша").
женщина("Ирина").
женщина("Елена").
женщина("Анна").
женщина("Марина").
женщина("Татьяна ").
женщина("Катя").
мать(X,Y):-родитель(X,Y),женщина(X).
бабушка(X,Z):-мать(X,Y),родитель(Y,Z).
GOAL
бабушка(X,"Маша").
Результат:
X=Елена
1 Solution
Замечание: ключевое слово nondeterm определяет недетерминированные предикаты, которые могут совершать откат назад и генерировать множественные решения. Таким образом, если задача предполагает возможность получения несколько решений, следует объявлять предикаты как недетерминированные.
c) составить правило внучка и определить, сколько внучек у Ольги и как их зовут.
Решение:
DOMAINS
имя=string
PREDICATES
nondeterm родитель(имя,имя)
женщина(имя)
nondeterm мать(имя,имя)
nondeterm бабушка(имя,имя)
nondeterm внучка(имя,имя)
CLAUSES
родитель("Марина","Ирина").
родитель ("Елена", "Анна").
родитель("Ольга","Марина").
родитель("Ольга","Татьяна").
родитель("Татьяна","Катя").
родитель("Анна", "Маша").
женщина("Ольга").
женщина("Маша").
женщина("Ирина").
женщина("Елена").
женщина("Анна").
женщина("Марина").
женщина("Татьяна ").
женщина("Катя").
мать(X,Y):-родитель(X,Y),женщина(X).
бабушка(X,Z):-мать(X,Y),родитель(Y,Z).
внучка(X,Y):-бабушка(Y,X),женщина(X).
GOAL
внучка(X, "Ольга").
Результат:
X=Ирина
X=Катя
2 Solutions
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ
1. Имеется база данных, содержащая следующие факты:
любит(“Aнна,” яблоки).
любит(“Сергей”, бананы).
любит(“Андрей”, яблоки).
любит(“Света”, шоколад).
любит(“Вова”, шоколад).
любит(“Анна”, шоколад).
любит(“Света”, апельсины).
любит(“Вова”, бананы).
Составить программу, определяющую:
a) всех, кто любит бананы;
b) кто любит и шоколад, и яблоки;
c) что любит Вова;
d) что любят и Света, и Вова.
2. Имеется база данных, содержащая следующие факты:
играет (“Саша”, футбол).
играет (“Катя”, теннис).
играет (“Саша”, теннис).
играет (“Андрей”, футбол).
играет (“Олег”, футбол).
играет (“Ольга”, теннис).
играет (“Катя”, волейбол).
играет (“Олег”, волейбол).
Составить программу, определяющую:
a) каким видом спорта увлекается Андрей;
b) всех, кто играет в волейбол;
c) каким видом спорта увлекаются и Ольга, и Саша;
d) кто увлекается и футболом, и волейболом.
3. Имеется база данных, содержащая следующие факты:
любит(“Aнна,” яблоки).
любит(“Сергей”, бананы).
любит(“Андрей”, яблоки).
любит(“Света”, шоколад).
любит(“Вова”, шоколад).
любит(“Анна”, шоколад).
любит(“Света”, апельсины).
любит(“Вова”, бананы).
фрукты(яблоки).
фрукты(бананы).
фрукты(апельсины).
конфеты(шоколад).
a) используя имеющиеся факты, составить новое правило люб_фрукты (Х) и определить всех, кто любит фрукты;
b) используя имеющиеся факты, составить новое правило люб_конфеты (Х) и определить всех, кто любит конфеты;
c) используя имеющиеся факты, составить правило люб_вкусное (Х) и определить всех, кто любит и фрукты, и конфеты.
4. Имеется база данных, содержащая следующие факты:
играет (“Саша”, футбол).
играет (“Катя”, теннис).
играет (“Саша”, теннис).
играет (“Андрей”, футбол).
играет (“Олег”, футбол).
играет (“Ольга”, теннис).
играет (“Катя”, волейбол).
играет (“Олег”, волейбол).
женщина(“Катя”).
женщина(“Ольга”).
мужчина(“Саша”).
мужчина(“Андрей”).
мужчина(“Олег”).
a) используя имеющиеся факты, составить новое правило волейбол_жен(Х) и определить всех женщин, играющих в волейбол;
b) используя имеющиеся факты, составить новое правило футбол_муж(Х) и определить всех мужчин, играющих в футбол;
c) используя имеющиеся факты, составить правило теннис_пара(Х,Y), позволяющее найти смешанную теннисную пару (мужчина+женщина). Определить все такие пары.
Отчет о выполненной самостоятельной работе должен содержать:
1) тему лабораторной работы;
2) условие задачи;
3) листинг программы;
4) результаты ее тестирования.