Поскольку полное решение уже опубликовано, вот мое:
solution(State0, Target) -->
( { State0 == Target } -> []
; { step(State0, State1) },
[State1],
solution(State1, Target)
).
flip(->, <-).
flip(<-, ->).
step([], []).
step([A|Rest0], [A|Rest]) :- step(Rest0, Rest).
step([A0,A1|Rest], [B0,B1|Rest]) :- flip(A0, B0), flip(A1, B1).
Пример запроса:
?- length(Solution, _), phrase(solution([->,<-,->,<-,->,<-], [<-,<-,<-,->,->,->]), Solution).
Solution = [[->, <-, ->, <-, <-, ->],
[->, <-, ->, ->, ->, ->],
[->, ->, <-, ->, ->, ->],
[<-, <-, <-, ->, ->, ->]].
Поскольку используется итеративное углубление, мы знаем, что более короткое решение (менее 4 шагов) невозможно.
У меня также есть общий комментарий к тому, что вы сказали:
Это простой пример, который будет
легко решить в Java / C / что угодно. мой
проблема в том, что я считаю слишком
связано с мышлением Java на самом деле
сформулировать проблему таким образом, чтобы
использует логическую силу Пролога.
Лично я думаю, что этот пример уже намного больше, чем можно было ожидать от начинающего, скажем, Java-программиста. Пожалуйста, попробуйте решить эту проблему в Java / C / что угодно и посмотрите, как далеко вы продвинулись. По моему опыту, когда студенты говорят, что они «слишком привязаны к мышлению Java» и т. Д., Они также не могут решить проблему в Java. Пролог отличается, но не , что отличается от того, что, если бы у вас было четкое представление о том, как решить его в Java, вы не смогли бы перевести его напрямую в Пролог. Мое решение использует встроенный механизм поиска Prolog, но вам не нужно: вы можете осуществлять поиск самостоятельно, как в Java.