protocol
subsequences_protocol
Protocol for subsequence operations over lists.
logtalk_load(subsequences(loader))static
Generation operations: Predicates for generating all subsequences or variants thereof.
Ordering variants: Predicates that support an additional Order argument (default, lexicographic, or shortlex) for controlling output order.
Searching and matching: Predicates for finding specific subsequences with desired properties.
Prefix and suffix operations: Predicates for checking and finding prefixes and suffixes.
Contiguous subsequences: Predicates for working with contiguous subsequences (subslices, sliding windows).
Random selection: Predicates for randomly selecting subsequences.
Constrained operations: Predicates for generating subsequences with specific constraints.
Utility predicates: Helper predicates for subsequence operations.
Public predicates
subsequences/2
Generates all subsequences of a list using default order. A subsequence maintains the relative order of elements but need not be contiguous. The empty list is included.
staticsubsequences(List,Subsequences)subsequences(+list,-list) - onesubsequences([a,b,c],Subsequences)Subsequences=[[],[a],[b],[a,b],[c],[a,c],[b,c],[a,b,c]]subsequence/2
True iff the second argument is a subsequence of the first argument. Subsequences of a list using default order. A subsequence maintains the relative order of elements but need not be contiguous. The empty list is included.
staticsubsequence(List,Subsequence)subsequence(+list,-list) - one_or_moresubsequence([1,2],Subsequence)Subsequence=[]subsequences/3
Generates all subsequences of a list with specified ordering: default (as naturally produced), lexicographic, or shortlex (by length first, then lexicographically).
staticsubsequences(List,Order,Subsequences)subsequences(+list,+atom,-list) - onesubsequences([a,b],shortlex,Subsequences)Subsequences=[[],[a],[b],[a,b]]subsequence/3
True iff the third argument is a subsequence of the first argument with specified ordering: default (as naturally produced), lexicographic, or shortlex (by length first, then lexicographically).
staticsubsequence(List,Order,Subsequence)subsequence(+list,+atom,-list) - one_or_moresubsequence([a,b],shortlex,Subsequence)Subsequence=[]nonempty_subsequences/2
Generates all non-empty subsequences of a list.
staticnonempty_subsequences(List,Subsequences)nonempty_subsequences(+list,-list) - onenonempty_subsequences([a,b],Subsequences)Subsequences=[[a],[b],[a,b]]nonempty_subsequence/2
True iff the second argument is a non-empty subsequence of the first argument.
staticnonempty_subsequence(List,Subsequence)nonempty_subsequence(+list,-list) - one_or_morenonempty_subsequence([a,b],Subsequence)Subsequence=[a]power_set/2
Generates the power set of a list (all possible subsequences). Alias for subsequences/2 when first argument is ground.
staticpower_set(List,PowerSet)power_set(+list,-list) - onepower_set([a,b],PowerSet)PowerSet=[[],[a],[b],[a,b]]inits/2
Generates all initial segments (prefixes) of a list, shortest first. Includes the empty list.
staticinits(List,Inits)inits(+list,-list) - oneinits([a,b,c],Inits)Inits=[[],[a],[a,b],[a,b,c]]init/2
True iff the second argument is one of the initial segments (prefixes) of a list.
staticinit(List,Inits)init(+list,-term) - zero_or_moreinit(+list,+term) - zero_or_oneinit([a,b,c],[a,b])truetails/2
Generates all final segments (suffixes) of a list, longest first. Includes the empty list.
statictails(List,Tails)tails(+list,-list) - onetails([a,b,c],Tails)Tails=[[a,b,c],[b,c],[c],[]]tail/2
True iff the second argument is one of the final segments (suffixes) of a list.
statictail(List,Tails)tail(+list,-term) - zero_or_moretail(+list,+term) - zero_or_onetail([a,b,c],[b,c])trueinits1/2
Generates all non-empty initial segments (prefixes) of a list, shortest first.
staticinits1(List,Inits)inits1(+list,-list) - oneinits1([a,b,c],Inits)Inits=[[a],[a,b],[a,b,c]]init1/2
True iff the second argument is a non-empty initial segment (prefix) of a list, shortest first.
staticinit1(List,Init)init1(+list,-term) - one_or_moreinit1([a,b,c],Init)Init=[a]tails1/2
Generates all non-empty final segments (suffixes) of a list, longest first.
statictails1(List,Tails)tails1(+list,-list) - onetails1([a,b,c],Tails)Tails=[[a,b,c],[b,c],[c]]tail1/2
True iff the second argument is a non-empty final segment (suffix) of a list, longest first.
statictail1(List,Tail)tail1(+list,-list) - onetail1([a,b,c],Tail)Tail=[a,b,c]init_tails/2
Generates all pairs of initial and final segments. Each pair Init-Tail represents a split of the list where Init+Tail equals the original list. When the second argument is bound, checks if it is a valid split.
staticinit_tails(List,InitTailPairs)init_tails(+list,-list) - oneinit_tails([a,b],InitTailPairs)InitTailPairs=['-'([],[a,b]),'-'([a],[b]),'-'([a,b],[])]init_tail/2
True iff (Init,Tail) represents a split of the list where Init+Tail equals the original list.
staticinit_tail(List,InitTailPairs)init_tail(+list,-term) - one_or_moreinit_tail([a,b,c],'-'([a],[b,c]))truelongest_common_subsequence/3
Finds the longest common subsequence (LCS) between two lists. Uses dynamic programming.
staticlongest_common_subsequence(List1,List2,LCS)longest_common_subsequence(+list,+list,-list) - onelongest_common_subsequence([a,b,c,d,e],[a,c,e,f],LCS)LCS=[a,c,e]longest_increasing_subsequence/2
Finds the longest strictly increasing subsequence in a list. Elements must be comparable.
staticlongest_increasing_subsequence(List,LIS)longest_increasing_subsequence(+list,-list) - onelongest_increasing_subsequence([3,1,4,1,5,9,2,6],LIS)LIS=[1,4,5,9]longest_decreasing_subsequence/2
Finds the longest strictly decreasing subsequence in a list. Elements must be comparable.
staticlongest_decreasing_subsequence(List,LDS)longest_decreasing_subsequence(+list,-list) - onelongest_decreasing_subsequence([9,5,2,8,3,1],LDS)LDS=[9,5,2,1]longest_common_increasing_subsequence/3
Finds the longest subsequence that is both common to two lists and strictly increasing.
staticlongest_common_increasing_subsequence(List1,List2,LCIS)longest_common_increasing_subsequence(+list,+list,-list) - onelongest_common_increasing_subsequence([1,4,2,5],[4,1,3,5],LCIS)LCIS=[1,5]longest_repeating_subsequence/2
Finds the longest subsequence that appears at least twice in the list (at different positions).
staticlongest_repeating_subsequence(List,LRS)longest_repeating_subsequence(+list,-list) - onelongest_repeating_subsequence([a,a,b,a,b],LRS)LRS=[a,b]is_subsequence_of/2
Checks if the first list is a subsequence of the second list. All elements must occur in order.
staticis_subsequence_of(Subsequence,List)is_subsequence_of(+list,+list) - zero_or_oneis_subsequence_of([a,c],[a,b,c])trueis_subsequence_of([c,a],[a,b,c])falseproper_subsequence/2
Checks if the first list is a proper subsequence of the second list (i.e., subsequence and not equal).
staticproper_subsequence(Subsequence,List)proper_subsequence(+list,+list) - zero_or_oneproper_subsequence([a,c],[a,b,c])trueproper_subsequence([a,b,c],[a,b,c])falsesubsequence_at_indices/3
Extracts a subsequence using a strictly increasing list of 1-based indices.
staticsubsequence_at_indices(List,Indices,Subsequence)subsequence_at_indices(+list,+list,-list) - zero_or_onesubsequence_at_indices([a,b,c,d],[1,3],Subsequence)Subsequence=[a,c]common_subsequences/3
Generates all subsequences that are common to both lists.
staticcommon_subsequences(List1,List2,CommonSubsequences)common_subsequences(+list,+list,-list) - onecommon_subsequences([a,b,c],[a,c,d],CommonSubsequences)CommonSubsequences=[[a,c],[a],[c],[]]common_subsequence/3
True iff the third argument is a common subsequence of both lists.
staticcommon_subsequence(List1,List2,CommonSubsequence)common_subsequence(+list,+list,-list) - one_or_morecommon_subsequence([a,b,c],[a,c,d],[a,c])truecount_distinct_subsequences/3
Counts the number of distinct occurrences of a pattern as a subsequence in a list.
staticcount_distinct_subsequences(Pattern,List,Count)count_distinct_subsequences(+list,+list,-integer) - onecount_distinct_subsequences([a,b],[a,a,b,b],Count)Count=4is_prefix_of/2
Checks if the first list is a prefix of the second list.
staticis_prefix_of(Prefix,List)is_prefix_of(+list,+list) - zero_or_oneis_prefix_of([a,b],[a,b,c])trueis_prefix_of([b,c],[a,b,c])falseis_suffix_of/2
Checks if the first list is a suffix of the second list.
staticis_suffix_of(Suffix,List)is_suffix_of(+list,+list) - zero_or_oneis_suffix_of([b,c],[a,b,c])trueis_suffix_of([a,b],[a,b,c])falsesubslices/2
Generates all contiguous non-empty subslices (sublists) of a list.
staticsubslices(List,Subslice)subslices(+list,-list) - onesubslices(+list,?list) - zero_or_moresubslices([a,b,c],Subslice)Subslice=[[a],[a,b],[a,b,c],[b],[b,c],[c]]sliding_window/3
Generates all contiguous windows of size N from a list. Fails if N is larger than the list length.
staticsliding_window(N,List,Window)sliding_window(+integer,+list,-list) - onesliding_window(+integer,+list,?list) - zero_or_moresliding_window(2,[a,b,c,d],Window)Window=[[a,b],[b,c],[c,d]]random_subsequence/2
Randomly selects one subsequence uniformly from all 2^N possible subsequences.
staticrandom_subsequence(List,Subsequence)random_subsequence(+list,-list) - onerandom_subsequence([a,b,c],Subsequence)Subsequence=[a,c]subsequences_with_min_span/3
Generates subsequences where consecutive elements are at least MinSpan positions apart in the original list.
staticsubsequences_with_min_span(MinSpan,List,Subsequence)subsequences_with_min_span(+integer,+list,-list) - onesubsequences_with_min_span(+integer,+list,?list) - zero_or_moresubsequences_with_min_span(2,[a,b,c,d],Subsequence)Subsequence=[a,c]alternating_subsequences/2
Generates all subsequences that alternate between increasing and decreasing (or vice versa). Elements must be comparable.
staticalternating_subsequences(List,AlternatingSubsequences)alternating_subsequences(+list,-list) - onealternating_subsequences([1,3,2,4],AlternatingSubsequences)AlternatingSubsequences=[[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]alternating_subsequence/2
True iff the second argument is a subsequence that alternates between increasing and decreasing (or vice versa). Elements must be comparable.
staticalternating_subsequence(List,AlternatingSubsequence)alternating_subsequence(+list,-list) - one_or_morealternating_subsequence([1,3,2,4],AlternatingSubsequence)AlternatingSubsequence=[[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]k_distinct_subsequences/3
Generates all K-element subsequences where all elements are distinct (no duplicates in the subsequence itself).
statick_distinct_subsequences(K,List,DistinctSubsequences)k_distinct_subsequences(+integer,+list,-list) - onek_distinct_subsequences(2,[a,a,b],DistinctSubsequences)DistinctSubsequences=[[a,b],[a,c],[b,c]]k_distinct_subsequence/3
True iff the third argument is a subsequence of the first argument that is a K-element subsequence where all elements are distinct (no duplicates in the subsequence itself).
statick_distinct_subsequence(K,List,DistinctSubsequence)k_distinct_subsequence(+integer,+list,-list) - onek_distinct_subsequence(2,[a,a,b],DistinctSubsequence)DistinctSubsequence=[a,b]count_subsequences/2
Counts the total number of subsequences (always 2^N for a list of length N).
staticcount_subsequences(List,Count)count_subsequences(+list,-integer) - onecount_subsequences([a,b,c],Count)Count=8subsequence_length/2
Returns the length of a subsequence (same as list length, provided for consistency).
staticsubsequence_length(Subsequence,Length)subsequence_length(+list,-integer) - onesubsequence_length([a,b,c],Length)Length=3Protected predicates
(none)
Private predicates
(none)
Operators
(none)