| 1 | |
|---|
| 2 | :- object(list, |
|---|
| 3 | implements(listp), |
|---|
| 4 | extends(compound)). |
|---|
| 5 | |
|---|
| 6 | :- info([ |
|---|
| 7 | version is 1.4, |
|---|
| 8 | author is 'Paulo Moura', |
|---|
| 9 | date is 2008/4/22, |
|---|
| 10 | comment is 'List predicates.']). |
|---|
| 11 | |
|---|
| 12 | :- public(as_difflist/2). |
|---|
| 13 | :- mode(as_difflist(+list, -list), one). |
|---|
| 14 | :- info(as_difflist/2, |
|---|
| 15 | [comment is 'Converts a list to a difference list.', |
|---|
| 16 | argnames is ['List', 'Diffist']]). |
|---|
| 17 | |
|---|
| 18 | |
|---|
| 19 | append([], List, List). |
|---|
| 20 | append([Head| Tail], List, [Head| Tail2]) :- |
|---|
| 21 | append(Tail, List, Tail2). |
|---|
| 22 | |
|---|
| 23 | |
|---|
| 24 | as_difflist([], Back-Back). |
|---|
| 25 | as_difflist([Head| Tail], [Head| Tail2]-Back) :- |
|---|
| 26 | as_difflist(Tail, Tail2-Back). |
|---|
| 27 | |
|---|
| 28 | |
|---|
| 29 | delete([], _, []). |
|---|
| 30 | delete([Head| Tail], Element, Remaining) :- |
|---|
| 31 | ( Head == Element -> |
|---|
| 32 | delete(Tail, Element, Remaining) |
|---|
| 33 | ; Remaining = [Head| Tail2], |
|---|
| 34 | delete(Tail, Element, Tail2) |
|---|
| 35 | ). |
|---|
| 36 | |
|---|
| 37 | delete_matches([], _, []). |
|---|
| 38 | delete_matches([Head| Tail], Element, Remaining) :- |
|---|
| 39 | ( \+ \+ Head = Element -> |
|---|
| 40 | delete_matches(Tail, Element, Remaining) |
|---|
| 41 | ; Remaining = [Head| Tail2], |
|---|
| 42 | delete_matches(Tail, Element, Tail2) |
|---|
| 43 | ). |
|---|
| 44 | |
|---|
| 45 | empty(List) :- |
|---|
| 46 | List == []. |
|---|
| 47 | |
|---|
| 48 | flatten(List, Flatted) :- |
|---|
| 49 | flatten(List, [], Flatted). |
|---|
| 50 | |
|---|
| 51 | flatten(Var, Tail, [Var| Tail]) :- |
|---|
| 52 | var(Var), |
|---|
| 53 | !. |
|---|
| 54 | flatten([], Flatted, Flatted) :- |
|---|
| 55 | !. |
|---|
| 56 | flatten([Head| Tail], List, Flatted) :- |
|---|
| 57 | !, |
|---|
| 58 | flatten(Tail, List, Aux), |
|---|
| 59 | flatten(Head, Aux, Flatted). |
|---|
| 60 | flatten(Head, Tail, [Head| Tail]). |
|---|
| 61 | |
|---|
| 62 | keysort(List, Sorted) :- |
|---|
| 63 | {keysort(List, Sorted)}. |
|---|
| 64 | |
|---|
| 65 | last([Head| Tail], Last) :- |
|---|
| 66 | last(Tail, Head, Last). |
|---|
| 67 | |
|---|
| 68 | last([], Last, Last). |
|---|
| 69 | last([Head| Tail], _, Last) :- |
|---|
| 70 | last(Tail, Head, Last). |
|---|
| 71 | |
|---|
| 72 | length(List, Length) :- |
|---|
| 73 | ( integer(Length) -> |
|---|
| 74 | Length >= 0, |
|---|
| 75 | make_list(Length, List) |
|---|
| 76 | ; length(List, 0, Length) |
|---|
| 77 | ). |
|---|
| 78 | |
|---|
| 79 | make_list(0, []):- |
|---|
| 80 | !. |
|---|
| 81 | make_list(N, [_| Tail]):- |
|---|
| 82 | M is N-1, |
|---|
| 83 | make_list(M, Tail). |
|---|
| 84 | |
|---|
| 85 | length([], Length, Length). |
|---|
| 86 | length([_| Tail], Acc, Length) :- |
|---|
| 87 | Acc2 is Acc + 1, |
|---|
| 88 | length(Tail, Acc2, Length). |
|---|
| 89 | |
|---|
| 90 | max([N| Ns], Max) :- |
|---|
| 91 | max(Ns, N, Max). |
|---|
| 92 | |
|---|
| 93 | max([], Max, Max). |
|---|
| 94 | max([N| Ns], Aux, Max) :- |
|---|
| 95 | ( N @> Aux -> |
|---|
| 96 | max(Ns, N, Max) |
|---|
| 97 | ; max(Ns, Aux, Max) |
|---|
| 98 | ). |
|---|
| 99 | |
|---|
| 100 | member(Element, [Element| _]). |
|---|
| 101 | member(Element, [_| List]) :- |
|---|
| 102 | member(Element, List). |
|---|
| 103 | |
|---|
| 104 | |
|---|
| 105 | memberchk(Element, [Element| _]) :- |
|---|
| 106 | !. |
|---|
| 107 | memberchk(Element, [_| List]) :- |
|---|
| 108 | memberchk(Element, List). |
|---|
| 109 | |
|---|
| 110 | min([N| Ns], Min) :- |
|---|
| 111 | min(Ns, N, Min). |
|---|
| 112 | |
|---|
| 113 | min([], Min, Min). |
|---|
| 114 | min([N| Ns], Aux, Min) :- |
|---|
| 115 | ( N @< Aux -> |
|---|
| 116 | min(Ns, N, Min) |
|---|
| 117 | ; min(Ns, Aux, Min) |
|---|
| 118 | ). |
|---|
| 119 | |
|---|
| 120 | new([]). |
|---|
| 121 | |
|---|
| 122 | nextto(X, Y, [X, Y| _]). |
|---|
| 123 | nextto(X, Y, [_| Tail]) :- |
|---|
| 124 | nextto(X, Y, Tail). |
|---|
| 125 | |
|---|
| 126 | nth0(Nth, List, Element) :- |
|---|
| 127 | nth(Element, List, 0, Nth, _). |
|---|
| 128 | |
|---|
| 129 | nth0(Nth, List, Element, Tail) :- |
|---|
| 130 | nth(Element, List, 0, Nth, Tail). |
|---|
| 131 | |
|---|
| 132 | nth1(Nth, List, Element) :- |
|---|
| 133 | nth(Element, List, 1, Nth, _). |
|---|
| 134 | |
|---|
| 135 | nth1(Nth, List, Element, Tail) :- |
|---|
| 136 | nth(Element, List, 1, Nth, Tail). |
|---|
| 137 | |
|---|
| 138 | nth(Element, List, Acc, Nth, Tail) :- |
|---|
| 139 | ( integer(Nth), |
|---|
| 140 | Nth >= Acc, |
|---|
| 141 | nth_aux(NthElement, List, Acc, Nth, Tail) -> |
|---|
| 142 | Element = NthElement |
|---|
| 143 | ; var(Nth), |
|---|
| 144 | nth_aux(Element, List, Acc, Nth, Tail) |
|---|
| 145 | ). |
|---|
| 146 | |
|---|
| 147 | nth_aux(Head, [Head| Tail], Position, Position, Tail). |
|---|
| 148 | nth_aux(Head, [_| List], Count, Position, Tail) :- |
|---|
| 149 | Count2 is Count + 1, |
|---|
| 150 | nth_aux(Head, List, Count2, Position, Tail). |
|---|
| 151 | |
|---|
| 152 | permutation(List, Permutation) :- |
|---|
| 153 | same_length(List, Permutation), |
|---|
| 154 | permutation2(List, Permutation). |
|---|
| 155 | |
|---|
| 156 | permutation2([], []). |
|---|
| 157 | permutation2(List, [Head| Tail]) :- |
|---|
| 158 | select(Head, List, Remaining), |
|---|
| 159 | permutation2(Remaining, Tail). |
|---|
| 160 | |
|---|
| 161 | prefix([], _). |
|---|
| 162 | prefix([Element| Tail], [Element| Tail2]) :- |
|---|
| 163 | prefix(Tail, Tail2). |
|---|
| 164 | |
|---|
| 165 | reverse(List, Reversed) :- |
|---|
| 166 | reverse(List, [], Reversed, Reversed). |
|---|
| 167 | |
|---|
| 168 | reverse([], Reversed, Reversed, []). |
|---|
| 169 | reverse([Head| Tail], List, Reversed, [_| Bound]) :- |
|---|
| 170 | reverse(Tail, [Head| List], Reversed, Bound). |
|---|
| 171 | |
|---|
| 172 | same_length([], []). |
|---|
| 173 | same_length([_| Tail1], [_| Tail2]) :- |
|---|
| 174 | same_length(Tail1, Tail2). |
|---|
| 175 | |
|---|
| 176 | select(Head, [Head| Tail], Tail). |
|---|
| 177 | select(Head, [Head2| Tail], [Head2| Tail2]) :- |
|---|
| 178 | select(Head, Tail, Tail2). |
|---|
| 179 | |
|---|
| 180 | sort(List, Sorted) :- |
|---|
| 181 | {sort(List, Sorted)}. |
|---|
| 182 | |
|---|
| 183 | sublist(List, List). |
|---|
| 184 | sublist(Sublist, [Head| Tail]):- |
|---|
| 185 | sublist(Tail, Head, Sublist). |
|---|
| 186 | |
|---|
| 187 | sublist(Sublist, _, Sublist). |
|---|
| 188 | sublist([Head| Tail], _, Sublist):- |
|---|
| 189 | sublist(Tail, Head, Sublist). |
|---|
| 190 | sublist([Head| Tail], Element, [Element| Sublist]):- |
|---|
| 191 | sublist(Tail, Head, Sublist). |
|---|
| 192 | |
|---|
| 193 | subtract([], _, []). |
|---|
| 194 | subtract([Head| Tail], List, Rest) :- |
|---|
| 195 | ( ::memberchk(Head, List) -> |
|---|
| 196 | subtract(Tail, List, Rest) |
|---|
| 197 | ; Rest = [Head| Tail2], |
|---|
| 198 | subtract(Tail, List, Tail2) |
|---|
| 199 | ). |
|---|
| 200 | |
|---|
| 201 | suffix(List, List). |
|---|
| 202 | suffix(List, [_| Tail]) :- |
|---|
| 203 | suffix(List, Tail). |
|---|
| 204 | |
|---|
| 205 | valid(-) :- % catch variables and lists with unbound tails |
|---|
| 206 | !, |
|---|
| 207 | fail. |
|---|
| 208 | valid([]). |
|---|
| 209 | valid([_| List]) :- |
|---|
| 210 | valid(List). |
|---|
| 211 | |
|---|
| 212 | :- end_object. |
|---|