Решение логической задачи на языке Prolog
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
ин_из_ответов(Ответ3),
Персонажи = [ПерсонажА,ПерсонажБ,ПерсонажВ],
Процесс = процесс(Персонажи,Ответ1,Ответ2,ДалОтвет3,Ответ3).
суд1(Процесс) :-
гипотеза(Процесс), Процесс = процесс(Персонажи,_,_,_,_),
% из процесса выбираются персонажи
ПерсонажА = персонаж(а,_),один_из(ПерсонажА,Персонажи),
% выбока персонажа
проверка(ПерсонажА,1,Процесс),
% проверка что сказал перонаж А
ПерсонажБ = персонаж(б,_),один_из(ПерсонажБ,Персонажи),
% выборка персонажа
проверка(ПерсонажБ,1,Процесс).
% проверка что сказал перонаж Б
суд2(Процесс2) :-
findall(Процесс1,суд1(Процесс1),Результаты),
%получаем в результате список всех гипотез удовлетворяющих первым двум высказываниям
один_из_участников(Предполагаем_Не_Шпион),
шпион(Предполагаем_Не_Шпион,Результаты,Невозможные_Результаты),
исключить_невозможные_ответы(Результаты,Невозможные_Результаты,Возможные_Результаты),
один_из(процесс(Персонажи1,Ответ1,Ответ2,ДалОтвет3,Ответ3),Возможные_Результаты),
исключить_подозреваемого(Предполагаем_Не_Шпион,Персонажи1,Персонажи2),
Процесс2 = процесс(Персонажи2,Ответ1,Ответ2,ДалОтвет3,Ответ3),
Подозреваемый = персонаж(ДалОтвет3,_),один_из(Подозреваемый,Персонажи2),
проверка(Подозреваемый,2,Процесс2).
конец_суда(вердикт(Шпион,Итоговый_Результат)) :-
findall(Процесс,суд2(Процесс),Результаты),
один_из_участников(Предполагаем_Шпион),
не_шпион(Предполагаем_Шпион,Результаты,Невозможные_Результаты),
исключить_невозможные_ответы(Результаты,Невозможные_Результаты,Возможные_Результаты),
один_из(Итоговый_Результат,Возможные_Результаты),
Итоговый_Результат = процесс(Персонажи,_,_,_,_),
Шпион = персонаж(_,шпион),один_из(Шпион,Персонажи).
подсказка1(Вердикт,Ответ4) :-
Ответ4 = "да", Вердикт = вердикт(_,процесс(_,Ответ1,Ответ2,_,Ответ3)),
конец_суда(Вердикт),
Ответ1 = Ответ2, Ответ1 = Ответ3;
Ответ4 = "нет", Вердикт = вердикт(_,процесс(_,Ответ1,Ответ2,_,_)),
конец_суда(Вердикт),
not(Ответ1 = Ответ2);
Ответ4 = "нет",Вердикт = вердикт(_,процесс(_,Ответ1,_,_,Ответ3)),
конец_суда(Вердикт),
not(Ответ1 = Ответ3);
Ответ4 = "нет",Вердикт = вердикт(_,процесс(_,_,Ответ2,_,Ответ3)),
конец_суда(Вердикт),
not(Ответ2 = Ответ3).
подсказка2(Вердикт,Ответ5) :-
Ответ5 = "да", Вердикт = вердикт(_,процесс(_,Ответ1,Ответ2,_,Ответ3)),
конец_суда(Вердикт),
количество_вхождений("нет",[Ответ1,Ответ2,Ответ3],ОтветовНет),
ОтветовНет >= 2;
Ответ5 = "нет", Вердикт = вердикт(_,процесс(_,Ответ1,Ответ2,_,Ответ3)),
конец_суда(Вердикт),
количество_вхождений("нет",[Ответ1,Ответ2,Ответ3],ОтветовНет),
ОтветовНет < 2.
%Формируем список гипотез в которых человек с именем Имя является шпионом
шпион(_,[],[]).
%Проверка если человек с именем Имя не является шпионом, то не добавляем в исходящий список
шпион(Имя,[процесс(Персонажи,_,_,_,_)|InT],Out):-not(один_из(персонаж(Имя,шпион),Персонажи)),шпион(Имя,InT,Out).
%Проверка если человек с именем Имя является шпионом, то добавляем его в список Out
шпион(Имя,[InH|InT],[InH|OutT]):-InH = процесс(Персонажи,_,_,_,_),один_из(персонаж(Имя,шпион),Персонажи),шпион
(Имя,InT,OutT).
%Формируем список гипотез в которых человек с именем Имя не является шпионом
не_шпион(_,[],[]).
%Проверка если человек с именем Имя является шпионом, то не добавляем в исходящий список
не_шпион(Имя,[процесс(Персонажи,_,_,_,_)|InT],Out):-один_из(персонаж(Имя,шпион),Персонажи),не_шпион(Имя,InT,Out).
%Проверка если человек с именем Имя не является шпионом, то добавляем его в список Out
не_шпион(Имя,[InH|InT],[InH|OutT]):-InH = процесс(Персонажи,_,_,_,_),not(один_из(персонаж
(Имя,шпион),Персонажи)),не_шпион(Имя,InT,OutT).
%Исключение невозможных гипотез
исключить_невозможные_ответы([],_,[]):-!.
исключить_невозможные_ответы([InH|InT],Ans,Out) :- не_возможен(InH,Ans),исключить_невозможные_ответы
(InT,Ans,Out).
исключить_невозможные_ответы([InH|InT],Ans,[InH|OutT]) :- not(не_возможен(InH,Ans)),исключить_невозможные_ответы
(InT,Ans,OutT).
не_возможен(процесс(_,Ответ11,Ответ21,Имя,Ответ31),[процесс(_,Ответ11,Ответ21,Имя,Ответ31)|_]).
не_возможен(Процесс,[_|AnsT]) :- не_возможен(Процесс,AnsT).
решение1(Список_Уникальных_Решений) :-
один_из_ответов(Ответ4),findall(Решение,подсказка1(Решение,Ответ4),Список_Решений),выбрать_уникальные
(Список_Решений,Список_Уникальных_Решений).
решение2(Список_Уникальных_Решений) :-
один_из_ответов(Ответ5),findall(Решение,подсказка2(Решение,Ответ5),Список_Решений),выбрать_уникальные
(Список_Решений,Список_Уникальных_Решений).
решили_вместе(Решения1,Решения2,"да") :- решение1(Решения1),количество_элементов(Решения1,1),
решение2(Решения2),количество_элементов(Решения2,1).
решили_вместе(Решения1,Решения2,"нет") :- решение1(Решения1),количество_элементов(Решения1,К1),not(К1=1),
решение2(Решения2),количество_элементов(Решения2,К2),not(К2=1).
итог(Шпион) :- один_из_ответов(Решили),решили_вместе(Решения1,Решения2,Решили),
пересечение(Решения1,Решения2,ИтоговыеРешения),
один_из(Решение,ИтоговыеРешения),Решение = вердикт(Шпион,_).
уникальный_итог(Шпион) :- findall(Персонаж, итог(Персонаж), Список_Решений), выбрать_уникальные
(Список_Решений,Список_Уникальных_Решений), один_из(Шпион,Список_Уникальных_Решений).
GOAL
уникальный_итог(Шпион).
Вывод
С помощью языка логического программирования Пролог возможно реализовать любые экспертные системы, решить любые головоломки и шарады. Он прекрасно подходит для программирования логических игр и многого другого, в том числе предпринимались попытки создан?/p>