? users online
  • Logout
    • Open hangout
    • Open chat for current file
<div class="notebook">

<div class="nb-cell markdown" name="md2">
# Zugproblem erweitert
</div>

<div class="nb-cell program" data-background="true" name="p1">
directTrain(ddorf,bilk).
directTrain(bilk,hamm).
directTrain(hamm,neuss).
directTrain(ddorf,oberbilk).
directTrain(oberbilk,eller).
directTrain(ddorf,flingern).
directTrain(flingern,vohwinkel).
directTrain(vohwinkel,solingen).
directTrain(solingen,leverkusen).
directTrain(benrath,garath).
directTrain(garath,hellerhof).
directTrain(hellerhof,langenfeld).
directTrain(langenfeld,leverkusen).
directTrain(ddorf,solingen).
directTrain(saarbruecken,dudweiler).
directTrain(forbach,saarbruecken).
directTrain(freyming,forbach).
directTrain(stAvold,freyming).
directTrain(fahlquemont,stAvold).
directTrain(metz,fahlquemont).
directTrain(nancy,metz).

barrierefrei(leverkusen).
barrierefrei(solingen).
barrierefrei(ddorf).
barrierefrei(neuss).


laeden(ddorf,tchibo).
laeden(ddorf,mcdonalds).
laeden(neuss,rheinparkcenter).
laeden(neuss,mcdonalds).
laeden(bilk,baecker).
angebot(baecker,brot).
angebot(mcdonalds,burger).
angebot(tchibo,kaffee).


toilette([ddorf,neuss,leverkusen,solingen,vohwinkel]).
</div>

<div class="nb-cell program" data-background="true" name="p2">
% eure Loesungen:
</div>

<div class="nb-cell query" name="q4">

</div>

<div class="nb-cell markdown" name="md1">
Definiere folgende Prädikate:

 1. laedenAnOrt(Ort,LadenListe) true wenn es am Ort Ort alle Laeden aus LadenListe gibt.
 2. produkteAnOrt(Ort,ProduktListe)  true wenn es am Ort Ort alle Produkte aus ProduktListe gibt.
 2. wunschortLaeden(Laden1,Laden2) true wenn es einen Ort gibt, an dem es Laden1 und Laden2 gibt
 2. Wie muss die Anfrage aussehen, mit der man die Liste aller in Düsseldorf vorhandenen Läden erhält?
 2. wunschortProdukte(Produkt1,Produkt2) true wenn es einen Ort gibt, an dem es Produkt1 und Produkt2 gibt
 2. Wie muss die Anfrage aussehen, mit der man die Liste aller in Düsseldorf vorhandenen Produkte erhält?
 2. travelFromToBarrierefrei(Ort1,Ort2) true, wenn man von Ort1 zu Ort2 reisen kann und dabei nur barrierefreie Bahnhöfe passiert.
 2. travelFromToBarrierefrei(Ort1,Ort2,Route) true, wenn man von Ort1 zu Ort2 über die Route Route reisen kann und dabei nur barrierefreie Bahnhöfe passiert.
 2. reiseMitKlopause(Ort1,KlopausenOrt,Ort2) true, wenn man von Ort1 zu Ort2 mit Klopause an Ort Klopause reisen kann
 2. reiseMitKlopause(Ort1,KlopausenOrt,Ort2,Route) true, wenn man von Ort1 zu Ort2 mit Klopause an Ort Klopause über Route Route reisen kann
 2. barrierefreiList(List) true, wenn alle Orte in List barrierefrei sind
 2. Wie muss die Anfrage aussehen, mit der man die Liste aller barrierefreien Orte erhält?
 2. barrierefreiMitKlo(Ort) true wenn Ort barrierefrei ist und eine Toilette hat.
 2. barrierefreiMitKloList(OrtListe) true wenn alle Orte in OrtListe barrierefrei sind und eine Toilette haben.
 2. inOneStepToToilet(Ort) true, wenn man von Ort in einem Schritt zu einem Ort mit Toilette kommt.
