Логическая задача "Венецианский купец" - Prolog
Формулировка задачи:
В универе дали задачку.
У героини комедии Шекспира «Венецианский купец» Порции было три шкатулки из золота, серебра и свинца. В одной из шкатулок хранился портрет Порции. На крышках каждой шкатулки были сделаны надписи:
- на золотой: «Портрет в этой шкатулке»;
- на серебряной: «Портрет не в этой шкатулке»;
- на свинцовой: «Портрет не в золотой шкатулке».
Порция объяснила, что среди этих высказываний истинно только одно.
Решение знаю - портрет в серебряной, а истина на свинцовой. Не могу написать код на прологе. Вот, что я набыдлокодил:
Среда GNU Prolog, если что.
Помогите, пожалуйста.
Решение задачи: «Логическая задача "Венецианский купец"»
textual
Листинг программы
m(gold). m(silver). m(lead). p(gold, X) :- X = gold. p(silver, X) :- X \= silver. p(lead, X) :- X \= gold. test(X) :- findall(Y, p(Y, X), L), length(L, 1). solve(X):- m(X), test(X).
Объяснение кода листинга программы
m(gold)
- утверждает, что есть золото.m(silver)
- утверждает, что есть серебро.m(lead)
- утверждает, что есть свинец.p(gold, X) :- X = gold
- устанавливает, что если речь идет о золоте, то значение переменной X равно gold.p(silver, X) :- X \= silver
- устанавливает, что если речь идет о серебре, то значение переменной X не равно silver.p(lead, X) :- X \= gold
- устанавливает, что если речь идет о свинце, то значение переменной X не равно gold.test(X) :- findall(Y, p(Y, X), L), length(L, 1)
- находит все значения переменной X, которые удовлетворяют правилам и выводит их в виде списка. Длина списка должна быть равна 1.solve(X) :- m(X), test(X)
- находит значения переменной X, которые удовлетворяют правилам и выводит их.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д