Задача на логику (разноцветные фигуры). Ошибка - Prolog
Формулировка задачи:
Добрый день!
Есть условие задачи: "На столе лежат в ряд четыре фигуры: треугольник, ромб, круг и квадрат. Квадрат,
круг, ромб и треугольник вырезаны из белой, синей, красной и зеленой бумаги. Известно, что:
круг не белый и не зеленый; синяя фигура лежит между ромбом и красной фигурой; треуголь-
ник не синий и не зеленый; квадрат лежит между треугольником и белой фигурой. Из бумаги
какого цвета вырезан ромб?"
Установил ограничения согласно условиям, но при выполнении
Возвращает
Непосредственно написанный код:
Есть идеи в чем может быть ошибка?
Решение задачи: «Задача на логику (разноцветные фигуры). Ошибка»
textual
Листинг программы
/*
круг не белый и не зеленый;
синяя фигура лежит между ромбом и красной фигурой;
треугольник не синий и не зеленый;
квадрат лежит между треугольником и белой фигурой
*/
фигура:-
фигура(Решение), вывод_табл(Решение).
фигура(Реш) :-
Реш = [[1,N1,C1],[2,N2,C2],[3,N3,C3],[4,N4,C4]],
перестановка([круг,квадрат,ромб,треугольник],[N1,N2,N3,N4]),
перестановка([красный,синий,белый,зеленый],[C1,C2,C3,C4]),
%перестановка([круг,квадрат,ромб,треугольник],[N1,N2,N3,N4]),
%перестановка([синий,зеленый,белый,красный],[C1,C2,C3,C4]),
not(member([_,круг,белый],Реш)),
not(member([_,круг,зеленый],Реш)),
%not(member([_,ромб,синий],Реш)),
%not(member([_,ромб,красный],Реш)),
not(member([_,треугольник,синий],Реш)),
not(member([_,треугольник,зеленый],Реш)),
%not(member([_,треугольник,белый],Реш)),
%not(member([_,квадрат,белый],Реш)),
member([СФ,_,синий],Реш), member([РБ,ромб,_],Реш), member([КФ,_,красный],Реш),
(СФ < РБ, СФ > КФ ; СФ > РБ, СФ < КФ),
member([КВ,квадрат,_],Реш), member([ТК,треугольник,_],Реш), member([БЛ,_,белый],Реш),
(КВ < ТК, КВ > БЛ ; КВ > ТК, КВ < БЛ).
перестановка([],[]).
перестановка([X|L],P):-перестановка(L,L1),вставить(X,L1,P).
вставить(X,L1,L2):-удалить(X,L2,L1).
удалить(X,[X|T],T).
удалить(X,[Н|T],[Н|T1]):-удалить(X,T,T1).
вывод_табл([A,B,C]) :-
Н=['N','Фигура','Цвет'],
write('+--+------------+----------+'),nl,
writef('|%2L|%12L|%10L|',Н),nl,
write('+--+------------+----------+'),nl,
writef('|%2L|%12L|%10L|',A),nl,
writef('|%2L|%12L|%10L|',B),nl,
writef('|%2L|%12L|%10L|',C),nl,
write('+--+------------+----------+'),nl.
Объяснение кода листинга программы
- В данной программе описывается решение логической задачи о разноцветных фигурах.
- Переменные решения задачи: Реш, СФ, КФ, РБ, БЛ, КВ, ТК, Н.
- Перестановка используется для перебора всех возможных комбинаций цветов фигур.
- Условие задачи описывает, какие цвета не могут быть у фигур.
- Четыре фигуры (круг, квадрат, ромб, треугольник) должны быть раскрашены в четыре цвета (красный, синий, зеленый, белый) таким образом, чтобы выполняться условиям задачи.
- Для каждой фигуры задается условие
Фигура не может быть ... - Программа перебирает все возможные комбинации цветов фигур и проверяет их на соответствие условиям задачи.
- Если найден вариант раскраски фигур, удовлетворяющий условиям задачи, он выводится на экран в виде таблицы.
- Если не найдено ни одного варианта раскраски фигур, удовлетворяющего условиям задачи, выводится сообщение об ошибке.