Волог пролога - как генерировать сублисты данной длины

StackOverflow https://stackoverflow.com/questions/4094941

  •  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).
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top