Я пытаюсь решить множество проблем, подобных проблеме Einsten, используя пролог.proog clpfd: создание арифметических ограничений из данных
Мой вход состоит из двух списков:
- список доменов. Например: [[домен (торговая марка), volkswagen, gm, audi], [домен (страна), германия, испания, Италия]].
- Список ограничений: [[=, spain, [+, gm, 1]], [=, germany, volkswagen], [=, italy, 2]]. Это означает: испания = г + 1, германия = фольксваген, Италия = 2.
я могу решить эту проблему легко жесткое кодирование его:
puzzle(Spain,Italy,Germany,Volkswagen,Gm,Audi,X):-
Country = [Spain, Italy, Germany], ins(Country, 1..X), all_different(Country),
Brand = [Volkswagen, Gm, Audi], ins(Brand, 1..X), all_different(Brand),
Spain #= Gm + 1,
Germany #= Volkswagen,
Italy #= 2.
И телефон:
275 ?- puzzle(Spain, Italy,Germany, Volkswagen, Gm, Audi,3).
Spain = Audi, Audi = 3,
Italy = Gm, Gm = 2,
Germany = Volkswagen, Volkswagen = 1.
Мои вопросы:
- Что было бы возможным динамически создавать домены из моих входных данных? В этом примере у меня есть только 2 домена (Страна, Бренд), но есть еще один вход с 5 или 6 доменами. Таким образом, как я могу сделать число и размер переменных домена?
- Как я могу создать ограничения динамически из списка, который у меня есть? Как связать константы из списка ограничений с переменными предыдущего вопроса?
В целом, как построить решатель, который зависит только от ввода?