Declaratieve Talen/oplossingenMijnen

Uit Wina Examenwiki
Versie door Greet (overleg | bijdragen) op 17 jan 2011 om 07:07 (Nieuwe pagina aangemaakt met '<pre> 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,…')
(wijz) ← Oudere versie | Huidige versie (wijz) | Nieuwere versie → (wijz)
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