% Henrik Johansson, DS80
% Andreas Harrison, M96_har

union([], B, B).
union([Ahuvud|Asvans], B, [Ahuvud|Csvans]) :-
  \+ medlem(Ahuvud, B), 
  !,
  union(Asvans, B, Csvans).
union([_|Asvans], B, C) :-
  union(Asvans, B, C).

snitt([], _, []).
snitt([Ahuvud|Asvans], B, [Ahuvud|Csvans]) :-
  medlem(Ahuvud, B),
  !,
  snitt(Asvans, B, Csvans).
snitt([_|Asvans], B, C) :-
  snitt(Asvans, B, C).

differens([], _, []).
differens([Ahuvud|Asvans], B, [Ahuvud|Csvans]) :-
  \+ medlem(Ahuvud, B),
  !,
  differens(Asvans, B, Csvans).
differens([_|Asvans], B, C) :-
  differens(Asvans, B, C).

delmängd([], _).
delmängd([Ahuvud|Asvans], B) :-
  medlem(Ahuvud, B),
  delmängd(Asvans, B).

lika(A, B) :-
  antal_medlemmar(A, I),
  antal_medlemmar(B, I),
  delmängd(A, B).

cartesisk_produkt([], _, _).
cartesisk_produkt([Ahuvud|Asvans], B, C) :-
  cartesisk_produkt(Asvans, B, D),
  bilda_par(Ahuvud, B, E),
  union(D, E, C),!.


% X bildar par med alla medlemmar i listan L
bilda_par(_, [], []).
bilda_par(X, [Lhuvud|Lsvans], [(X,Lhuvud)|Ysvans]) :-
  bilda_par(X, Lsvans, Ysvans).

% Kontrollerar om X är en medlem i listan L
medlem(X, [X|_]).
medlem(X, [_|L]) :-
  medlem(X, L).

% Räknar antalet element i listan
antal_medlemmar([], 0).
antal_medlemmar([_|Lsvans], I) :-
  antal_medlemmar(Lsvans, J),
  I is J + 1.