Skip to content

Instantly share code, notes, and snippets.

@finia2NA
Last active March 10, 2019 16:14
Show Gist options
  • Save finia2NA/0c24fbc0650a507f4850915681be3be1 to your computer and use it in GitHub Desktop.
Save finia2NA/0c24fbc0650a507f4850915681be3be1 to your computer and use it in GitHub Desktop.
/*
Personen:
Potter, Malfoy, Ron und Hermione
Benötigte Positionen:
- Vorsitzender
- Kassenwart
- Sekretär
Regeln:
- Potter und Malfoy wollen nicht gemeinsam in den Vorstand.
- Malfoy steht nur für den Vorstand zur Verfügung, wenn Granger Vorsitzende wird.
- Weasley geht nur dann in den Vorstand, wenn auch Potter diesem angehört.
- Potter will nicht in den Vorstand, wenn Granger nur Sekretärin wird.
- Granger tritt dem Vorstand nicht bei, falls Weasley Vorsitzender wird.
*/
possible( (P,T,S) ) :- kandidat(P), kandidat(T), kandidat(S),
alldiff(P,T,S),
rule1( [P,T,S] ),
rule2( (P,T,S) ),
rule3( (P,T,S) ),
rule4( (P,T,S) ),
rule5( (P,T,S) ).
kandidat(p).
kandidat(m).
kandidat(w).
kandidat(g).
alldiff(P,T,S) :- diff(P,T), diff(T,S), diff(S,P).
diff(A,B) :- A \= B.
rule1(V) :- notIn(V,m).
rule1(V) :- notIn(V,p).
rule2( (P,T,S) ) :- notIn( [P,T,S] , m).
rule2( (P,T,S) ) :- in( [P,T,S], m), president( (P,T,S), g).
rule3( (P,T,S) ) :- notIn( [P,T,S], w).
rule3( (P,T,S) ) :- in( [P,T,S], w), in( [P,T,S], p).
rule4( (P,T,S) ) :- notSecretary( (P,T,S), g).
rule4( (P,T,S) ) :- notIn( [P,T,S], p).
rule5( (P,T,S) ) :- notPresident((P,T,S), w).
rule5( (P,T,S) ) :- notIn([P,T,S], g).
in([X | _], X).
in([_ | Xs], A) :- in(Xs, A).
notIn([], _).
notIn([X | Xs], A) :- diff(X,A), notIn(Xs, A).
secretary( (_,_,S) , S).
president( (P,_,_) , P).
treasurer( (_,T,_) , T).
notSecretary( (_,_,S) , X) :- S \= X.
notPresident( (P,_,_) , X) :- P \= X.
notTreasurer( (_,T,_) , X) :- T \= X.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment