Нужна помощь с программой на Прологе

Вопрос или проблема

Я нов в Prolog и мне нужна помощь в том, как написать программу на Prolog. Вот что я пытаюсь сделать. Я скачал набор данных по этой ссылке – https://archive.ics.uci.edu/ml/datasets/Blood+Transfusion+Service+Center

Моя цель заключается в следующем

  1. Использовать любой из алгоритмов дерева решений для построения дерева решений для данных
  2. Создать правила из дерева решений.
  3. Закодировать правила в базе знаний Prolog
  4. Получить данные о доноре крови от пользователя и предсказать, если донор пожертвовал кровью в марте 2007 года.

Мне нужна помощь в том, с чего начать работу. Я разработал алгоритмы на Python и понимаю пункты #1 и #2, но не знаю, как работать с пунктами #3 и #4.

Я могу дать вам некоторые основы, но правильный способ сделать это – изучить язык Prolog, который очень отличается от любого другого языка программирования.

В Prolog вы определяете предикаты (аналогично функциям), которые содержат условия, при выполнении которых предикат будет истинным, например:

dt(Feat1, Feat2, Feat3, labelA) :-
    Feat1 =< 3,
    Feat2 == 'green',
    Feat3 >= 0.54.

dt(Feat1, Feat2, Feat3, labelB) :-
    Feat1 =< 3,
    Feat2 == 'green',
    Feat3 < 0.54.

dt(Feat1, Feat2, _Feat3, labelC) :-
    Feat1 > 3,
    Feat2 == 'green'.

dt(_Feat1, Feat2, _Feat3, labelB) :-
    Feat2 == 'blue'.
  • Здесь предикат – dt и у него 4 клаузулы. Для того чтобы dt был истинным, хотя бы одна из клаузул должна быть истинной (то есть все содержащиеся в ней условия должны быть истинны).
  • Переменные обозначаются с заглавной буквы, например Feat1, Feat2, Feat3. Prolog будет пытаться найти инстанцирование переменных, которое удовлетворяет одной из клаузул (на самом деле он пробует все возможности, пока одна из них не сработает, это решатель).
  • В каждой клаузе выше метка – последний параметр предиката. В основном каждая клаузула означает “если все условия после :- истинны, тогда метка – labelX”.

Предполагая, что 4 клаузулы выше были сохранены в файле dt.pl, можно использовать, например, интерпретатор SWI Prolog так:

?- consult('dt.pl').
true.

Теперь способ использования этого игрушечного дерева решений будет следующим:

?- dt(4,'green',0.3, Label).
Label = labelC .

?- dt(4,'blue',0.3, Label).
Label = labelB.
  • Обратите внимание на заглавную букву для Label: это значит, что теперь мы позволяем Prolog найти значение Label, которое удовлетворяет предикату dt с учетом предоставленных значений для признаков.

Это основная идея. Более продвинутое и более общее представление ДТ было бы возможно с использованием рекурсии и унификации, но это потребовало бы продвинутого понимания Prolog.

Prolog – это система доказательства теорем, использующая логики первого порядка – термин, который вы можете игнорировать пока. Лучше всего начинать, рассматривая Prolog как систему логического вывода, которая использует факты и правила, чтобы определить, можно ли вывести что-то интересующее из этой информации. Факты выражаются как

father(bill, ted).

Обратите внимание на строчную букву. Здесь father – это предикат, а bill, tedатомы. Полезно думать о атомах как о константах. Является ли bill отцом ted или наоборот – это вопрос интерпретации. Вам нужно будет соблюдать идею о том, что, например, bill является отцом ted, через единообразное использование и интерпретацию. Неконсистентное использование является серьезным источником ошибок. Таким образом, другим фактом может быть

mother(sandra,ted).

Это приводит к следующему правилу: кто-то является родителем ted, если он его отец или мать, выраженное следующим образом:

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

Обратите внимание на заглавную букву, которая используется для переменных. Prolog использует термин цель для чего-то, что должно быть удовлетворенным. Удовлетворение означает, что Prolog может найти достаточные факты, чтобы в конечном итоге определить значения (называемые привязками) для ваших переменных

Аналогично,

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

Запятая (“,”) здесь указывает на последовательное удовлетворение целей, при этом предыдущие привязки переменных (“инстанцирования” на языке Prolog) передаются вперед (подумаете об этом).

?- father(X, ted).

Он вернется и выведет

X = bill

что означает, что он нашел решение (доказал теорему), что есть отец для ted, который можно вывести из фактов и правил, которые вы указали.

