Declaratieve Talen/oplossingenMijnen

Uit Wina Examenwiki
Naar navigatie springen Naar zoeken springen

maxproductie(Leveringen,(G,A,B)):-
      findall((C,D),(leverAanMijnen(Leveringen,[],[],C,D)),List),
      findall((C,D,Max),(member((C,D),List),max(C,X),max(D,Y),Max is X+Y),List2),
      maxList(List2,(A,B,G),G),!.

leverAanMijnen([],A,B,A,B).
leverAanMijnen([X|Xs],HmijnA,HmijnB,A,B):-   length(HmijnA,C),
					     length(HmijnB,D),
					     (
					     C<(D/2)->
					     leverAanMijnen(Xs,[X|HmijnA],HmijnB,A,B)
					     ;
					     leverAanMijnen(Xs,HmijnA,[X|HmijnB],A,B)

			                      ).

%basisgeval voor lijst met 3 of meer elementen, je moet hier ook in rekening brengen dat B en D ook ton opleveren.
max([_-B,_-D,_-F],G):- (
		       \+B==D->
		        X = 3,
		            (
	                     \+D==F->
			      Y = 3
		              ;
			      Y = 1
			     )
			;
			X = 2,
		            (
		             \+ D==F->
				Y = 2
			    ;
			     Y = 1
			)),
		       G is (X+Y).

%In het algemene geval moet je alleen testen op of de laatste in de rij (F) verschilt van zijn 2 vorige of alleen de vorige.
max([_-B,C-D,E-F|Xs],G):- max([C-D,E-F|Xs],T),
			  (
			      \+B==D->
			       (
	                       \+D==F->
				    Y = 3
				    ;
				    Y = 1
				)
			       ;
			       (
				\+ D==F->
				   Y = 2
				  ;
				  Y = 1
			       )),
			       G is (T+(Y)),!.
%Geval er zit maar 1 element in de lijst
max([_X],1).

%Geval er ziten maar 2 elemeent in de lijst
max([_-B,_-D],G):-(
		  \+ B==D->
		  G is 3
		  ;
		  G is 2
		  ).


%haal de maximumproductie uit de lijst
maxList([(A,B,X)],(A,B,X),X).
maxList([(_,_,X)|List],Mine,Max):-
 maxList(List,Mine1,Max1),
 (
 X > Max1->
 Max=X
 ;
 Max=Max1,
 Mine=Mine1
 ).




--Greet


Andere mogelijkheid:


maxproductie(Leveringen,toestand(Pmax,mine(LevM1max),mine(LevM2max))) :-
	findall(toestand(P,mine(LevM1),mine(LevM2)),
		(verdeelOverMijnen(Leveringen,[],LevM1,[],LevM2),
		productie(LevM1,P1),
		productie(LevM2,P2),
		P is P1+P2),
		ScenLijst),
	sort(ScenLijst,SortedLijst),
	reverse(SortedLijst,NLijst),
	NLijst = [toestand(Pmax,mine(LevM1max),mine(LevM2max))|_],
	member(toestand(Pmax,mine(LevM1max),mine(LevM2max)),ScenLijst).

% werk met accumulators..
verdeelOverMijnen([],L1,L1,L2,L2).
verdeelOverMijnen([H|T],Acc1,Lev1,Acc2,Lev2):-
	length(Acc1,L1),
	length(Acc2,L2),
	(L2 < L1/2 ->
		verdeelOverMijnen(T,Acc1,Lev1,[H|Acc2],Lev2)
	;
		verdeelOverMijnen(T,[H|Acc1],Lev1,Acc2,Lev2)
	).


% bereken de productie van de gegeven levering.
productie([_],1):-!.
productie([_-L1,_-L2],P):-
	list_to_set([L1,L2],Set),
	length(Set,Nb),
	P is 1 + Nb,
	!.

productie([_-L1,_-L2,_-L3|Rest],P):-
	list_to_set([L1,L2,L3],Set),
	length(Set,Nb),
	productie([_-L2,_-L3|Rest],Poud),
	P is Poud + Nb,
	!.

--Andries