SWI Prolog задача про фигуры и их цвета относительно расположения

Узнай цену своей работы

Формулировка задачи:

Доброе время суток! Задача: На столе лежат в четыре ряда фигуры: треугольник, ромб, круг и квадрат. Цвета этих фигур - зеленый, желтый, синий, красный. Фигура красного цвета лежит между зеленой и синей (возможно, не рядом), справа от желтой фигуры лежит ромб, круг лежит правее треугольника и ромба, причем треугольник лежит не с краю и, наконец, фигура синего цвета не лежит рядом с фигурой желтого цвета. Определить, какого цвета круг. Наработка:
Листинг программы
  1. на_столе([['Треугольник',Треугольник],['Ромб',Ромб],['Круг',Круг],['Квадрат',Квадрат]]) :-
  2. Xs = [Треугольник, Ромб, Круг, Квадрат],
  3. Ys = [зеленый, желтый, синий, красный],
  4. перестановка(Xs, Ys),
  5. Круг \= желтый,
  6. Ромб \= желтый,
  7. Ромб \= синий,
  8. !.
  9. перестановка([], []).
  10. перестановка(List, [First|Perm]) :-
  11. выбор(First, List, Rest),
  12. перестановка(Rest, Perm).
  13. выбор(X, [X|Tail], Tail).
  14. выбор(Elem, [Head|Tail], [Head|Rest]) :-
  15. выбор(Elem, Tail, Rest).
Логика наработки не верна, т.к. зависимость цвета от расположения фигуры не учтена. Не могу найти логически похожую задачу, может кто подскажет?

Решение задачи: «SWI Prolog задача про фигуры и их цвета относительно расположения»

textual
Листинг программы
  1. /*
  2. На столе лежат в четыре ряда фигуры:
  3.   треугольник, ромб, круг и квадрат.
  4. Цвета этих фигур -
  5.   зеленый, желтый, синий, красный.
  6. Фигура красного цвета лежит между зеленой и синей (возможно, не рядом),
  7. справа от желтой фигуры лежит ромб,
  8. круг лежит правее треугольника и ромба,
  9. причем треугольник лежит не с краю и, наконец,
  10. фигура синего цвета не лежит рядом с фигурой желтого цвета.
  11. Определить, какого цвета круг.
  12. */
  13.  
  14. f(['треугольник', 'ромб', 'круг', 'квадрат']).
  15. c(['зеленый', 'желтый', 'синий', 'красный']).
  16. s([1, 2, 3, 4, 5]).
  17.  
  18. fc(FC) :-
  19.     f(F), c(C), s(S),
  20.     permutation1(F, F1),
  21.     permutation1(C, C1),
  22.     by_pairs(F1, C1, FC),
  23.     check_rules(S, FC).
  24.  
  25. by_pairs([], [], []).
  26. by_pairs([H1 | T1], [H2 | T2], [H1-H2 | R]) :-
  27.     by_pairs(T1, T2, R).
  28.  
  29. check_rules([], _).
  30. check_rules([H | T], FC) :-
  31.     r(H, FC),
  32.     check_rules(T, FC).
  33.  
  34. % Фигура красного цвета лежит между зеленой и синей (возможно, не рядом),
  35. r(1, FC) :-
  36.     select1(C1, [_-'зеленый', _-'синий'], [C2]),
  37.     append1(_, [ C1 | R1], FC),
  38.     append1(_, [_-'красный' | R2], R1),
  39.     member1(C2, R2).
  40. % справа от желтой фигуры лежит ромб,
  41. r(2, FC) :-
  42.    append1(_, [_-'желтый', 'ромб'-_ | _], FC).
  43. % круг лежит правее треугольника и ромба,
  44. r(3, FC) :-
  45.    select1(F1, ['треугольник'-_, 'ромб'-_], [F2]),
  46.    append1(_, [F1, F2, 'круг'-_ | _], FC).
  47. % причем треугольник лежит не с краю и, наконец,
  48. r(4, FC) :-
  49.     \+ FC = ['треугольник'-_ | _],
  50.     \+ append1(_, ['треугольник'-_], FC).
  51. % фигура синего цвета не лежит рядом с фигурой желтого цвета.
  52. r(5, FC) :-
  53.    \+ append1(_, [_-'желтый', _-'синий' | _], FC),
  54.    \+ append1(_, [ _-'синий', _-'желтый' | _], FC).
  55.  
  56. permutation1([], []).
  57. permutation1(List, [First | Perm]) :-
  58.         select1(First, List, Rest),
  59.         permutation1(Rest, Perm).
  60.  
  61. select1(Elem, [Elem | Tail], Tail).
  62. select1(Elem, [Head | Tail], [Head | Rest]) :-
  63.     select1(Elem, Tail, Rest).
  64.  
  65. member1(Elem, [Elem | _]).
  66. member1(Elem, [_ | Tail]):-
  67.     member1(Elem, Tail).
  68.  
  69. % если левый список пуст, то итоговый список совпадает с правым списком
  70. append1([], RightList, RightList).
  71. % иначе, взять голову из левого списка и перенести в голову итогового списка,
  72. append1([LeftHead|LeftTeil], RightList, [LeftHead|RightPart]) :-
  73.     % продолжить для хвоста левого списка
  74.     append1(LeftTeil, RightList, RightPart).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.25 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут