在递归调用中返回项目

时间:2016-10-31 23:41:03

标签: prolog

我一直试图通过自己的滑动拼图版本来实现,并且在我扩展到大尺寸之前一直在使用更小尺寸的拼图(2尺寸拼图)。

我到目前为止创建的prolog代码是

move(1,2,0) :- true.
move(A,0,B) :- move(A,B,0),!,true.
move(0,A,B) :- move(A,0,B),!,true.
move(A,B,0) :- move(A,0,B),!,true.

对于我所拥有的2个大小的拼图,正确解决的拼图为1,2,0。到目前为止,我所返回的内容在确定有效输入是否给出解决的1,2,0的拼图时是正确的。

我接下来试图实现的是返回导致正确拼图的一组动作,并且我已经让它起作用(尽管不完全)。

我将上面的代码修改为:

move([X|X],1,2,0) :- true.
move([X],A,0,B) :- move([left|X],A,B,0),!,true.
move(0,A,B) :- move(A,0,B),!,true.
move(A,B,0) :- move(A,0,B),!,true.

当我输入move(输入,1,0,2)时它正确地给了我[left]这是我所期望的但是我不知道如何实现它以便它给我正确的移动输出( 1,2,0) - []和移动(0,1,2) - [左|左]。

我尝试了不同的各种编辑无济于事。我希望得到一些关于我做错的帮助。

谢谢!

1 个答案:

答案 0 :(得分:0)

你的州代表是什么? 我似乎无法想象它是一个2x2拼图。你的看起来像1x3拼图,所以我会继续并假设。

move([],1,2,0) :- true. % Don't need to move -> Empty move list
move([left|X],A,0,B) :- move(X,A,B,0),!,true.% -> make a move left, Followed by whatever moves you need from (A,B,0)
move([left|X],0,A,B) :- move(X,A,0,B),!,true.
move([right|X],A,B,0) :- move(X,A,0,B),!,true.

你的规则的头部必须有[ThisMove | RestOfMoves]。