У меня есть задание, в котором я должен выполнить sh следующее - учитывая список, такой как:
List = [_, _, $, _, _, _, _, $, _, $].
Я должен написать предикат pred/2
с помощью pred(List, Sub)
так, что это true
тогда и только тогда, когда Sub
является подсписком размера> = 2 без смежных переменных, в которых ни один из членов не является $
. Примеры:
List = [X, Y, $, P, Q, R, S, $, A, $], pred(List, [X, Y])
должно быть успешным.
List = [X, Y, $, P, Q, R, S, $, A, $], pred(List, [P, Q, R])
не должно быть успешным, поскольку S
смежно с P, Q, R
.
List = [X, Y, $, P, Q, R, S, $, A, $], pred(List, [P, Q, R, S])
должно быть успешным.
List = [X, Y, $, P, Q, R, S, $, A, $], pred(List, [A, $])
не может быть успешным, поскольку он включает $
.
Я написал следующий код, который, согласно небольшому количеству тестирования, делает то, что я хочу:
pred(List, Sub) :- pred(List, Sub, []).
pred([], Sub, Sub) :- length(Sub, Len),
Len >= 2.
pred([H|T], Sub, Aux) :- H \== $, !,
append(Aux, [H], New),
pred(T, Sub, New).
pred([$|_], Sub, Sub):- length(Sub, Len), Len >= 2.
pred([$|T], Sub, _) :- pred(T, Sub, []).
Тем не менее, я чувствую, что это решение занудное. Хотя я знаю, что StackOverflow, в общем, предназначен для вещей, которые люди не могут сделать , я действительно чувствую, что нашел довольно сложное решение простой проблемы и хотел бы узнать о лучший способ выполнить sh то, что я хочу.
Заранее спасибо!