Declaratieve Talen/oplossingenContradicties

Uit Wina Examenwiki
Versie door Greet (overleg | bijdragen) op 16 jan 2011 om 16:31
Naar navigatie springen Naar zoeken springen
% To Do een predicaat meetegen(P,A) schrijven dat teruggeeft of die
% antwoordletter in contradictie is met een andere antwordleter.
% In een graaf ziet een contradictie eruit indien er een lus is.
% Algemene Strategie : we gaan voor de gegeven antwoordletter het pad
% doorheen de graaf volgen en kijken of we een pad naar onszelf tegen
% komen

%Prolog feiten:
antwoord(jan,c,[a,b,d,e]).
antwoord(jan,i,[f,k,c,b]).
antwoord(jan,j,[i,f,h,e]).
antwoord(jan,k,[j,h,g,d]).

buren(X,Y):-antwoord(_,X,Lijst),
	    member(Y,Lijst).
% buren in de andere richting zou je hier ook makkelijk kunnen
% definieren, maar dit is in ons geval niet nodig.

meetegen(P,A):-antwoord(P,A,_),
	      doorloopGraaf(P,A,A,[A]),!.

doorloopGraaf(P,A,B,Pad):- buren(A,X),
	                   (
			   \+ member(X,Pad)->
			   append(Pad,[X],New),
			   doorloopGraaf(P,X,B,New)
			   ;
			   true
			   ).

%maak een predikaat tegen(P,Tegens)

tegen(P,Tegens):- findall(X,doorloopGraaf(P,X,X,[]),Tegens).

--Greet