Skip to content

Instantly share code, notes, and snippets.

@ichistmeinname
Created June 18, 2014 14:23
Show Gist options
  • Save ichistmeinname/4fc56fa9215c028f2b01 to your computer and use it in GitHub Desktop.
Save ichistmeinname/4fc56fa9215c028f2b01 to your computer and use it in GitHub Desktop.
Ninth session
kandidat(maier).
kandidat(mueller).
kandidat(schroeder).
kandidat(schulz).
alleKandidat(vorstand(V,S,K)) :- kandidat(V), kandidat(S), kandidat(K).
einerKandidat(vorstand(V,S,K)) :- kandidat(V); kandidat(S); kandidat(K).
% alternativ:
% einerKandidat(vorstand(V,_,_)) :- kandidat(V).
% einerKandidat(vorstand(_,S,_)) :- kandidat(S).
% einerKandidat(vorstand(_,_,K)) :- kandidat(K).
alleVerschieden(vorstand(V,S,K)) :-
verschieden(V,S), verschieden(S,K), verschieden(V,K).
% Funktion, um einen Vorstand zu bestimmen
loese(V) :- alleKandidat(V),
alleVerschieden(V),
maierOderMueller(V),
muellerWennSchulz(V),
schroederWennMaier(V),
maierNichtWennSchulz(V),
schulzNichtWennSchroeder(V).
% wir haben kein ungleich, daher definieren wir eine Relation `verschieden`
verschieden(maier,mueller).
verschieden(maier,schulz).
verschieden(maier,schroeder).
verschieden(mueller,schulz).
verschieden(mueller,schroeder).
verschieden(mueller,maier).
verschieden(schulz,maier).
verschieden(schulz,mueller).
verschieden(schulz,schroeder).
verschieden(schroeder,maier).
verschieden(schroeder,mueller).
verschieden(schroeder,schulz).
nichtImVorstand(P,vorstand(V,S,K)) :-
(verschieden(P,V), verschieden(P,S), verschieden(P,K)).
imVorstand(P,vorstand(P,_,_)).
imVorstand(P,vorstand(_,P,_)).
imVorstand(P,vorstand(_,_,P)).
% Maier und Mueller wollen nicht gemeinsam in den Vorstand.
maierOderMueller(V) :- nichtImVorstand(maier,V).
maierOderMueller(V) :- nichtImVorstand(mueller,V).
/* Mueller steht nur für den Vorstand zur Verfuegung,
wenn Schulz Vorsitzender wird. */
muellerWennSchulz(vorstand(_,S,K)) :-
imVorstand(mueller,vorstand(schulz,S,K)).
muellerWennSchulz(V) :- nichtImVorstand(mueller,V).
/* Schroeder geht nur dann in den Vorstand,
wenn auch Maier diesem angehoert. */
schroederWennMaier(V) :-
imVorstand(schroeder,V), imVorstand(maier,V).
schroederWennMaier(V) :- nichtImVorstand(schroeder,V).
/* Maier will nicht in den Vorstand,
wenn Schulz der Schriftfuehrer wird.
*/
maierNichtWennSchulz(vorstand(V,S,K)) :-
imVorstand(maier,vorstand(V,S,K)), verschieden(schulz,S).
maierNichtWennSchulz(V) :- nichtImVorstand(maier,V).
/* Schulz tritt dem Vorstand nicht bei,
falls Schroeder Vorsitzender wird. */
schulzNichtWennSchroeder(vorstand(V,S,K)) :-
imVorstand(schulz,vorstand(V,S,K)), verschieden(schroeder,V).
schulzNichtWennSchroeder(V) :- nichtImVorstand(schulz,V).
*/ Haskell-Code fuer `head`
head (x:_) = x
*/
% `head` als Relation
head([X|_],X).
/* Haskell-Code
firstTwo (x:y:_) = [x,y]
*/
% `firstTwo` als Relation
firstTwo([X,Y|_],[X,Y]).
/* Haskell-Code für `take`
take 0 xs = []
take n [] = []
take n (x:xs) = x : ys
where ys = take (n-1) xs
*/
% take als Relation
take(0,_,[]).
take(_,[],[]).
take(N,[X|Xs],[X|Ys]) :- N > 0, M is N-1, take(M,Xs,Ys).
/* Haskell-Code für `append`
append [] ys = ys
append (x:xs) ys = x : zs
where zs = append xs ys
/*
% append als Relation
append2([],Ys,Ys).
append2([X|Xs],Ys,[X|Zs]) :- append2(Xs,Ys,Zs).
/*
Um eine grobe Vorstellung davon zu bekommen,
was da eigentlich passiert. Keine Panik, das wird
alles auch noch ausführlich in der Vorlesung besprochen.
take(1,[1,2],[1,2]).
= take(0,[2],[2])
= <keine Regel passt>
take(1,[1,2],[1])
= take(0,[2],[])
= .
take(1,[1,2],[V|V1]) ~> V = 1
= take(0,[2],V1) ~> V1 = []
= .
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment