Здесь я предлагаю найти решение для числовых машин Смулляна, как определено здесь.
Постановка задачи
Это машины, которые принимают список цифр в качестве входных данных и преобразуют его в другой список цифр, следуя некоторым правилам, основанным на образце входных данных. Вот правила машины, приведенные в ссылке выше, выраженные немного более формально. Допустим, M - машина, а M (X) - преобразование X. Мы определяем несколько таких правил:
M(2X) = X
M(3X) = M(X)2M(X)
M(4X) = reverse(M(X)) // reverse the order of the list.
M(5X) = M(X)M(X)
И все, что не соответствует ни одному правилу, отклоняется. Вот несколько примеров:
- M(245) = 45
- M(3245) = M(245)2M(245) = 45245
- M (43245) = обратный (M (3245)) = обратный (45245) = 54254
- M(543245) = M(43245)M(43245) = 5425454254
И вопрос в том, найдите X такой, что:
- M(X) = 2
- M(X) = X
- M(X) = X2X
- M (X) = обратный (X)
- M (X) = обратный (X2X) обратный (X2X)
Вот второй пример, немного более сложный с исчерпывающим поиском (особенно, если мне нужны первые 10 или 100 решений).
M(1X2) = X
M(3X) = M(X)M(X)
M(4X) = reverse(M(X))
M(5X) = truncate(M(X)) // remove the first element of the list truncate(1234) = 234. Only valid if M(X) has at least 2 elements.
M(6X) = 1M(X)
M(7X) = 2M(X)
Вопросы:
- M(X) = XX
- M(X) = X
- M (X) = обратный (X)
(Не) Решения
Написать решатель на Prolog довольно просто. За исключением того, что это просто исчерпывающее исследование (также известное как грубая сила), и может потребоваться некоторое время для выработки некоторого набора правил.
Я попытался, но не смог выразить эту проблему в терминах логических ограничений с помощью CLP (FD), поэтому я попробовал CHR (правила обработки ограничений), чтобы выразить это в терминах ограничений для списков (особенно append
ограничений), но не важно, как я выражаюсь это всегда сводится к исчерпывающему поиску.
Вопрос
Есть идеи, какой подход я мог бы предпринять, чтобы решить любую проблему такого рода в разумные сроки? В идеале я хотел бы иметь возможность генерировать все решения короче, чем некоторая граница.
length(X, _), m(X, [2]).
: 'X = [2,2]?; X = [3,2]?; ' и так далее. - person Sergii Dymchenko   schedule 20.06.2014