Recursion Prolog中的矩形钉接龙?

Recursion Prolog中的矩形钉接龙?,recursion,prolog,counter,Recursion,Prolog,Counter,因为我是Prolog新手,这里可能有一个快速的问题。我正在尝试将这个用于解决三角形钉接龙难题的代码转换为解决矩形钉接龙难题的代码。我想我面临的问题是如何让程序知道它完成了谜题。以下是我目前得到的: % Legal jumps along a line. linjmp([x, x, o | T], [o, o, x | T]). linjmp([o, x, x | T], [x, o, o | T]). linjmp([H|T1], [H|T2]) :- linjmp(T1,T2). % Rot

因为我是Prolog新手,这里可能有一个快速的问题。我正在尝试将这个用于解决三角形钉接龙难题的代码转换为解决矩形钉接龙难题的代码。我想我面临的问题是如何让程序知道它完成了谜题。以下是我目前得到的:

% Legal jumps along a line.
linjmp([x, x, o | T], [o, o, x | T]).
linjmp([o, x, x | T], [x, o, o | T]).
linjmp([H|T1], [H|T2]) :- linjmp(T1,T2).

% Rotate the board
rotate([[A, B, C, D, E, F],
        [G, H, I, J, K, L],
        [M, N, O, P, Q, R],
        [S, T, U, V, W, X]],
        [[S, M, G, A],
        [T, N, H, B],
        [U, O, I, C],
        [V, P, J, D],
        [W, Q, K, E],
        [X, R, L, F]]).

rotateBack([[A, B, C, D],
            [E, F, G, H],
            [I, J, K, L],
            [M, N, O, P],
            [Q, R, S, T],
            [U, V, W, X]],
            [[D, H, L, P, T, X],
            [C, G, K, O, S, W],
            [B, F, J, N, R, V],
            [A, E, I, M, Q, U]]).

% A jump on some line.
horizjmp([A|T],[B|T]) :- linjmp(A,B).
horizjmp([H|T1],[H|T2]) :- horizjmp(T1,T2).

% One legal jump.
jump(B,A) :- horizjmp(B,A).
jump(B,A) :- rotate(B,BR), horizjmp(BR,BRJ), rotateBack(A,BRJ).
%jump(B,A) :- rotate(BR,B), horizjmp(BR,BRJ), rotate(BRJ,A).

% Series of legal boards.
series(From, To, [From, To]) :- jump(From, To).
series(From, To, [From, By | Rest])
       :- jump(From, By),
         series(By, To, [By | Rest]).

% A solution.
solution(L) :- series([[o, x, x, x, x, x],
                       [x, x, x, x, x, x],
                       [x, x, x, x, x, x],
                       [x, x, x, x, x, x]], L).
三角形拼图代码要求用户输入结束表的外观,但我不希望这样。我希望这能说明任何可能的解决办法。该表始终精确为6x4。我喜欢旋转网格以继续简单计算水平跳跃的想法,因此我将旋转函数更改为旋转其侧面,并添加了旋转回退函数以将其放回原位。我想我必须这样做,因为网格不是对称的。因为它总是这么大,我想找到终点的最简单的方法是设置一个计数器来计算发生了多少次移动。一旦我们达到22个移动,最大移动可能清除除1个peg外的整个网格,那么解决方案将是成功的

换句话说,我认为我需要删除以下代码:

% Series of legal boards.
series(From, To, [From, To]) :- jump(From, To).
series(From, To, [From, By | Rest])
       :- jump(From, By),
         series(By, To, [By | Rest]).

然后改变它,这样它就会设置一个计数器,停在22。有什么建议吗?

我想你可以数一数这些钉子,如果至少有两个钉子的话,那就更好了

为了有效地执行此操作,应该使用未经测试的代码

finished(L) :-
   \+ call_nth(find_peg(L), 2).
find_peg(L) :-
   member(R, L),
   memberchk(R, x).

中定义的调用n/2需要内置的。这在SWI Prolog或Yap中提供。

我认为您可以计算PEG,或者更好,在至少有2个PEG时失败

为了有效地执行此操作,应该使用未经测试的代码

finished(L) :-
   \+ call_nth(find_peg(L), 2).
find_peg(L) :-
   member(R, L),
   memberchk(R, x).
中定义的调用n/2需要内置的。这在SWI Prolog或Yap中可用。

请注意,rotate/2和rotateBack/2的定义基本相同,唯一的区别是参数顺序。因此,您不需要在Prolog中使用rotateBack/2!请注意,rotate/2和rotateBack/2本质上是相同的定义,唯一的区别是参数顺序。因此,您不需要在Prolog中使用rotateBack/2!