217 lines
4.5 KiB
Prolog
217 lines
4.5 KiB
Prolog
% =====================================
|
|
% Operations on Lists:
|
|
%
|
|
% Iterators:
|
|
% - iter
|
|
% - iter_rev
|
|
% - iter_every_2nd
|
|
% - iter_nth
|
|
% - iter_odd
|
|
% - iter_even
|
|
%
|
|
% Metadata:
|
|
% - len
|
|
% - count (occurances of element)
|
|
% - indexof
|
|
% - sum (sum list of integers)
|
|
% - member (test if a element is in a list)
|
|
%
|
|
% Manipulation/Access:
|
|
% - nth (get N-th element)
|
|
% - remove (remove element by value)
|
|
% - del (remove element at index)
|
|
% - del_last
|
|
% - del_first
|
|
% - insert (insert at index)
|
|
% - add (append)
|
|
% - merge
|
|
% - repeat
|
|
%
|
|
% =====================================
|
|
|
|
% what to do on each iteration
|
|
do_sth(X):-writeln(X).
|
|
|
|
% iterate over list in sucessive order
|
|
% prints each element
|
|
%
|
|
% example: iter_nth([1,2,3,4,5,6,7,8,9])
|
|
% output: [1,2,3,4,5,6,7,8,9]
|
|
iter([]).
|
|
iter([H|T]):-do_sth(H), iter(T).
|
|
|
|
% iterate over list in reverse order
|
|
% prints each element
|
|
%
|
|
% example: iter_nth([1,2,3,4,5,6,7,8,9])
|
|
% output: [9,8,7,6,5,4,3,2,1]
|
|
iter_rev([A]):-do_sth(A).
|
|
iter_rev([H|T]):-iter_rev(T), do_sth(H).
|
|
|
|
% prints every 2nd element from the supplied list
|
|
iter_every_2nd([]).
|
|
iter_every_2nd([_|[H2|T]]):-do_sth(H2), iter_every_2nd(T).
|
|
|
|
% iterate over every nth element in the list
|
|
%
|
|
% example: iter_nth([1,2,3,4,5,6,7,8,9], 3)
|
|
% output: [3, 6, 9]
|
|
iter_nth([], _, _).
|
|
iter_nth([H|T], E, 0):-
|
|
R is E - 1,
|
|
iter_nth(T, E, R),
|
|
do_sth(H).
|
|
|
|
iter_nth([_|T], E, L):-
|
|
R is L - 1,
|
|
iter_nth(T, E, R).
|
|
|
|
iter_nth(L, N):-
|
|
R is N - 1,
|
|
iter_nth(L, N, R).
|
|
|
|
% iterate over all elements with an even index
|
|
iter_even(L):-iter_nth(L, 2).
|
|
|
|
% iterate over all elements with an odd index
|
|
iter_odd(L):-iter_nth(L, 2, 0).
|
|
|
|
% counts the amount of items in the supplied list
|
|
%
|
|
% example: len([1,2,3,4,5,6], X)
|
|
% output: X = 6
|
|
len([], L):-L is 0.
|
|
len([_|T], L):-
|
|
len(T, Tmp),
|
|
L is Tmp + 1.
|
|
|
|
% count the amounts an element `E` is present in the supplied list
|
|
%
|
|
% example: count([a,b,c,a], a, X)
|
|
% output: X = 2
|
|
count([], _, L):-L is 0.
|
|
count([H|T], E, L):-
|
|
H == E,
|
|
count(T, E, R),
|
|
L is R + 1.
|
|
count([_|T], E, L):-
|
|
count(T, E, R),
|
|
L is R.
|
|
|
|
% return the nth element of the supplied list.
|
|
% indexing starts with 0
|
|
%
|
|
% example: nth([a,b,c,d,e], 3, X)
|
|
% output: X = d
|
|
nth([],_).
|
|
nth([H|_], 0, O):-O is H.
|
|
nth([_|T], C, O):-
|
|
C1 is C - 1,
|
|
nth(T,C1, K),
|
|
O is K.
|
|
|
|
% return the index of the first occurance of the element
|
|
% in a list
|
|
% indexing starts with 0
|
|
%
|
|
% example: indexof([0,1,3,4,5,6,7,8,9], 3, X)
|
|
% output: X = 2
|
|
indexof([],_,_).
|
|
indexof([H|_],E,C):-
|
|
H == E,
|
|
C is 0.
|
|
indexof([_|T],E,C):-
|
|
indexof(T,E,R),
|
|
C is R + 1.
|
|
|
|
% removes all elements of Tar from the list
|
|
%
|
|
% example: remove([a,b,c,d], a, X)
|
|
% output: X = [b,c,d]
|
|
remove([],_,[]).
|
|
remove([Head|Tail], Head, Res):-
|
|
remove(Tail, Head, Res).
|
|
remove([Head|Tail], Tar, [Head|Res]):-
|
|
remove(Tail, Tar, Res).
|
|
|
|
% removes the last element
|
|
%
|
|
% example: del_last([1,2,3,4], X)
|
|
% output: X = [1, 2, 3]
|
|
del_last(List, Res):-
|
|
len(List, Len),
|
|
Tmp is Len - 1,
|
|
del(List, Tmp, Res).
|
|
|
|
% removes the first element
|
|
%
|
|
% example: del_first([1,2,3,4], X)
|
|
% output: X = [2, 3, 4]
|
|
del_first([_|Tail], Tail).
|
|
|
|
% append an element to the right end of the list
|
|
%
|
|
% example: add([a,b,c,d], a, X)
|
|
% output: X = [a,b,c,d,a]
|
|
add([], Elem, [Elem]).
|
|
add([Head|Tail], Elem, [Head|Tail2]):-
|
|
add(Tail, Elem, Tail2).
|
|
|
|
% insert an element into the list at a certain index
|
|
%
|
|
% example: insert([a,b,c,d], k, 2, X)
|
|
% output: X = [a, b, k, c, d]
|
|
insert([], _, _, []).
|
|
insert([Head|Tail], Elem, 0, [Elem|[Head|Tail]]).
|
|
insert([Head|Tail], Elem, Idx, [Head|Res]):-
|
|
Idx2 is Idx - 1,
|
|
insert(Tail, Elem, Idx2, Res).
|
|
|
|
% remove an element at the specified index from the list
|
|
%
|
|
% example: del([a,b,c,d], 2, X)
|
|
% output: X = [a, b, d]
|
|
del([], _, _, []).
|
|
del([_|Tail], 0, Tail).
|
|
del([Head|Tail], Idx, [Head|Res]):-
|
|
Idx2 is Idx - 1,
|
|
del(Tail, Idx2, Res).
|
|
|
|
% merge to lists together
|
|
%
|
|
% example: merge([a,b], [3,4], X)
|
|
% output: X = [a, b, 3, 4]
|
|
merge(List, [], List).
|
|
merge(List,[Head|Tail],Res):-
|
|
add(List, Head, Tmp),
|
|
merge(Tmp, Tail, Res).
|
|
|
|
% sum a list of values
|
|
%
|
|
% example: sum([1,2,3,4], X)
|
|
% value: X = 10
|
|
sum([], 0).
|
|
sum([Head|Tail], Res):-
|
|
sum(Tail, Tmp),
|
|
Res is Tmp + Head.
|
|
|
|
% detect whether an elemenz is part of a given list
|
|
%
|
|
% example: member([1,2,3,4], 4)
|
|
% output: true
|
|
%
|
|
% example: member([1,2,3,4], 9)
|
|
% output: false
|
|
member([Elem|_], Elem).
|
|
member([_|Tail], Elem):-member(Tail, Elem).
|
|
|
|
% repeat sth N-times
|
|
%
|
|
% example: repeat(a, 5, X).
|
|
% output: X = [a,a,a,a,a]
|
|
repeat(_, 0, []).
|
|
repeat(Elem, N, [Elem|Tmp]):-
|
|
N1 is N - 1,
|
|
repeat(Elem, N1, Tmp).
|
|
|