2016-10-31 124 views
0

我一直试图通过自己的滑动拼图版来实现,并且在扩展到较大尺寸之前一直使用较小尺寸的拼图(2尺寸拼图)。递归调用中的退回项目

,我已创建的序言代码迄今是

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. 

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

我试过不同的各种编辑无济于事。我希望得到一些帮助,以了解我所做的不正确。

谢谢!

回答

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]。

+0

没有评论其他任何东西,原始问题和答案中的所有“真实”都没有做任何事情。你可以安全地删除它们。 –

+0

我知道。我只是保留他们,因为他们在问题。 – 2bigpigs

+0

非常感谢!这很有意义。 – nelac123