Лягушки и жабы - PullRequest
       1

Лягушки и жабы

0 голосов
/ 09 декабря 2018

Я очень новичок в Прологе и натолкнулся на загадку логики, которую, кажется, легко реализовать, но потратив 2 дня на поиск в Интернете, я все еще не могу понять, как ее решить в Прологе.

Три лягушки и три жабы выстроены в линию в конфигурации, показанной на рисунке «Начальное состояние» ниже.Лягушки справа, а жабы слева.С помощью серии действительных движений амфибий вы должны преобразовать состояние в состояние цели, также проиллюстрированное ниже.

Но лягушки и жабы могут двигаться только в соответствии со следующей спецификацией:

  • Только одна амфибия (то есть лягушка или жаба) может двигаться за один раз.
  • Лягушки могут двигаться только влево, а жабы могут двигаться только вправо.
  • Каждое движение - это простой обходили переход.
  • Сканирование - это перемещение в соседнее пустое пространство.
  • Переход - это перемещение в пустое пространство, которое находится в двух пространствах от начального пространства, так что пространствомежду началом и концом прыжка занята другая амфибия.
  • Лягушки могут прыгать только через жаб, а жабы могут прыгать только через лягушек.

Illustration of the starting and goal states

Редактировать

Я хочу реализовать все возможные шаги, которые могут сделать лягушки и жабы, вручную, я решил эту проблему, но я хочуреализовать его так, чтобы программа разрешала его, покавыполняя наименьшее количество ходов.

Вот что я пытаюсь сделать:

начальное состояние: [frog1, frog2, frog3, gap, toad3, toad2, toad1]

переход_1: [лягушка1, лягушка2, пробел, лягушка3, жаба3, жаба2, жаба1] переход_2: [лягушка1, лягушка2, жаба3, лягушка3, пробел, жаба2, жаба1]

.

.

.

конечное состояние :: [toad3, toad2, toad1, пробел, frog1, frog2, frog3]

1 Ответ

0 голосов
/ 09 декабря 2018

Я знаю эту загадку следующим образом.Но я думаю, что прыгать лягушек / жаб более разумно, чем прыгать на верблюдах:

Два каравана верблюдов пересекаются в узкой долине.

Вот простое решение, использующее грубую атакуСила и верблюд идиома, первая, потому что пространство поиска не имеет петель и конечно:

/* right facing camel advances */
move([0'>, 0' |L], [0' , 0'>|L]).
/* left facing camel advances */
move([0' , 0'<|L], [0'<, 0' |L]).
/* right facing camel jumps */
move([0'>, 0'<, 0' |L], [0' , 0'<, 0'>|L]).
/* left facing camel jumps */
move([0' , 0'>, 0'<|L], [0'<, 0'>, 0' |L]).
/* search move further right */
move([X|L], [X|R]) :- move(L, R).

find(X, X).
find(X, Y) :- move(X, H), find(H, Y).

Кажется, что есть два решения:

?- find(">>> <<<", "<<< >>>").
Yes ;
Yes ;
No

Домашняя работа: Изменить вышекод, так что он показывает список движений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...