% 1. kartSoucin(+A,+B,-C) 
% ?-kartSoucin([a,b],[1,2,3],C).		
%	C=[[a,1],[a,2],[a,3],[b,1],[b,2],[b,3]]

% reseni pomoci findall
kartSoucin(A,B,C):-findall([X,Y],(member(X,A),member(Y,B)),C).

% 2. spirala(+M,-S)
% ?- spirala([[1,2,3,4],[5,6,7,8],[9,10,11,12]],S).
%	S=[1,2,3,4,8,12,11,10,9,5,6,7].

spirala([],[]).
spirala([R|M],S1):-otoc(M,M1),spirala(M1,S),append(R,S,S1).

% otoc(M,Mr) - Mr je matice M otocena o 90 stupnu
otoc([],[]).
otoc([[]|_],[]).
otoc([R|M],M1) :- reverse(R,Rr),otoc(M,T),sloupec1(M1,Rr,T).

% sloupec1(+M,-S1,M1) - z matice M rozdelim na 1. sloupec S1 a zbytek M1
sloupec1(M1,R1,[]):-findall([A],member(A,R1),M1).
sloupec1([],[],[]).
sloupec1([[H|T]|TM],[H|T1],[T|T2]) :- sloupec1(TM,T1,T2).

% 3. kombinace(+N,+L,-C)
% ?-kombinace(2,[1,2,3],C).
%	C=[1,2] ;
%	C=[1,3] ;
%	C=[2,3] ;
%	false.

kombinace(N,L,C):-length(C,N),komb(C,L).

komb([],_).
komb([X|C],L):-member(X,L),odeber(X,L,L1),komb(C,L1).

odeber(_,[],[]).
odeber(X,[X|T],T).
odeber(X,[Y|T],R):-X\=Y,odeber(X,T,R).

% 4.symetricky(+T1,+T2)
% ?-symetricky(t(nil,a,t(nil,b,nil)),t(t(nil,1,nil),2,nil)).
%	Yes.
symetricky(nil,nil).
symetricky(t(L1,_,R1),t(L2,_,R2)):-symetricky(L1,R2),symetricky(L2,R1).

% 5.model(+F,+V,-B)
% ?- model(p=>q,[p/0,q/1],B).
%    B=0
model(V,F,B):-variable(F),(member(F/B,V);B=0).
model(V,F,B):-F=..[Sym|SubForm],modellist(V,SubForm,Bs),F2=..[tt,Sym,B|Bs],call(F2),!.

modellist(_,[],[]).
modellist(V,[F|SubForm],[B|Bs]):-model(V,F,B),modellist(V,SubForm,Bs).

variable(A):-var(A);atom(A).

% logicke spojky
:- op(300,fx,~).
:- op(400,xfy,/\).
:- op(350,xfy,\/).
:- op(600,xfx,=>).
:- op(650,xfx,<=>).

% operator valuace
:- op(500,xfx,/).

% not
tt(~,0,1).
tt(~,1,0).
% or
tt(\/,0,0,0).
tt(\/,1,0,1).
tt(\/,1,1,0).
tt(\/,1,1,1).
% and
tt(/\,1,1,1).
tt(/\,0,0,1).
tt(/\,0,1,0).
tt(/\,0,0,0).
% eq
tt(<=>,1,0,0).
tt(<=>,0,0,1).
tt(<=>,0,1,0).
tt(<=>,1,1,1).
% impl
tt(=>,1,0,0).
tt(=>,1,0,1).
tt(=>,0,1,0).
tt(=>,1,1,1).

% 6. rozhazej(+P,-H).
% p1, p3, p5, p7, p9 jsou modré, p2,p4,p6,p8,p10 jsou èervené
% ?-rozhazej([p1,p2,p3,p4,p5,p6,p7,p8,p9,p10],H).
%	H=[[p1,p2,p4],[p3,p6],[p5],[p7,p8],[p9,p10]

modry(p1). modry(p3). modry(p5). modry(p7). modry(p9).
cerveny(p2). cerveny(p4). cerveny(p6). cerveny(p8). cerveny(p10).

rozhazej(P,H):-rozhazej2(P,[[],[],[],[],[]],H).
rozhazej2([],H,H).
rozhazej2([Pi|P],[H|Hs],Hout):-modry(Pi),append(Hs,[[Pi|H]],Hs1),rozhazej2(P,Hs1,Hout).
rozhazej2([Pi|P],[H|Hs],Hout):-cerveny(Pi),rozhazej2(P,[[Pi|H]|Hs],Hout).
