Решение логической задачи на языке 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>