Ответ в теме: Логическая задача на 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
        
   ищем_решение(Фигура).