我有一项任务,我需要将列表向右旋转一次.我也有一个约束,我只能使用一个谓词.似乎向左移动非常容易:
([H|T], R) :- append(T, [H], R).
Run Code Online (Sandbox Code Playgroud)
但是,似乎更难以向右旋转并保持约束.这是我的尝试:
rotate([H], H).
rotate([H|T], F) :- rotate(T,F1), append(F1,T,F).
Run Code Online (Sandbox Code Playgroud)
在我的脑海中,它完美地工作,虽然我只是false作为一个输出.任何帮助解决这个问题将非常感谢!
fal*_*lse 13
如果您已经有一个谓词,比如rotl(L, Rotated)向左旋转一个谓词,则可以使用同一个谓词向右旋转.只需将列表放入第二个参数并保留第一个变量!
这是关系的深层理念:你可以以多种方式使用它们!
总结一下:
rotleft([E|T], R) :-
append(T,[E],R).
rotright(L, R) :-
rotleft(R, L).
Run Code Online (Sandbox Code Playgroud)
这里是最常见的查询,显示包含所有可能解决方案的所有答案:
| ?- rotright(L,R).
L = [_A],
R = [_A] ? ;
L = [_A,_B],
R = [_B,_A] ? ;
L = [_A,_B,_C],
R = [_C,_A,_B] ? ;
L = [_A,_B,_C,_D],
R = [_D,_A,_B,_C] ? ;
L = [_A,_B,_C,_D,_E],
R = [_E,_A,_B,_C,_D] ? ;
L = [_A,_B,_C,_D,_E,_F],
R = [_F,_A,_B,_C,_D,_E] ? ;
L = [_A,_B,_C,_D,_E,_F,_G],
R = [_G,_A,_B,_C,_D,_E,_F] ? ;
L = [_A,_B,_C,_D,_E,_F,_G,_H],
R = [_H,_A,_B,_C,_D,_E,_F,_G] ?
Run Code Online (Sandbox Code Playgroud)
你看到了这种模式吗?对于列表的每个长度(空列表除外),有一个答案包含所有可能的解决方案.看一下如何在一个答案中变量是相同的.我将用一个答案来说明这一点:
L = [_A,_B,_C,_D,_E,_F,_G],
\ \ \ \ \ \ \____
___ \ \ \ \ \ \
\ \ \ \ \ \ \
R = [_G,_A,_B,_C,_D,_E,_F] ? ;
Run Code Online (Sandbox Code Playgroud)
这是最有趣的问题:
列表看起来与向左/右旋转的列表相同?
尝试制定该查询并详细查看答案.