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