:-use_module(library(clpfd)).
:-use_module(library(lists)).

% 1. feladat
% telek(-Telek)
% Telek egy 10 hosszú lista, mely hosszúkás telkünkön levõ 10 szabad
% helynek felel meg.
% Rendelkezésünkre áll: 10 fa, 10 kõ, 10 tégla
% Épületek költségei és értéke:
% út(2,1,0)-1,
% ház(1,1,3)-3,
% raktár(2,2,2)-4,
% mozi(2,4,4)-5
% Elváratik továbbá, hogy
% 1. több ut kell legyen mint ház
% 2. házbol legalabb kétszer annyi legyen, mint raktárból
% 3. mozibol legfeljebb 1 lehet
% 4. raktár és ház nem lehet szomszédos
% 5. út oldalán csak épület lehet (azaz ures telek es ut nem)
% Az eljárás egyetlen, maximális értéket képviselõ megoldást ad
% vissza, melyet eroforrasainkból meg tudunk építeni.
% Telek i.dik mezõje jelezze, hogy mit építünk oda:
% 1-ut, 2-haz, 3-raktar, 4-mozi, 0-semmi
telek(Telek):-
	length(Telek,10),
	domain(Telek,0,4),
	szomszed_korlatok(Telek),
	global_cardinality(Telek,[1-U,2-H,3-R,4-M,0-_]),
	scalar_product([2,1,2,2],[U,H,R,M], #=<, 10),
	scalar_product([1,1,2,4],[U,H,R,M], #=<, 10),
	scalar_product([0,3,2,4],[U,H,R,M], #=<, 10),
	U #>= H,
	H #>= R,
	M #=< 1,
	scalar_product([1,3,4,5],[U,H,R,M],#=,Value),
	labeling([maximize(Value)],Telek).

szomszed_korlatok([A,B|Ls]):- !,
	A #= 2 #=> B #\= 3,
	A #= 3 #=> B #\= 2,
	B #= 2 #=> A #\= 3,
	B #= 3 #=> A #\= 2,

	A #= 1 #=> B in 2..4,
	B #= 1 #=> A in 2..4,

	szomszed_korlatok([B|Ls]).
szomszed_korlatok(_).
	

% 2. feladat
% hullamzo_permutacio(+N,?L):-
% L egy N hosszú számlista, mely az 1..N számok egy permutációjának
% felel meg. A permutációban nincsenek 1 hosszú ciklusok, valamint
% teljesül az, hogy a permutáció minden ciklusa "hullamzik", azaz ha
% például az A,B,C elemek egymás után állnak egy ciklusban, akkor
% vagy A < B és C < B
% vagy A > B és C > B
% Példa jó ciklusra: (3, 5, 2, 4)
% Példa rossz ciklusra: (3, 5, 4, 2)
hullamzo_permutacio(N,L):-
	length(L,N),
        assignment(L,_),
	hullamzik(L,1,L),
	labeling([],L).

hullamzik([],_,_).
hullamzik([A|As],I,L):-
	A #\= I,
	element(A,L,B),
	I #< A #<=> B #< A,
	I2 is I + 1,
	hullamzik(As,I2,L).























% 3. feladat
% kapcsolatok(-Parok):-
% Tombol a szerelem a 6.c osztályban. Szerencsére a vonzalmak
% kölcsönösek. Tudjuk, hogy
% Anna szereti Gyurit és Hugót
% Bori szereti Ferit és Gyurit
% Cecil szereti Imrét
% Dóri szereti Ferit, Gyurit és Imrét
% Eszter szereti Hugót és Jakabot
% Keressünk 4 szerelmes párt!
% Parok egy 4 hosszú lanynev-fiunev alakú párokból álló lista, mely egy
% mindenki számára örvendetes párosítást ad.
kapcsolatok(Parok):-
	Rel = [1-{2,3},2-{1,2},3-4,4-{1,2,4},5-{3,5}],
	X1 = [A1,B1,C1,D1],
	X2 = [A2,B2,C2,D2],
	all_distinct(X1),
	all_distinct(X2),
	relation(A1,Rel,A2),
	relation(B1,Rel,B2),
	relation(C1,Rel,C2),
	relation(D1,Rel,D2),
	Lanyok = [anna,bori,cecil,dori,eszter],
	Fiuk = [feri,gyuri,hugo,imre,jakab],
	sorting(X1,[1,2,3,4],X1),
	append(X1,X2,X),	
	labeling([],X),
	parok(X1,X2,Lanyok,Fiuk,Parok).	

parok([],[],_,_,[]).
parok([A|As],[B|Bs],Lanyok,Fiuk,[X1-X2|Ps]):-
	nth1(A,Lanyok,X1),
	nth1(B,Fiuk,X2),
	parok(As,Bs,Lanyok,Fiuk,Ps).

% 4. feladat
% erdekes_permutacio(+N,L):-
% L egy N hosszu egesz lista, mely egy "erdekes" permutacioja az 1..N szamoknak
% egy permutacio erdekes, ha minimum N-1 parcserevel megkaphato belole az
% identitas permutacio

% megoldás: egy megoldás pontosan akkor érdekes, ha ciklikus
erdekes_permutacio(N,L):-
        length(L,N),
	circuit(L),
        labeling([],L).