</div>

<div class="nb-cell program" data-background="true" name="p3">
% eventuell nuetzliche Praedikate:
% travelFromTo/2
travelFromTo(A,B):-
    directTrain(A,B).

travelFromTo(A,C):-
    directTrain(A,B),
    travelFromTo(B,C).


% travelRoute/3
travelRoute(A,B,[A,B]):-
    directTrain(A,B).

travelRoute(A,B,[A|Route]):-
    directTrain(A,C),
    travelRoute(C,B,Route).
    

% travelRouteNoLoop/3 (checkt, dass man nicht zu einem Ort fährt, an dem man bereits war.

travelRouteNoLoop(A,B,Route):-
    travelRoute(A,B,[A],Route).

travelRoute(A,B,Acc,Route):-
    directTrain(A,B),
    reverse([B|Acc],Route).


travelRoute(A,B,Acc,Route):-
    directTrain(A,C),
    \+ member(C,Acc),
    travelRoute(C,B,[C|Acc],Route).
</div>

<div class="nb-cell markdown" name="md3">
# Restaurantproblem
</div>

<div class="nb-cell program" data-background="true" data-below="true" name="p6">
% angebot(Restaurant, Essen)

angebot(waldschaenke, fleisch).
angebot(mittelmeer, fisch).
angebot(mittelmeer, vegetarisch).
angebot(kichererbse, vegan).
angebot(kichererbse, vegetarisch).
angebot(waldschaenke, vegan).


% isst(Person, Essen).
isst(mia, fisch).
isst(ayla, vegan).
isst(jo, vegan).
isst(nur, fleisch).
isst(mike, fisch).
isst(wanda, vegetarisch).

% preis(Essen, Preis)
preis(fisch, 11).
preis(fleisch, 10).
preis(vegan, 9).
preis(vegetarisch, 7).

% denke dir Prädikate auf und implementiere sie. 
% Beispiele: wo können zwei Menschen gemeinsam essen gehen? Wo kann eine Gruppe von Menschen essen gehen?
% Was kostet das Essen einer Gruppe von Menschen? ...
</div>

<div class="nb-cell query" name="q3">

</div>

<div class="nb-cell markdown" name="md5">
### Lösungen aus der Sitzung
</div>

<div class="nb-cell program" data-background="true" data-below="true" name="p4">
% wo kann eine Person essen gehen? restaurant_allein(Person, Restaurant)
restaurant_allein(Person, Restaurant):-
     isst(Person, Essen),
     angebot(Restaurant, Essen).

% was kostet es, wenn eine Person essen geht? kosten_allein(Person,Preis).
kosten_allein(Person,Preis):-
     isst(Person, Essen),
     preis(Essen,Preis).

% was kostet das teuerste Gericht in einem Restautrant (Zusatz)?
% findall( X, angebot(waldschaenke,X), L)
teuerste(Restaurant, MaxPreis):-
     findall(Essen, angebot(Restaurant,Essen)  , Essenliste),
     essen2preis(Essenliste, Preisliste),
     mymax(Preisliste, MaxPreis).

essen2preis([],[]).
essen2preis([E|EL],[P|PL]):-
     preis(E,P),
     essen2preis(EL,PL).

mymax([H|T], Max):-
     mymaxAcc(T, H, Max).


mymaxAcc([H|T], CurrentMax, Max):-
     H &gt; CurrentMax,
     mymaxAcc(T, H, Max).
     
mymaxAcc([H|T], CurrentMax, Max):-
     not(H &gt; CurrentMax),
     mymaxAcc(T, CurrentMax, Max).
     
mymaxAcc([],Max, Max).

% maximalpreis zu einer Essensliste
maxEssen([E|EL], Max):-
     preis(E,CurrentMax),
     maxEssenAcc(EL, CurrentMax, Max).


maxEssenAcc([E|EL], CurrentMax, Max):-
     preis(E,P),
     P &gt; CurrentMax,
     maxEssenAcc(EL, P , Max).

maxEssenAcc([E|EL], CurrentMax, Max):-
     preis(E,P),
     not(P &gt; CurrentMax),
     maxEssenAcc(EL, CurrentMax, Max).

maxEssenAcc([],Max, Max).


% lokal42/ lokal42(Person1, Person2, Restaurant)

lokal42(Person1, Person2, Restaurant):-
      isst(Person1,Essen1),
      isst(Person2,Essen2),
      angebot(Restaurant, Essen1),
      angebot(Restaurant, Essen2).
      
      
lokal42Alternativ(Person1, Person2, Restaurant):-
      restaurant_allein(Person1, Restaurant),
      restaurant_allein(Person2, Restaurant).
      
      
rendezvous(Person1, Person2):-
      restaurant_allein(Person1, Restaurant),
      restaurant_allein(Person2, Restaurant).

% was kostet es, wenn eine Personenliste essen geht?
gesamtkosten(Personenliste, Kosten):-
      gesamtkosten(Personenliste, 0 , Kosten).

gesamtkosten([P|PL], Acc, Kosten):-
      isst(P,E),
      preis(E,K),
      NewAcc is Acc + K,
      gesamtkosten(PL   , NewAcc, Kosten).
      
gesamtkosten([], Kosten, Kosten).
</div>

<div class="nb-cell query" name="q1">

</div>

<div class="nb-cell markdown" name="md4">
# Weitere Listenprädikate zum Üben
</div>

<div class="nb-cell program" name="p5">
% nur_a/2 (die zweite Liste besteht genau aus allen a's der ersten Liste)
% nur_a([a,b,c,a,d,e,a],[a,a,a]).


% ohne_a/2 (die zweite Liste entsteht aus der ersten, indem man alle a's löscht)
% ohne_a([a,b,c,a,d,e,a],[b,c,d,e]).


% nur/3 (nur die Elemente an der ersten Argumentposition werden aus der Liste an der zweiten Argumentposition in die Liste an der dritten Argumentposition übernommen)
% nur(a,[a,b,c,a,d,e,a],[a,a,a]).
% nur(b,[a,b,c,a,d,e,a],[b]).


% doppel/2 (die zweite Liste entsteht aus der ersten, indem man jedes Element verdoppelt)
% doppel([a,b,c],[a,a,b,b,c,c]).



% check_doppel/1 (prüft ob in der Liste das 1. und 2. und das 3. und 4. und das 5. und 6. ... Element gleich ist)
% check_doppel([a,a,b,b,c,c]).


% tripel/2 (die zweite Liste entsteht aus der ersten, indem man jedes Element verdreifacht)
% tripel([a,b,c],[a,a,a,b,b,b,c,c,c]).


% remove_even/2 (entfernt jedes zweites Element der ersten Liste. Es werden die Elemente an gerader Position entfernt)
% remove_even([a,b,c,a,d,e,a],[a,c,d,a]).



% same_length/2 (prüft ob zwei Listen gleich lang sind)
% same_length([a,b,c],[b,b,c]).


% aliste_1kuerzer/2 (zwei a-Listen, die zweite genau ein a kürzer als die erste)
% aliste_1kuerzer([a,a,a,a],[a,a,a]).


% longer/2 (prüft ob die erste Liste länger ist als die zweite)
% longer([a,b,c,d],[t,s]).


% shorter/2 (prüft ob die erste Liste kürzer ist als die zweite)
% shorter([u,v],[a,b,c,d]).



% mind2a/1
% mind2a([a,b,c,a,d,e,a]).


% verschachtelt/1: prüft, ob die Liste verschachtelt ist. [Zusatzaufgabe]
% verschachtelt([a,b,c,[d,e],f]).
</div>

<div class="nb-cell query" name="q2">

</div>

</div>