Следующие строит подпоследовательности длины MinLen =< Len =< MaxLen
. Понятия не имею, почему вы переименовали в length
и member
, поэтому я собираюсь использовать оригиналы. sublist/4
звонит вашему sublist/2
.
sublist(Sub,List,MinLen,MaxLen) :-
between(MinLen,MaxLen,Len),
length(Sub,Len),
sublist(Sub,List).
Обратите внимание, что length
вызывается для двух переменных, поэтому вы получаете итеративный углубляющий поиск . choose/2
теперь можно определить как
choose(Sub,List) :-
sublist(Sub,List,1,2),
member(f,Sub).
Это чистое решение. Если это недостаточно быстро, объедините все условия в один предикат:
choose(Sub,List),
(Sub = [f] ; Sub = [f,_] ; Sub = [_,f]),
sublist(Sub,List).