% Wissensbasis und Fragen für das UI ordnung(chelonia) :- hat(ruecken_und_brustschild_panzer, 'Hat das Tier einen Ruecken- und Brustschildpanzer?'). ordnung(crocodilien) :- \+ ordnung(chelonia), hat(im_am_wasser_gelebt, 'Lebt das Tier am oder im Wasser?'), schwanz(zusammengedrueckt, 'Ist der Schwanz zusammengedrueckt oder zylindrisch?'). ordnung(crocodilien) :- \+ ordnung(chelonia), \+ schwanz(zylindrisch, 'Ist der Schwanz zusammengedrueckt oder zylindrisch?'), hat(schuppen, 'Hat das Tier mit knoechernen Hautschilden gestaerkte Schuppen?'). ordnung(squamanta) :- \+ ordnung(chelonia), \+ ordnung(crocodilien), \+ glieder(erkennbar, 'Sind Glieder erkennbar?'). ordnung(squamanta) :- \+ ordnung(chelonia), \+ ordnung(crocodilien), schwanz(zylindrisch, 'Ist der Schwanz zusammengedrueckt oder zylindrisch?'). unterordnung(saurier) :- ordnung(squamanta), glieder(erkennbar, 'Sind Glieder erkennbar?'). unterordnung(saurier) :- ordnung(squamanta), augenlider(sichtbar, 'Hat das Tier sichtbare Augenlider?'). unterordnung(schlangen) :- ordnung(squamanta), \+ glieder(erkennbar, 'Sind Glieder erkennbar?'), \+ augenlider(sichtbar, 'Hat das Tier sichtbare Augenlider?'). reptil(karettschildkroete) :- ordnung(chelonia), kann(sich_im_wasser_aufhalten, 'War das Tier im Wasser?'), glieder(flossenaehnlich, 'Hat das Tier flossenaehnliche Glieder?'). reptil(riesenschildkroete) :- ordnung(chelonia), \+ glieder(flossenaehnlich, 'Hat das Tier flossenaehnliche Glieder?'), \+ bekannt(unbekannt, glieder, flossenaehnlich). reptil(gavial) :- ordnung(crocodilien), schnauze(sehr_schmal, 'Hat das Tier eine lange schmale Schnauze?'). reptil(krokodil) :- ordnung(crocodilien), vierter_unterkieferzahn(sichtbar, 'Ist der vierte Unterkieferzahn sichtbar?'). reptil(alligator) :- ordnung(crocodilien), \+ vierter_unterkieferzahn(sichtbar, 'Ist der vierte Unterkieferzahn sichtbar?'), \+ bekannt(unbekannt, vierter_unterkieferzahn, sichtbar). reptil(blindschleiche) :- unterordnung(saurier), \+ glieder(erkennbar, 'Sind Glieder erkennbar?'), \+ bekannt(unbekannt, glieder, erkennbar). reptil(gecko) :- unterordnung(saurier), fuesse(haftpolster, 'Was hat das Tier an den Füssen?'). reptil(chamaeleon) :- unterordnung(saurier), fuesse(greifzangen, 'Was hat das Tier an den Füssen?'). reptil(eidechse) :- unterordnung(saurier), fuesse(krallen, 'Was hat das Tier an den Füssen?'). reptil(ringelnatter) :- unterordnung(schlangen), kann(schwimmen, 'Kann das Tier schwimmen?'), pupille(rund, 'Welche Form haben die Pupillen?'). reptil(aspisviper) :- unterordnung(schlangen), \+ pupille(rund, 'Welche Form haben die Pupillen?'), kopfform(dreieckig, 'Hat das Tier eine dreieckige Kopfform?'). % Unterscheidung ja/nein-Frage oder Frage mit Optionen hat(X, Fragetext) :- frage(hat, X, Fragetext). kann(X, Fragetext) :- frage(kann, X, Fragetext). glieder(X, Fragetext) :- frage(glieder, X, Fragetext). schnauze(X, Fragetext) :- frage(schnauze, X, Fragetext). vierter_unterkieferzahn(X, Fragetext) :- frage(vierter_unterkieferzahn, X, Fragetext). augenlider(X, Fragetext) :- frage(augenlider, X, Fragetext). kopfform(X, Fragetext) :- frage(kopfform, X, Fragetext). schwanz(X, Fragetext) :- frageopt(schwanz, X, Fragetext, [zusammengedrueckt, zylindrisch]). pupille(X, Fragetext) :- frageopt(pupille, X, Fragetext, [rund, gedehnt]). fuesse(X, Fragetext) :- frageopt(fuesse, X, Fragetext, [haftpolster, greifzangen, krallen]). % Ja/nein-Fragen an den Benutzer frage(Attribut, Wert, _) :- bekannt(ja, Attribut, Wert), !. frage(Attribut, Wert, _) :- bekannt(_, Attribut, Wert), !, fail. frage(Attribut, Wert, Fragetext) :- write(Fragetext),write(' [ja, nein] '), read(Y), asserta(bekannt(Y, Attribut, Wert)), Y == ja. % Fragen mit Optionen (inkl. Eingabeüberprüfung) frageopt(Attribut, Wert, _, _) :- bekannt(ja, Attribut, Wert), !. frageopt(Attribut, Wert, _, _) :- bekannt(_, Attribut, Wert), !, fail. frageopt(Attribut, Wert, _, _) :- bekannt(ja, Attribut, AndererWert), Wert \= AndererWert, !, fail. frageopt(Attribut, Wert, Fragetext, Optionen) :- write(Fragetext), nl, write(Optionen),write(' '), read(Y), check(Y, Attribut, Wert, Fragetext, Optionen), asserta(bekannt(ja, Attribut, Y)), Y == Wert. check(X, _, _, _, Optionen) :- append([unbekannt], Optionen, OptionenPlus), member(X, OptionenPlus), !. check(_, Attribut, Wert, Fragetext, Optionen) :- write('Ungueltige Eingabe'),nl, frageopt(Attribut, Wert, Fragetext, Optionen). % Ausgangspunkt bestimme :- abolish(bekannt, 3), dynamic(bekannt/3), reptil(X), nl, write('Gattungsname des Tieres: '), write(X), nl, nl. bestimme :- nl, write('Das Tier konnte nicht bestimmt werden.'), nl, nl.