Gruppen 2 und 4
Samuel Teuber
propa@teuber.dev
https://teuber.dev/propa
Tutorien in der Weihnachtszeit
Tutorien am 22. und 23. Dezember finden statt
fib :: Integer -> Integer
fib 0 = 1
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
Ohne Pattern Matching:
fib n = if n == 0 || n == 1 then 1 else fib (n-1) + fib (n-2)
-- Funktional:
F f n = if n == 0 || n == 1 then 1 else f (n-1) + f (n-2)
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}\\ $$
a) $$ \omega' = (\lambda x.\ x\ x) (\lambda y.\ m\ (y\ y)\ n) $$
mit $\Theta = (\lambda y.\ m\ (y\ y)\ n) (\lambda y.\ m\ (y\ y)\ n)$
b) $$ (\lambda x.\ x\ x) (\lambda y.\lambda n.\ \text{isZero}\ n\ c_1\ ((y\ y)\ (\text{sub}\ n\ c_1)))\ c_2 $$ Terminiert, wenn wir die richtigen Ausdrücke auswerten!
c) $$ \omega' = (\lambda x.\ x\ x) (\lambda y.\ m\ (y\ y)\ n) $$ Wie viele Reduktionsschritte kann man auf $\omega'$ anwenden?
a) Geben Sie einen Term W an, welcher unter $\beta$-Reduktion nach und nach die Form $f (f (f (f (f (f (\dots))))))$ annimmt
b) Beschreiben Sie, welche Form der Term $X=\lambda f. (\lambda x.x\ x)(\lambda y. f\ (y\ y))$ nach und nach annimmt
c) Führen Sie einen $\beta$-Reduktionsschritt von $X=\lambda f. (\lambda x.x\ x)(\lambda y. f\ (y\ y))$ aus. Welcher Term entsteht?
Geben Sie unter Benutzung von $X$ einen Term an, welcher zu $\omega$ reduziert
$X=\lambda f. (\lambda x.x\ x)(\lambda y. f\ (y\ y))$
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 SWI Prolog online
SWISH
swish.swi-prolog.org
% ???
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).
%???
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).
father(peter, nick).
father(luke, ann).
father(john, guy).
mother(laura, peter).
mother(sara,ann).
mother(ann, nick).
mother(laura, guy).
ancestor(X,X).
ancestor(X,Y) :- father(X,Z), ancestor(Z,Y).
ancestor(X,Y) :- mother(X,Z), ancestor(Z,Y).
%Does list L contain ancestors?
%containsAncestors(...,...):-...
%...
% Further predicates
parent(X,Y):- %...
sibling(X,Y):- %....
auntOrUncle(X,Y):- %...
%???
QUERYSTART
splits([1,2,3,4,5],R)
QUERYEND