Вопрос или проблема
Я нов в Prolog и мне нужна помощь в том, как написать программу на Prolog. Вот что я пытаюсь сделать. Я скачал набор данных по этой ссылке – https://archive.ics.uci.edu/ml/datasets/Blood+Transfusion+Service+Center
Моя цель заключается в следующем
- Использовать любой из алгоритмов дерева решений для построения дерева решений для данных
- Создать правила из дерева решений.
- Закодировать правила в базе знаний Prolog
- Получить данные о доноре крови от пользователя и предсказать, если донор пожертвовал кровью в марте 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-код ясным и эффективным.
Следующие шаги
- Убедитесь, что у вас установлен интерпретатор SWI-Prolog для тестирования вашего кода.
- Протестируйте все ваши правила, чтобы убедиться, что они работают должным образом.
- Расширяйте и улучшайте вашу программу, добавляя новые условия и возможности.
Соблюдая эти инструкции, вы сможете создать эффективное приложение для анализа данных по донорам крови на языке Prolog.