Хорошо, давайте разберем проблему на более мелкие части.Сначала мы создадим предикат, который соответствует элементам списка, пока список не будет исчерпан или пока он не достигнет элемента, который больше не является искомым элементом, мы можем реализовать это с помощью предиката seq/3
:
seq([], _, []).
seq([H|T], H, R) :-
seq(T, H, R).
seq([H|T], X, [H|T]) :-
dif(H, X).
Например:
?- seq(["u", "r", "d", "l"], "u", R).
R = ["r", "d", "l"] ;
false.
?- seq(["u", "r", "d", "l"], "r", R).
R = ["u", "r", "d", "l"].
Это означает, что мы можем проверить, что последовательность имеет ноль или более "u"
с, затем ноль или более "r"
с, а затем нольили больше "d"
с и, наконец, ноль или более "l"
с:
sequrdl(LA) :-
seq(LA, "u", LB),
seq(LB, "r", LC),
seq(LC, "d", LD),
seq(LD, "l", []).
Например:
?- sequrdl(["u","u","r","r","d","d","l","l"]).
true ;
false.
?- sequrdl(["u","u","r","r","d","d","l","l", "u"]).
false.
?- sequrdl(["u","u","r","r","d","d"]).
true ;
false.
Так что теперь нам нужно искать только до тех пор, поканайдите повернутый список, для которого это выполняется, и затем мы можем напечатать этот список, например:
try_all_sqA(What) :-
member(SubList, What),
sequrdl(SubList),
print('cyclic shift: '),
print(SubList),
nl.
Например:
?- try_all_sqA([["l", "u", "r", "d"], ["u", "r", "d", "l"], ["r", "d", "l", "u"], ["d", "l", "u", "r"]]).
'cyclic shift: '["u","r","d","l"]
true ;
false.