Главная страница
Навигация по странице:

  • Листинг программы

  • Комментарии к листингу

  • Условие задачи

  • Комментарий к листингу

  • ПЗ_пролог. Решение задач по интеллектуальному анализу на языке Пролог


    Скачать 348.9 Kb.
    НазваниеРешение задач по интеллектуальному анализу на языке Пролог
    Дата15.09.2022
    Размер348.9 Kb.
    Формат файлаdocx
    Имя файлаПЗ_пролог.docx
    ТипРешение
    #679405

    Решение задач по интеллектуальному анализу на языке Пролог


    Цель работы

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

    Задание 1

    1. Составить генеалогическое  древо и на основе базы знаний Prolog, которая описывает реальные отношения в некоторой семье и позволяет осуществить эти отношения посредством использования правил.

    Реализация задания 1

    1. Запустить среду SWISH PROLOG и ввести код программы, листинг которой представлен ниже.

    Листинг программы

    /*ФАКТЫ*/

    /*мужчины*/

    man(александр).

    man(степан).

    man(илья).

    man(анатолий).

    man(евгений).

    man(юрий).

    man(сергей).

    man(олег).

    /*женщины*/

    woman(ирина).

    woman(наталья).

    woman(елена).

    woman(людмила).

    woman(галина).

    woman(вера).

    woman(татьяна).

    /*Кто и чей ребенок*/

    child(сергей, елена). /*Сергей - ребенок Елены и т.д.*/

    child(сергей, елена).

    child(ирина, елена).

    child(ирина, юрий).

    child(олег, евгений).

    child(олег, наталья).

    child(елена, галина).

    child(елена, илья).

    child(наталья, галина).

    child(наталья, илья).

    child(юрий, людмила).

    child(юрий, анатолий).

    child(людмила, вера).

    child(людмила, александр).

    child(анатолий, степан).

    child(анатолий, татьяна).

    /*ПРАВИЛА*/

    parent(X, Y) :- child(Y, X). /*Х - родитель У, если в фактах указано У - ребенок Х*/

    parents(X, Y, Z) :- parent(X, Z), parent(Y, Z), man(X), woman(Y).

    /*Х и У родители Z, если Х - родитель Z и У - родитель Z и Х - мужчина и У - женщина*/

    brothersister(X, Y) :- parents(Z, W, X), parents(Z, W, Y), X \= Y, X@>Y.

    /*Х и У - брат и сестра, если Z и W - родители Х и У, и Х не есть У, и Х следует по порядку за У*/

    brother(X, Y) :- brothersister(X, Y), man(X).

    /*Х - брат У, если Х и У - брат и сестра и Х - мужчина*/

    sister(X, Y) :- brothersister(X, Y), woman(X).

    /*Х - сестра У, если Х и У - брат и сестра и Х - женщина*/

    mother(X, Y) :- parent(X, Y), woman(X).

    /*Х - мама У, если Х - родитель У и Х - женщина*/

    father(X, Y) :- parent(X, Y), man(X).

    /*Х - отец У, если Х - родитель У и Х - мужчина*/

    son(X, Y) :- child(X, Y), man(X).

    /*Х - сын У, если Х - ребенок У и Х - мужчина*/

    doughter(X, Y) :- child(X, Y), woman(X).

    /*Х - дочь У, если Х - ребенок У и Х - женщина*/

    grandparent(X, Y) :- child(Y, Z), child(Z, X).

    /*Х - грэнни У, если У - ребенок Z и Z - ребенок Х*/

    grandmother(X, Y) :- grandparent(X, Y), woman(X).

    /*Х - бабушка У, если Х - грэнни У и Х - женщина*/

    grandfather(X, Y) :- grandparent(X, Y), man(X).

    /*Х - дедушка У, если Х - грэнни У и Х - мужчина*/

    grandgrandparent(X, Y) :- grandparent(X, Z), parent(Z, Y).

    /*Х - грэннигрэнни У, если Х - гренни Z и Z - гренни У*/

    grandgrandfather(X, Y) :- grandgrandparent(X, Y), man(X).

    /*Х - прадедушка У, если Х - грэннигренни У и Х - мужчина*/

    grandgrandmother(X, Y) :- grandgrandparent(X, Y), woman(X).

    /*Х - прабабушка У, если Х - грэннигренни У и Х - женщина*/

    aunt(X, Y) :- parents(Z, W, Y), (sister(X, Z) ; sister(X, W)).

    /*Х - тетя У, если Z и W являются родителями У и(Х - сестра Z или Х - сестра W)*/

    uncle(X, Y) :- parents(Z, W, Y), (brother(X, Z) ; brother(X, W)).

    /*Х - дядя У, если Z и W являются родителями У и(Х - брат Z или Х - брат W)*/

    cousin(X, Y) :- parents(Zy, Wy, Y), parents(Zx, Wx, X), grandparent(G, Y), grandparent(G, X), Zy \= Zx, Wy \= Wx, X@>Y.

    /*Х - кузен У, если Zу и Wу являются родителями У и Zх и Wх являются родителями Х и G - гренни У и G - гренни Х, Zy не есть Zx, Wy не есть wx, и X - следующая запись за Y*/

    Комментарии к листингу

    Для определения родственных  связей следует написать факты вида parent(X, Y), которые определяют, что Y ребенок X. Также следует написать факты вида male(X) и female(X), которые помогают определить, является X мужчиной или женщиной.

    На основании данных фактов были можно построить правила, помогающие определить родство членов семьи.

    Правило  roditeli(X,Y,Z) содержит 3 переменные, где указано, что X и Y являются родителями Z. Оно является истинным, если есть такие факты, что X является родителем для Z, Y является родителем для Z, и X и Y – пара.

    Правила mama(X,Y), papa(X,Y) основываются на фактах parent(X,Y), male(X), female(X).

    Отношение roditeli(X,Y,Z) используется для правил sister(X,Y), brother(X,Y): для каждого X,Y X является братом(сестрой) для Y, если у них общие родители, и X является мужчиной(женщиной). Также необходимо добавить условие, X<>Y, так как один и тот же человек не может быть братом(сестрой) себе самому.

    Для нахождения дяди и тёти можно использовать отношения brother(X,Y) и sister(X,Y), а также факт parent(X,Y).

    В представлении отношений  внук и внучка можно воспользоваться дополнительной переменной для указания родителя для  первой переменной.

    Отношение двоюродного брата  возможно двоякое, так как родителем двоюродного брата может быть как моя тётя, так и дядя.

    Двоюродная сестра является обратным отношением к двоюродному  брату, и поэтому можно определить  это отношение как: dvoiursestra(X,Y):-dvoiurbrat(Y,X). Также в обоих отношениях следует задать пол объектам.

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

    Конъюнкция определяется запятой, а дизъюнкция точкой с запятой.

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

    1. Выполнение программы и составление запросов.

    Для формирования генеалогического дерева следует сформировать ряд запросов.

    Пример запроса с целью выяснения наличия прабабушки у Ирины:

    ?- grandgrandparent(X,ирина).

    1. Генеалогическое древо изобразить графически вручную на листе бумаге, либо в программе-редакторе.

     Задание 2

    1. Прочитать условие задачи Эйнштейна и попытаться решить ее ручным способом, ответив на вопрос: «У кого рыба?».

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

    3. Сформировать несколько различных запросов к базе знаний на основе индивидуального задания преподавателя.

    Условие задачи

    1. Есть 5 домов, каждый разного цвета.
    2. В каждом доме живёт один человек, отличающийся от соседнего по национальности:
    немец, англичанин, швед, датчанин и норвежец.
    3. Каждый пьёт только один определённый напиток, курит определённую марку сигарет
    и держит определённое животное.
    4. Никто из пяти человек не пьёт одинаковые с другими напитки, не курит одинаковые сигареты и не держит одинаковое животное.
    Вопрос: Кто держит рыбок?

    Подсказки:
    1. Англичанин живёт в красном доме.
    2. Швед держит собаку.
    3. Датчанин пьёт чай.
    4. Зелёный дом стоит слева от белого, рядом.
    5. Жилец зелёного дома пьёт кофе.
    6. Человек, который курит "Pall Mall", держит птицу.
    7. Жилец из среднего дома пьёт молоко.
    8. Жилец из желтого дома курит "Dunhill".
    9. Норвежец живёт в первом доме.
    10. Курильщик "Marlboro" живет около того, кто держит кошку.
    11. Человек, который содержит лошадь, живёт около того,
    кто курит "Dunhill".
    12. Курильщик сигарет "Winfield" пьёт пиво.
    13. Норвежец живёт около голубого дома.
    14. Немец курит "Rothmans"
    15. Курильщик "Marlboro" живёт по соседству с человеком,
    который пьёт воду.

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

    Листинг программы

    einstein :-

    /* 0. Всего 5 домов */

    Дома = [_,_,_,_,_],

    /* 1. Норвежец живёт в первом доме. */

    nth1(1, Дома, [норвежец,_,_,_,_]),

    /* 2. Англичанин живёт в красном доме. */

    member([англичанин,_,_,_,красный], Дома),

    /* 3. Зелёный дом находится слева от белого, рядом с ним. */

    nextto([_,_,_,_,зеленый], [_,_,_,_,белый], Дома),

    /* 4. Датчанин пьёт чай. */

    member([датчанин,_,_,чай,_], Дома),

    /* 5. Тот, кто курит Marlboro, живёт рядом с тем, кто выращивает кошек. */

    соседи([_,_,marlboro,_,_], [_,кот,_,_,_], Дома),

    /* 6. Тот, кто живёт в жёлтом доме, курит Dunhill. */

    member([_,_,dunhill,_,желтый], Дома),

    /* 7. Немец курит Rothmans. */

    member([немец,_,rothmans,_,_], Дома),

    /* 8. Тот, кто живёт в центре, пьёт молоко. */

    nth1(3, Дома, [_,_,_,молоко,_]),

    /* 9. Сосед того, кто курит Marlboro, пьёт воду. */

    соседи([_,_,marlboro,_,_], [_,_,_,вода,_], Дома),

    /* 10. Тот, кто курит Pall Mall, выращивает птиц. */

    member([_,птицы,pallmall,_,_], Дома),

    /* 11. Швед выращивает собак. */

    member([швед,собака,_,_,_], Дома),

    /* 12. Норвежец живёт рядом с синим домом. */

    соседи([норвежец,_,_,_,_], [_,_,_,_,синий], Дома),

    /* 13. Тот, кто выращивает лошадей, живёт в синем доме. */

    member([_,лошадь,_,_,синий], Дома),

    /* 14. Тот, кто курит Winfield, пьет пиво. */

    member([_,_,winfield,пиво,_], Дома),

    /* 15. В зелёном доме пьют кофе. */

    member([_,_,_,кофе,зеленый], Дома),

    /* member([_,рыба,_,_,_], Дома),*/

    /* Внимание, вопрос! */

    member([Гражданин,рыба,_,_,_], Дома),

    /* Печатаем решение */

    print('О ком запрос: '), print(Гражданин), nl,

    print('Full Solution: '), print(Дома), nl.

    /* Вспомогательные функции: */

    соседи(X, Y, List) :- nextto(X, Y, List) ; nextto(Y, X, List) .

    Для запуска программы следует набрать запрос:

    ?- einstein.

    Комментарий к листингу

    nth1, member и nextto – встроенные функции Пролог для работы со списками. О их синтаксисе и назначении следует прочитать самостоятельно.

    Скриншот реализованной программы для решения задачи Эйнштейна показан на рисунке 1.



    Рисунок 1

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

    Пояснительную записку оформить в текстовом процессоре MS Word и прикрепить к заданию в Электронном учебном курсе, размещенном на платформе Moodle.



    написать администратору сайта