Ответ в теме: Логическая задача на Prolog: Порядок фигур

      Комментарии к записи Ответ в теме: Логическая задача на Prolog: Порядок фигур отключены
#2852

prologgg
Участник

Здравствуйте еще раз. Код на писан на русском так как это требование преподавателя. Использование предиката divide_list тоже не разрешается.
Подскажите, пожалуйста, как правильно описать условие «фигура красного цвета лежит между зеленой и синей». Ведь красная фигура может лежать как и между зеленой и синей:
положение_на_столе (фигура(_,зеленый),фигура(_,красный),фигура(_,синий),Фигуры), так и наоборот положение_на_столе (фигура(_,синий),фигура(_,красный),фигура(_,зеленый),Фигуры),. Я пробовал описать это через или

положение_на_столе (фигура(_,зеленый),фигура(_,красный),фигура(_,синий),Фигуры);
положение_на_столе (фигура(_,синий),фигура(_,красный),фигура(_,зеленый),Фигуры),
,но пролог почему то не замечает второй вариант.
Тоже самое у нас получается со свойством
«круг лежит правее треугольника и ромба»,так как круг может лежать правее треугольника и ромба, так и правее ромба и треугольника.
DOMAINS
тип,цвет = symbol
предмет = фигура(тип,цвет)
список_предметов = предмет*
PREDICATES
nondeterm возможный_тип(тип)
nondeterm возможный_цвет(цвет)
имеет_тип(предмет,тип)
имеет_цвет(предмет,цвет)
nondeterm положение_на_столе(предмет,предмет,предмет,список_предметов)
nondeterm ищем_решение(список_предметов) 
CLAUSES
%  возможные значения свойств фигур	
возможный_тип(треугольник).
возможный_тип(ромб).
возможный_тип(круг).
возможный_тип(квадрат).
возможный_цвет(зеленый).
возможный_цвет(желтый).
возможный_цвет(синий).
возможный_цвет(красный).
имеет_тип(фигура(Точка,_),Тип):- Тип=Точка.
имеет_цвет(фигура(_,Черный),Цвет):- Цвет=Черный.
положение_на_столе(A,B,С,[A,B,С,_]).
положение_на_столе(A,B,D,[A,B,_,D]).
положение_на_столе(A,C,D,[A,_,C,D]).
положение_на_столе(B,C,D,[_,B,C,D]).
ищем_решение(Фигуры):-         /*  Генерация гипотезы    */
возможный_тип(Тип1),возможный_тип(Тип2),возможный_тип(Тип3),возможный_тип(Тип4),
возможный_цвет(Цвет1),возможный_цвет(Цвет2),возможный_цвет(Цвет3),возможный_цвет(Цвет4),
not(Тип1=Тип2), not(Цвет1=Цвет2), 
not(Тип1=Тип3),not(Цвет1=Цвет3), 
not(Тип1=Тип4),not(Цвет1=Цвет4), 
not(Тип3=Тип2),not(Цвет3=Цвет2), 
not(Тип4=Тип2),not(Цвет4=Цвет2), 
not(Тип4=Тип3),not(Цвет4=Цвет3), 
Фигуры =[фигура(Тип1,Цвет1),фигура(Тип2,Цвет2),фигура(Тип3,Цвет3),фигура(Тип4,Цвет4)],	
/* Проверка гипотезы      */
%  фигура красного цвета лежит между зеленой и синей		                  
положение_на_столе (фигура(_,зеленый),фигура(_,красный),фигура(_,синий),Фигуры),
%  положение_на_столе (фигура(_,синий),фигура(_,красный),фигура(_,зеленый),Фигуры),
%  справа от желтой фигуры лежит ромб
положение_на_столе(фигура(_,желтый),фигура(ромб,_),_,Фигуры),
%  круг лежит правее треугольника и ромба
положение_на_столе(фигура(треугольник,_),фигура(ромб,_),фигура(круг,_),Фигуры),
%положение_на_столе(фигура(ромб,_),фигура(треугольник,_),фигура(круг,_),Фигуры),
%  треугольник лежит не с краю
положение_на_столе(_,фигура(треугольник,_),_,Фигуры),
%  фигура синего цвета не лежит рядом с фигурой желтого цвета		
not(положение_на_столе(фигура(_,желтый),фигура(_,синий),_,Фигуры)),
not(положение_на_столе(_,фигура(_,синий),фигура(_,желтый),Фигуры)).
GOAL
ищем_решение(Фигура).