Это работает и в обратном направлении, так что цель

?- father(bill, X).

Он вернется и выведет

X = ted

что означает, что он нашел решение, что bill является чьим-то отцом.

Если вы спросите Prolog

?- father(X, joe).

Он вернется и скажет

False

что означает, что решение не существует на основе ваших предоставленных фактов и правил.

Наконец, если вы спросите Prolog

?- father(F, S).

Он вернется и выведет

F = bill, S = ted

Если вы спросите Prolog

?- parent(P, C).

Он вернется и выведет

P = bill, C = ted

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

Если вы потребуете, чтобы Prolog нашел второе заключение (удовлетворение), он вернется и выведет

P = sandra, C = ted

Реалистичные программы приведут к серии удовлетворений целей в установленном порядке, при этом их привязки переменных передаются туда, где необходимо, чтобы найти решение. Это и есть обратный поиск (встроенный в механизм Prolog). После того, как некоторые цели были удовлетворены, последующая может потерпеть неудачу, и тогда Prolog автоматически вернется назад и найдет альтернативное решение (привязки переменных) для какой-то предшествующей цели, насколько это необходимо, чтобы найти решение. Если он исчерпает все возможности обратного поиска, он объявит о большом провале, что означает, что у вас нет решения.

Таким образом, создание программы на Prolog – это формулирование всех фактов случая, а также любых правил, представляющих знания в области вашей проблемы, а затем попросить Prolog удовлетворить какую-то цель верхнего уровня, которая заставит Prolog найти решение.

Наконец, Prolog – это серьезная система. Однажды я сократил 10-тысячную строку симуляции на C++, которая никогда не была корректной, до 1500 строк Prolog.

Ответ или решение

Как написать программу на Prolog для анализа данных о донорах крови

Prolog — это уникальный язык программирования, основанный на логическом выводе. Ваша задача заключается в разработке программы, которая анализирует данные о донорах крови и предсказывает, были ли они донорами в марте 2007 года. Рассмотрим процесс разработки программы поэтапно.

1. Используйте алгоритмы деревьев решений

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

donor(Особенность1, Особенность2, labelD) :- 
    Особенность1 < 5, 
    Особенность2 = 'yes'.

2. Создание правил из дерева решений

Основная идея в том, чтобы каждая ветвь решения отражала условие, имеющее отношение к входным данным:

  • Особенность1 <= 3: вероятность донорства высока.
  • Особенность2 = ‘green’: также указывает на вероятность.

Соберите правила следующим образом:

donor(Feat1, Feat2, labelYes) :-
    Feat1 < 3, 
    Feat2 = 'yes'.

donor(Feat1, Feat2, labelNo) :-
    Feat1 >= 3, 
    Feat2 = 'no'.

3. Закодируйте правила в базе знаний Prolog

Создайте файл donor_rules.pl, в который вы внесете все ваши правила. Пример содержания файла:

% donor_rules.pl
donor(Feat1, Feat2, labelYes) :- 
    Feat1 < 3, 
    Feat2 = 'yes'.

donor(Feat1, Feat2, labelNo) :- 
    Feat1 >= 3, 
    Feat2 = 'no'.

Затем загрузите файл в интерпретатор Prolog:

?- consult('donor_rules.pl').

4. Запрос данных о доноре и предсказание

Для того чтобы получить данные о доноре от пользователя и сгенерировать предсказание, вы можете использовать следующие конструкции в Prolog:

predict_donor :-
    write('Введите первую характеристику донора: '),
    read(Feature1),
    write('Введите вторую характеристику донора: '),
    read(Feature2),
    donor(Feature1, Feature2, Label),
    write('Предсказание: '),
    writeln(Label).

После этого вызовите предсказание:

?- predict_donor.

Заключение

Эта основа позволит вам разработать приложение на Prolog для анализа данных о донорах крови. Важно помнить, что Prolog работает гораздо по-другому, чем другие языки, и требует от вас логического подхода к структуре данных и правил. Следует также акцентировать внимание на правильном формулировании фактов и правил, чтобы сделать ваш Prolog-код ясным и эффективным.

Следующие шаги

  1. Убедитесь, что у вас установлен интерпретатор SWI-Prolog для тестирования вашего кода.
  2. Протестируйте все ваши правила, чтобы убедиться, что они работают должным образом.
  3. Расширяйте и улучшайте вашу программу, добавляя новые условия и возможности.

Соблюдая эти инструкции, вы сможете создать эффективное приложение для анализа данных по донорам крови на языке Prolog.

Оцените материал
Добавить комментарий

Капча загружается...