Решение логической задачи на языке Prolog

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

ругу, по профессии адвокату. Разобравшись в деле, друг сказал: Я считаю, что данных недостаточно. Не мог бы ты сообщить мне по крайней мере, одинаковые ли ответы получил судья на все три вопроса? Мистер Энтони ответил. Смог ли адвокат решить после этого задачу, неизвестно.

При случае мистер Энтони задал ту же логическую задачу другому своему приятелю, по профессии также адвокату. Выслушав обстоятельства дела, этот приятель спросил: Получил ли судья по крайней мере два отрицательных ответа на свои вопросы? Мистер Энтони удовлетворил любознательность своего приятеля, но смог ли тот после этого решить задачу, неизвестно. Зато известно, продолжал Король, что эту логическую задачу либо решили, либо не решили оба приятеля мистера Энтони.

А теперь, сказал в заключение Король, я хочу спросить тебя, кто же был шпионом? Разве такую задачу можно решить? - вскричала в изумлении Алиса. Да, вполне, ответил Король. Торжественно заверяю тебя в этом.

prolog язык программирование логический

Листинг

 

персонаж = персонаж(имя,тип)

ответ,имя,тип = symbol

список_ответов = ответ*

список_типов = тип*

список_персонажей = персонаж*

процесс = процесс(список_персонажей,ответ,ответ,имя,ответ)

вердикт = вердикт(персонаж,процесс)

список_процессов = процесс*

список_вердиктов = вердикт*

 

номер = integer

количество = integer

PREDICATES

nondeterm один_из(персонаж,список_персонажей)

nondeterm один_из(тип,список_типов)

nondeterm один_из(процесс,список_процессов)

nondeterm один_из(вердикт,список_вердиктов)

nondeterm количество_вхождений(ответ,список_ответов,количество)

nondeterm количество_элементов(список_вердиктов,количество)

nondeterm выбрать_уникальные(список_вердиктов,список_вердиктов);

nondeterm выбрать_уникальные(список_персонажей,список_персонажей);

nondeterm пересечение(список_вердиктов,список_вердиктов,список_вердиктов)

nondeterm один_из_ответов(ответ)

nondeterm один_из_участников(имя)

nondeterm сказал(персонаж,номер,процесс)

nondeterm проверка(персонаж,номер,процесс)

nondeterm шпион(имя,список_процессов,список_процессов)

nondeterm не_шпион(имя,список_процессов,список_процессов)

nondeterm исключить_невозможные_ответы(список_процессов,список_процессов,список_процессов)

nondeterm не_возможен(процесс,список_процессов)

nondeterm исключить_подозреваемого(имя,список_персонажей,список_персонажей)

nondeterm гипотеза(процесс)

nondeterm суд1(процесс)

nondeterm суд2(процесс)

nondeterm конец_суда(вердикт)

nondeterm подсказка1(вердикт,ответ)

nondeterm подсказка2(вердикт,ответ)

nondeterm решение1(список_вердиктов)

nondeterm решение2(список_вердиктов)

nondeterm решили_вместе(список_вердиктов,список_вердиктов,ответ)

nondeterm итог(персонаж)

nondeterm уникальный_итог(персонаж)

CLAUSES

один_из(Что,[Что|_]).

один_из(Что,[_|Хвост]):-один_из(Что,Хвост).

%Количество

количество_вхождений(_,[],0).

количество_вхождений(Что,[Что|Хвост],Число) :-

количество_вхождений(Что,Хвост,Число_в_хвосте),

Число = Число_в_хвосте+1.

количество_вхождений(Что,[Нечто|Хвост],Число) :-

not(Что = Нечто),

количество_вхождений(Что,Хвост,Число).

количество_элементов([],0).

количество_элементов([_|Хвост_Списка],Количество):-

количество_элементов(Хвост_Списка,Количество_в_хвосте),

Количество=Количество_в_хвосте+1.

%Поиск пересечения множеств

пересечение([],_,[]).

пересечение([Head1|Tail1],List2,[Head1|TailOut]) :-

один_из(Head1,List2),пересечение(Tail1,List2,TailOut).

пересечение([Head1|Tail1],List2,ListOut) :-(один_из(Head1,List2)),пересечение(Tail1,List2,ListOut).

один_из_ответов(да).

один_из_ответов(нет).

один_из_участников(а).

один_из_участников(б).

один_из_участников(в).

выбрать_уникальные([],[]).

выбрать_уникальные([Голова|Хвост],[Голова|ХвостУ]) :-

not(один_из(Голова,Хвост)),выбрать_уникальные (Хвост,ХвостУ).

выбрать_уникальные([Голова|Хвост],СписокУ) :-

один_из(Голова,Хвост),выбрать_уникальные(Хвост,СписокУ).

сказал(персонаж(а,Тип),1,процесс(_,Ответ,_,_,_)) :-

Ответ = "да", Тип = "шпион";

Ответ = "нет", not(Тип = "шпион").

сказал(персонаж(б,_),1,Процесс) :-

Процесс = процесс(Персонажи,_,Ответ,_,_),

Ответ = "да", А = персонаж(а,_), один_из(А,Персонажи), сказал (А,1,Процесс);

Процесс = процесс(Персонажи,_,Ответ,_,_),

Ответ = "нет", А = персонаж(а,_), один_из(А,Персонажи), not(сказал (А,1,Процесс)).

сказал(Персонаж,2,Процесс) :-

Процесс = процесс(Персонажи,_,_,_,Ответ),

Ответ="да", один_из(Сосед,Персонажи), not(Сосед = Персонаж), Сосед = персонаж(_,шпион);

Процесс = процесс(Персонажи,_,_,_,Ответ),

Ответ="нет", один_из(Сосед,Персонажи), not(Сосед = Персонаж), Сосед = персонаж(_,Тип), not(Тип = "шпион").

проверка(Персонаж,Номер,Процесс) :- Персонаж = персонаж(_,рыцарь),сказал(Персонаж,Номер,Процесс).

проверка(Персонаж,Номер,Процесс) :- Персонаж = персонаж(_,лжец),not(сказал(Персонаж,Номер,Процесс)).

проверка(Персонаж,_,_) :- Персонаж = персонаж(_,шпион).

исключить_подозреваемого(_,[],[]).

исключить_подозреваемого(Имя,[персонаж(Имя,_)|InT],OutList) :- исключить_подозреваемого(Имя,InT,OutList).

исключить_подозреваемого(Имя,[InH|InT],[InH|OutT]) :- not(InH = персонаж(Имя,_)),исключить_подозреваемого

(Имя,InT,OutT).

гипотеза(Процесс) :-

ПерсонажА = персонаж(а, ТипА),

один_из(ТипА,[рыцарь,лжец,шпион]),

ПерсонажБ = персонаж(б,ТипБ),

один_из(ТипБ,[рыцарь,лжец,шпион]), not(ТипБ = ТипА),

ПерсонажВ = персонаж(в,ТипВ),

один_из(ТипВ,[рыцарь,лжец,шпион]), not(ТипВ = ТипА),not(ТипВ = ТипБ),

один_из_ответов(Ответ1),один_из_ответов(Ответ2),

один_из_участников(ДалОтвет3),од