Я пытаюсь пройти через Искусственный интеллект: современный подход, чтобы облегчить мою естественную глупость. Пытаясь решить некоторые из упражнений, я столкнулся с проблемой "Кто принадлежит Зебре", упражнение 5.13 в Глава 5. Это была тема здесь на SO, но ответы в основном касались вопроса "как бы вы это решили, если бы у вас был свободный выбор программного обеспечения для решения проблем?"
Я принимаю, что Prolog - очень подходящий язык программирования для такого рода проблем, и есть некоторые прекрасные пакеты, например. в Python, как показано в высокопоставленном ответе, а также в автономном режиме. Увы, ничто из этого не помогает мне "выкрутить это" таким образом, как описано в книге.
В книге предлагается создать набор двойственных или, возможно, глобальных ограничений, а затем реализовать некоторые из упомянутых алгоритмов, чтобы найти решение. У меня много проблем с набором ограничений, подходящих для моделирования проблемы. Я изучаю это самостоятельно, поэтому у меня нет доступа к профессору или ТП, чтобы вывести меня за горб - вот где я прошу вас о помощи.
Я вижу мало сходства с примерами в этой главе.
Я стремился создавать двойные ограничения и начинал с создания (логического эквивалента) 25 переменных: nationality1
, nationality2
, nationality3
,... nationality5
, pet1
, pet2
, pet3
,... pet5
, drink1
... drink5
и т.д., где это число указывает на положение дома.
Это хорошо для создания унарных ограничений, например.
Норвежцы живут в первом доме:
nationality1 = { :norway }.
Но большинство ограничений представляет собой комбинацию двух таких переменных через общий номер дома, например.
У шведки есть собака:
nationality[n] = { :sweden } AND pet[n] = { :dog }
где n
может варьироваться от 1 до 5, очевидно. Или другой способ:
nationality1 = { :sweden } AND pet1 = { :dog }
XOR nationality2 = { :sweden } AND pet2 = { :dog }
XOR nationality3 = { :sweden } AND pet3 = { :dog }
XOR nationality4 = { :sweden } AND pet4 = { :dog }
XOR nationality5 = { :sweden } AND pet5 = { :dog }
..., который имеет совершенно иное отношение к нему, чем "список кортежей", защищенный книгой:
( X1, X2, X3 = { val1, val2, val3 }, { val4, val5, val6 }, ... )
Я не ищу решение как таковое; Я ищу начало, как смоделировать эту проблему таким образом, который совместим с книжным подходом. Любая помощь была оценена.