Algorithm 青蛙和蟾蜍

Algorithm 青蛙和蟾蜍,algorithm,prolog,Algorithm,Prolog,我对Prolog非常陌生,遇到了一个似乎很容易实现的逻辑谜题,但在花了2天的时间在网上搜索之后,我仍然不知道如何在Prolog中解决它 三只青蛙和三只蟾蜍在下面的起始状态图所示的配置中排列。青蛙在右边,蟾蜍在左边。通过一系列有效的两栖动物移动,您必须将状态转换为目标状态,如下所示 但是青蛙和蟾蜍只能按照以下规格移动: 一次只能移动一种两栖动物(如青蛙或蟾蜍) 青蛙只能向左移动,蟾蜍只能向右移动 每一步都是爬行或跳跃 爬网是移动到相邻的空白空间 跳跃是指移动到距离起始空间两个空间的空白空间,这样

我对Prolog非常陌生,遇到了一个似乎很容易实现的逻辑谜题,但在花了2天的时间在网上搜索之后,我仍然不知道如何在Prolog中解决它

三只青蛙和三只蟾蜍在下面的起始状态图所示的配置中排列。青蛙在右边,蟾蜍在左边。通过一系列有效的两栖动物移动,您必须将状态转换为目标状态,如下所示

但是青蛙和蟾蜍只能按照以下规格移动:

  • 一次只能移动一种两栖动物(如青蛙或蟾蜍)
  • 青蛙只能向左移动,蟾蜍只能向右移动
  • 每一步都是爬行或跳跃
  • 爬网是移动到相邻的空白空间
  • 跳跃是指移动到距离起始空间两个空间的空白空间,这样跳跃起点和终点之间的空间被另一只两栖动物占据
  • 青蛙只能跳过蟾蜍,蟾蜍只能跳过青蛙

编辑

我想实现的是青蛙和蟾蜍可以手动做出的所有可能的动作,我已经解决了这个问题,但我想实现它,以便程序在执行最少的动作的同时解决它

以下是我试图做的:

初始状态:[frog1、frog2、frog3、gap、toad3、toad2、toad1]

过渡区1:[frog1,frog2,间隙,frog3,toad3,toad2,toad1] 过渡区2:[frog1、frog2、toad3、frog3、gap、toad2、toad1]


最后状态::[toad3,toad2,toad1,gap,frog1,frog2,frog3]我知道这个谜语的方式如下。但我想跳青蛙/蟾蜍比跳骆驼更合理:

两队骆驼穿过一个狭窄的山谷

这里有一个简单的解决方案,使用蛮力和骆驼习语,前者是因为搜索空间没有循环并且是有限的:

/* 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).
/*右向驼峰前进*/
移动([0'>,0'| L],[0',0'>|L])。
/*左向骆驼前进*/
移动([0',0',0',0'|L])。
/*搜索进一步向右移动*/
移动([X | L],[X | R]):-move(L,R)。
找到(X,X)。
查找(X,Y):-移动(X,H),查找(H,Y)。
似乎有两种解决方案:

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

?-查找(">>>仅仅陈述一个问题,没有你无法进步的代码,并不是获得帮助的更好方式,所以…@这是我的问题,找不到一个来源来学习如何正确地编写它,我确信我所做的一切都没有意义,所以我没有发布它。这基本上是一个问题,所以可以使用一种规划语言来解决它,比如我在Prolog中看到了几个PDDL的开源实现。例如,请参见Logtalk发行版中的
搜索
示例:该示例实现了状态空间搜索框架。这里有几个类似的问题。对您描述的问题进行编码主要是定义初始状态、目标状态和下一状态谓词的问题,以及请详细说明“似乎易于实现”的含义,最好包括一个与您喜欢的任何语言相关的伪代码示例。