我正在学习prolog的过程中,我正在为一个非常简单的游戏写下一个谓词。下一个谓词混淆
你有一个列表[1,0,1,0,0,1]合法的移动是将1移动到零位置,1只能移动到第一个包含0的位置,但它是允许的在必要时跳过其他值。
首先,我写了一个谓语更改值0到1:
flip_first_zero([0|Tail], [1|Tail]).
很简单,现在我试图找到合法的举动,我会尽量解释我的思维过程:
next([],[],[]).
next([Head|Tail], Rest, Out):-
flip_first_zero([Head|Tail],List1),
append(Rest,List1,Out).
next([Head|Tail], [Head|Rest], List):-
next(Tail,Rest, List).
示例[1,0,0,1,1,1,0]
输出应为[0,1,0,1,1,1,0] ; [1,0,0,0,1,1,1]; [1,0,0,1,0,1,1] ; [1,0,0,1,1,0,1].
[,0,0,1,1,1,0] - > [0,,0,1,1,1,0]
[1,0,0,1 ,1,1,0] - > [1,0,0,0,1,1, ]
[1,0,0,1,,1,0] - > [1,0,0,1,0,1,]
[1 ,0,0,1,1,,0] - > [1,0,0,1,1,0,]
所以我如何理解这一点,我通过在Rest中保留这个来每次移除头部来循环,这样我就可以在后面追加它。
我接近这个错误吗?
关于你提到的第二个问题:你在这两个条款把'0' - 只需将其更改为'1'中的第一个和它会按预期工作。 – Steven
ahhh我是个白痴哈哈,谢谢@Steven – user3667111
关于你的主要问题,我也对你想用第二个参数做什么感到困惑。我认为你根本不需要它 - 如果你想让我保持不变,只需在输出列表中加上'Head'即可。 – Steven