% ------------------------------------------
% Logische Programmierung, ueb 2, 11.11.2002
% (c)Marc Dörflinger, Roger, Philip Iezzi
% ------------------------------------------



% ----------
% is_list(L) :- L is a list
% ----------

my_is_list([]).
my_is_list([_|Xs]) :-
	my_is_list(Xs).



% ------------------------
% my_member(Element, List) :- Element is an element of List
% ------------------------

my_member(X,[X|_]).      % X is a member of a list if it is its head, or
my_member(X,[_|Xs]) :-   % if it is an element of the tail
	my_member(X,Xs).



% -------------------
% my_append(L1,L2,L3) :- L3 is the result of concatenating L1 and L2
% -------------------

my_append([],L,L).               % appending L to [] gives L
my_append([X|L1],L2,[X|L3]) :-   % [X|L3] is the concatenation of [X|L1] and L2
	my_append(L1,L2,L3).     % if L3 is the concatenation of L1 and L2



% --------------------------
% append3(L1,L2,L3,Full) :- Full is the result of concatenating L2, L2, and L3
% --------------------------
  
  % PROBLEM: e.g. append3(X,[4,3],[4],[2,4,3,4]).

append3(L1,L2,L3,FullList) :-
	my_append(L1,L2,Temp),
	my_append(Temp,L3,FullList).


% ------------------
% insert(E,L,Full) :- Full is the result of an ordered list L where E has been inserted
% ------------------


insert(E, [], [E]).
insert(E,[X|Xs],[X|L]) :-
	E > X,
	insert(E, Xs, L).
insert(E,[X|Xs],[E,X|Xs]) :-
	E < X.


% --------------
% reverse(L, Ul) :- Ul is the reversed list of L
% --------------

/*
 * Variant 1
 */

my_reverse(L, Ul) :-
	my_reverse(L, Ul, []).
my_reverse([], X, X).
my_reverse([L|Ls], Ul, TL) :-
	my_reverse(Ls, Ul, [L|TL]).


/*
 * Variant 2
 */

my_reverse2([],[]).
my_reverse2([X|Xs],Ul) :-
	my_reverse2(Xs, RestReverse),
	my_append(RestReverse, [X], Ul).
	

/*
 * Variant 3
 */

my_reverse_gerard([],[]).
my_reverse_gerard([A],[A]).
my_reverse_gerard([H|T], [H1|T3]) :-
	my_reverse_gerard(T, [H1|T1]),
	my_reverse_gerard(T1, T2),
	my_reverse_gerard([H|T2], T3).


/*
reverse([],Y).
%reverse([],Y) :- reverse([],[]).
reverse([X|Xs],Y) :- reverse(Xs,[X|Y]).
*/

