我对prolog很陌生,遇到了一个似乎很容易实现的逻辑谜题,但是花了两天的时间在网上搜索之后,我仍然无法用prolog来解决它。
三只青蛙和三只蟾蜍排成一列,如下图所示青蛙在右边,蟾蜍在左边。通过一系列有效的两栖移动,你必须将状态转换为目标状态,如下所示。
但青蛙和蟾蜍只能按照以下规格移动:
一次只能有一种两栖动物(即青蛙或蟾蜍)活动。
青蛙只能向左移动,蟾蜍只能向右移动。
每一步都是爬行或跳跃。
爬行是移动到相邻的空白空间。
跳跃是移动到离起始空间两个空间的空白空间,这样跳跃开始和结束之间的空间被另一个两栖动物占据。
青蛙只能跳过蟾蜍,蟾蜍只能跳过青蛙。
编辑
我想实现的是青蛙和蟾蜍可以手动完成的所有可能的动作,我已经解决了这个问题,但是我想实现它,所以程序在执行最少动作的同时解决它。
我想做的是:
初始状态:[frog1,frog2,frog3,gap,toad3,toad2,toad1]
过渡区1:[frog1,frog2,gap,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).
似乎有两种解决方案:
?- find(">>> <<<", "<<< >>>").
Yes ;
Yes ;
No
家庭作业:修改上面的代码,这样它就会显示一个动作列表。