Волог пролога - как генерировать сублисты данной длины
-
28-09-2019 - |
Вопрос
Я хочу создать все сублисты данного списка с данным свойством, в котором они имеют определенную длину, упомянутую в качестве аргумента, а также они имеют в качестве содержащего элемент данный элемент, который передается в качестве параметра. Мне удалось сделать это, но с помощью двух предикатов, а с точки зрения оптимальности очень медленно:
sublist([], []).
sublist([A|T], [A|L]):-
sublist(T, L).
sublist(T, [_|L]):-
sublist(T, L).
choose(T, L):-
sublist(T, L),
(dimension(2, T); dimension(1, T)),
belongs(f, T).
Здесь я хотел бы вернуться через T
параметр choose
Предикают все сублисты LIGLE LIGHT, которые имеют размер 2 или 1 и который содержит f
элемент.
Предикаты dimension
и member
имеет одинаковое использование, что и предопределенные предикаты length
, соответственно member
.
Можете ли вы сказать мне, как включить эти два условия в sublist
Предикат, чтобы программа строит только те конкретные сублисты?
Решение
Следующие строки подпоследовательности длины 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).