Логическая задача на Visual Prolog, проверка условий
Формулировка задачи:
текст задачи: В Зазнандии три основных способа передвижения. Можно путешествовать пешком, а можно пользоваться частными воздушными такси или государственными воздушными трамваями. Четверо зазнандцев, живущих на окраине города, регулярно отправляются в центр на работу и на разные развлекательные мероприятия. В соответствии с национальными традициями все четверо одеваются в яркую однотонную одежду.
Экскурсовод-зазнандец, который использует стиль речи, характерный для жителей страны, объясняет, кто как одевается и кто каким транспортом пользуется.
1. Из четверых не найдется пары, путешествующей пешком или на воздушном такси.
2. Ни А ни Б, которые не пользуются воздушным такси, не носят красное.
3. Тот, кто одевается в красное, не путешествует пешком.
4. Ни тот, кто одевается в зеленое, ни тот кто одевается в синее, не ездят на такси.
5. Ни В, который не ездит на воздушном трамвае, ни Г не одевается в оранжевое.
6. Г, который не одевается в красное, не путешествует пешком.
7. Единственный, кто одевается в зеленое – а это не Б, не ездит на воздушном трамвае.
Ниже приведены мои попытки реализации кода, программа выводит “no solution”. В коде не описано первое условие “Из четверых не найдется пары, путешествующей пешком или на воздушном такси” и я не знаю как правильно его описать.
Помогите, пожалуйста, доработать программу.
Листинг программы
- DOMAINS
- имя,цвет,способ_передвижения = symbol
- количество = integer
- зазнадец = человек(имя,цвет,способ_передвижения)
- список_жителей = зазнадец*
- PREDICATES
- nondeterm входит_в(зазнадец,список_жителей)
- nondeterm возможное_имя(имя)
- nondeterm возможный_цвет(цвет)
- nondeterm возможное_передвижение(способ_передвижения)
- зовут(зазнадец,имя)
- одевает(зазнадец,цвет)
- передвигается(зазнадец,способ_передвижения)
- nondeterm зовут_не_Б(зазнадец,список_жителей)
- nondeterm не_одевает_красное(зазнадец,список_жителей)
- nondeterm не_одевает_оранжевое(зазнадец,список_жителей)
- nondeterm не_пользуется_воздушным_такси(зазнадец,список_жителей)
- nondeterm не_пользуется_воздушным_трамваем(зазнадец,список_жителей)
- nondeterm не_путешествует_пешком(зазнадец,список_жителей)
- nondeterm возможное_решение(имя,список_жителей)
- CLAUSES
- % правило для проверки, что зазнадец входит в список жителей
- входит_в(Житель,[Житель|_]).
- входит_в(Житель,[_|Хвост_Списка_Жителей]):-входит_в(Житель,Хвост_Списка_Жителей).
- % возможные значения свойств друзей
- возможное_имя(а).
- возможное_имя(б).
- возможное_имя(в).
- возможное_имя(г).
- возможное_передвижение(пешком).
- возможное_передвижение(воздушное_такси).
- возможное_передвижение(воздушный_трамвай).
- возможный_цвет(красный).
- возможный_цвет(оранжевый).
- возможный_цвет(синий).
- возможный_цвет(зеленый).
- % извлечение значения конкретного свойства
- зовут(человек(Вася,_,_),Имя):- Имя=Вася.
- одевает(человек(_,Белый,_),Цвет):- Цвет=Белый.
- передвигается(человек(_,_,Автобус),Способ_передвижения):- Способ_передвижения=Автобус.
- %вид_передвижения(человек(_,_,Автобус),Способ_передвижения):- Способ_передвижения=Автобус.
- % определение как трактовать
- зовут_не_Б(X,[X|_]).
- не_одевает_красное(X,[X|_]).
- не_одевает_оранжевое(X,[X|_]).
- не_пользуется_воздушным_такси(X,[X|_]).
- не_пользуется_воздушным_трамваем(X,[X|_]).
- не_путешествует_пешком(X,[X|_]).
- возможное_решение(Имя,Список_жителей):-
- возможное_имя(Имя1),возможное_имя(Имя2),возможное_имя(Имя3),возможное_имя(Имя4),
- возможный_цвет(Цвет1),возможный_цвет(Цвет2),возможный_цвет(Цвет3),возможный_цвет(Цвет4),
- возможное_передвижение(Способ1),возможное_передвижение(Способ2),возможное_передвижение(Способ3),возможное_передвижение(Способ4),
- not(Имя1=Имя2),not(Цвет1=Цвет2),not(Способ1=Способ2),
- not(Имя1=Имя3),not(Цвет1=Цвет3),not(Способ1=Способ3),
- not(Имя1=Имя4),not(Цвет1=Цвет4),not(Способ1=Способ4),
- not(Имя2=Имя3),not(Цвет2=Цвет3),not(Способ2=Способ3),
- not(Имя2=Имя4),not(Цвет2=Цвет4),not(Способ2=Способ4),
- not(Имя3=Имя4),not(Цвет3=Цвет4),Способ3=Способ4,
- Жители=[человек(Имя1,Цвет1,Способ1),человек(Имя2,Цвет2,Способ2),человек(Имя3,Цвет3,Способ3),человек(Имя4,Цвет4,Способ3)],
- % Ни А ни Б, которые не пользуются воздушным такси, не носят красное.
- зовут(Зазнадец11,а),не_пользуется_воздушным_такси(Зазнадец11,Жители),не_одевает_красное(Зазнадец11,Жители),
- зовут(Зазнадец12,б),не_пользуется_воздушным_такси(Зазнадец12,Жители),не_одевает_красное(Зазнадец12,Жители),
- % Тот, кто одевается в красное, не путешествует пешком.
- одевает(Зазнадец21,красный),не_путешествует_пешком(Зазнадец21,Жители),
- % Единственный, кто одевается в зеленое – а это не Б, не ездит на воздушном трамвае.
- % Ни тот, кто одевается в зеленое, ни тот кто одевается в синее, не ездят на такси.
- зовут_не_Б(Зазнадец31,Жители),одевает(Зазнадец31,зеленый),не_пользуется_воздушным_трамваем(Зазнадец31,Жители),не_пользуется_воздушным_такси(Зазнадец31,Жители),
- одевает(Зазнадец32,синий),не_пользуется_воздушным_такси(Зазнадец32,Жители),
- % Ни В, который не ездит на воздушном трамвае, ни Г не одевается в оранжевое.
- % Г, который не одевается в красное, не путешествует пешком.
- зовут(Зазнадец41,в),не_одевает_оранжевое(Зазнадец41,Житель),не_пользуется_воздушным_трамваем(Зазнадец41,Жители),
- зовут(Зазнадец42,г),не_одевает_оранжевое(Зазнадец42,Житель),не_одевает_красное(Зазнадец42,Жители),не_путешествует_пешком(Зазнадец42,Жители).
- % Из четверых не найдется пары, путешествующей пешком или на воздушном такси.
- % вид_передвижения(пешком,1),
- % вид_передвижения(воздушное_такси,1),
- % вид_передвижения(воздушный_трамвай,2).
- GOAL
- возможное_решение(Имя,Список_жителей).
Решение задачи: «Логическая задача на Visual Prolog, проверка условий»
textual
Листинг программы
- ?- time(жители1(Жители)).
- % 6,289 inferences, 0.000 CPU in 0.006 seconds (0% CPU, Infinite Lips)
- Жители = [чел(а, пешком, зеленое), чел(б, трамваем, оранжевое), чел(в, такси, красное), чел(г, трамваем, синее)] .
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д