Gruppen 5 und 7
Samuel Teuber
propa@teuber.dev
https://teuber.dev/propa
Tutorien in der Weihnachtszeit
Geht hin wo ihr wollt...
Was kommt bei dieser Formel raus?
(10 * 10 + 15 - 8 / 2)
((10 * 10) + 15 - (8 / 2)) = 111
=> Implizite Klammerung!
f1 a b c = --something
f1 1 f1 2
f1 1 (f1 2)
a) $$ \omega' = (\lambda x.\ x\ x) (\lambda y.\ m\ (y\ y)\ n) $$
b) $$ (\lambda x.\ x\ x) (\lambda y.\lambda n.\ isZero\ n\ c_1\ ((y\ y)\ (sub\ n\ c_1)))\ c_2 $$ Terminiert, wenn wir die richtigen Ausdrücke auswerten!
Haskell nach Lambda
Fragen?
Mit Instanziierungen $$ \forall\alpha.\forall\beta.\alpha\rightarrow\beta\rightarrow\alpha \succeq \text{int}\rightarrow\text{bool}\rightarrow\text{int}\\ \forall\alpha.\forall\beta.\alpha\rightarrow\beta\rightarrow\alpha \succeq \text{bool}\rightarrow\text{char}\rightarrow\text{bool}\\ $$
Fragen?
Logische Programmierung
fritz
1,2,3,4.2
X, _X
mensch(fritz)
, alter(fritz, 17)
Flashback GBI: Aussagenlogik
Disjunktionen mit höchstens einem positiven Literal $$ \neg x_1 \lor \neg x_2 \lor \neg x_3 \lor \neg x_4 \lor y $$
Kann man dann auch schreiben als: $$ x_1 \land x_2 \land x_3 \land x_4 \implies y $$
Horn-Klauseln können in Polynomialzeit auf erfüllbarkeit getestet werden!
Typen von Horn-Klauseln:
mensch(sokrates).
nichtChuckNorris(sokrates).
sterblich(X) :- mensch(X), nichtChuckNorris(X).
?- mensch(sokrates), sterblich(sokrates).
liebt(fritz,fische). %Atome: fritz und fische, Funktor/Prädikat: liebt
liebt(hans,inge).
liebt(inge,fritz).
liebt(julia,fritz).
liebt(anna,X) :- liebt(julia,X). % liebt(anna,X) wahr, wenn liebt(julia,X) wahr
QUERYSTART
liebt(Y,fritz)
QUERYEND
Regeln werden wie bei Haskell List-Comprehensions reerfüllt: Jede mögliche Kombination wird durchgespielt
Prolog mit swipl
father(peter,nick).
father(john,peter).
grandfather(X,Y) :- father(X,Z),father(Z,Y).
QUERYSTART
grandfather(G,nick)
QUERYEND
Mit swipl
formula(A,B,C,R) :- R is A+(A*B)-C-(C/A).
QUERYSTART
formula(1,2,3,R)
QUERYEND
Zusätzlich: <,<=,>=,>,=:=,=\=
fib(0,0).
fib(1,1).
fib(N,R) :- N>1,
C is N-1,
D is N-2,
fib(C,A),
fib(D,B),
R is A+B.
QUERYSTART
fib(8,R)
QUERYEND
[|]
als Cons-Operatormember(X,[X|R]).
member(X,[Y|R]) :- member(X,R).
append([],L,L).
append([X|R],L,[X|T]) :- append(R,L,T).
rev([],[]).
rev([X|R],Y) :- rev(R,Y1),append(Y1,[X],Y).
startsWith1([X|_]) :- X is 1.
QUERYSTART
startsWith1([Z,2,3])
QUERYEND
not(X)
: Negation von X
: Wie? -> Nächste Woche!atom(X)
: Ist X
mit Atom instanziiert?integer(X)
: Ist X
mit Ganzzahl instanziiert?float(X)
: Ist X
mit Gleitkommazahl instanziiert?atomic(X)
: Ist X
mit Atom oder Zahl instanziiert?father(samuel, john).
father(john,peter).
mother(laura, peter).
father(peter, nick).
father(luke, ann).
mother(sara,ann).
mother(ann, nick).
father(john, guy).
mother(laura, guy).
ancestor(X,X).
ancestor(X,Y) :- father(X,Z), ancestor(Z,Y).
ancestor(X,Y) :- mother(X,Z), ancestor(Z,Y).
containsAncestors(X,[Y|Z]):-ancestor(X,Y).
containsAncestors(X,[Y|Z]):-containsAncestors(X,Z).
sibling(X,Y): mother(Z,X), mother(Z,Y).
auntOrUncle(X,Y): mother(Z,Y), sibling(Z,X).
auntOrUncle(X,Y): father(Z,Y), sibling(Z,X).
QUERYSTART
ancestor(X, nick)
QUERYEND