首页 文章

青蛙和蟾蜍

提问于
浏览
2

我对Prolog很新,遇到了一个似乎很容易实现的逻辑谜语,但是在网上搜索了2天之后,我还是无法解决如何在Prolog中解决它的问题 .

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

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

  • 一次只能移动一只两栖动物(即青蛙或蟾蜍) .

  • 青蛙只能向左移动,而蟾蜍只能向右移动 .

  • 每次移动都是以太网抓取或跳跃 .

  • 爬行是移动到相邻的空白区域 .

  • 跳跃是移动到距离起始空间两个空间的空白空间,这样跳跃的起点和终点之间的空间被另一个两栖动物占据 .

  • 青蛙只能跳过蟾蜍,蟾蜍只能跳过青蛙 .

Edit

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

这是我想要做的:

initial state: [frog1,frog2,frog3,gap,toad3,toad2,toad1]

transition_1:[frog1,frog2,gap,frog3,toad3,toad2,toad1] transition_2:[frog1,frog2,toad3,frog3,gap,toad2,toad1]

.

.

.

final state:: [toad3,toad2,toad1,gap,frog1,frog2,frog3]

1 回答

  • 0

    我用以下方式知道这个谜语 . 但我猜跳蛙/蟾蜍比跳骆驼更合理:

    两辆骆驼大篷车在一个狭窄的山谷中穿过 .

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

    /* 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
    

    家庭作业:更改上面的代码,以便显示一系列动作 .

相关问题