Algorithm 青蛙和蟾蜍
我对Prolog非常陌生,遇到了一个似乎很容易实现的逻辑谜题,但在花了2天的时间在网上搜索之后,我仍然不知道如何在Prolog中解决它 三只青蛙和三只蟾蜍在下面的起始状态图所示的配置中排列。青蛙在右边,蟾蜍在左边。通过一系列有效的两栖动物移动,您必须将状态转换为目标状态,如下所示 但是青蛙和蟾蜍只能按照以下规格移动:Algorithm 青蛙和蟾蜍,algorithm,prolog,Algorithm,Prolog,我对Prolog非常陌生,遇到了一个似乎很容易实现的逻辑谜题,但在花了2天的时间在网上搜索之后,我仍然不知道如何在Prolog中解决它 三只青蛙和三只蟾蜍在下面的起始状态图所示的配置中排列。青蛙在右边,蟾蜍在左边。通过一系列有效的两栖动物移动,您必须将状态转换为目标状态,如下所示 但是青蛙和蟾蜍只能按照以下规格移动: 一次只能移动一种两栖动物(如青蛙或蟾蜍) 青蛙只能向左移动,蟾蜍只能向右移动 每一步都是爬行或跳跃 爬网是移动到相邻的空白空间 跳跃是指移动到距离起始空间两个空间的空白空间,这样
- 一次只能移动一种两栖动物(如青蛙或蟾蜍)
- 青蛙只能向左移动,蟾蜍只能向右移动
- 每一步都是爬行或跳跃
- 爬网是移动到相邻的空白空间
- 跳跃是指移动到距离起始空间两个空间的空白空间,这样跳跃起点和终点之间的空间被另一只两栖动物占据
- 青蛙只能跳过蟾蜍,蟾蜍只能跳过青蛙
最后状态::[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发行版中的搜索示例:该示例实现了状态空间搜索框架。这里有几个类似的问题。对您描述的问题进行编码主要是定义初始状态、目标状态和下一状态谓词的问题,以及请详细说明“似乎易于实现”的含义,最好包括一个与您喜欢的任何语言相关的伪代码示例。