LbP Einführungsbeispiele
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>Prolog</language>
===Kommentierte Einführungsbeispiele===
...
===Übungsaufgaben===
# Erproben Sie das Nachfolger-Prädikat <tt>succ/2</tt> für natürliche Zahlen.
# Schreiben Sie ein Prädikat <tt>pred/2</tt>, mit <tt>pred(X,Y)</tt>, wobei <tt>Y</tt> der Vorgänger von <tt>X</tt> ist. Benutzen Sie dabei nur das Prädikat <tt>succ/2</tt>.
# Gesucht ist <tt>fact/2</tt>, mit <tt>fact(N,F)</tt>, wobei <tt>F=N!</tt>.
# Gesucht ist <tt>minimum/3</tt>, mit <tt>minimum(N1,N2,M)</tt>, wobei <tt>M=min(N1,N2)</tt>.
# Gesucht ist <tt>fib/2</tt>, mit <tt>fib(N,F)</tt>, wobei <tt>F=Fibonaccizahl(N)</tt>.
# Gesucht ist <tt>summe/3</tt>, mit <tt>summe(X,Y,Z)</tt>, wobei <tt>Z=X+Y</tt>.
# Gesucht ist <tt>produkt/3</tt>, mit <tt>produkt(X,Y,Z)</tt>, wobei <tt>Z=X*Y</tt>.
# Gesucht ist ein Prädikat <tt>ggt/3</tt>, mit <tt>ggt(X,Y,T)</tt>, wobei <tt>T</tt> ist grösster gemeinsamer Teiler von <tt>X</tt> und <tt>Y</tt>.
# Definieren Sie das Prädikat <tt>even/1</tt>, mit <tt>even(N)</tt>, wenn <tt>N</tt> gerade, unter Verwendung der Infixoperators <tt>mod/2</tt>. Definieren Sie anschliessend <tt>odd/1</tt>, mit <tt>odd(N)</tt>, wenn <tt>N</tt> ungerade, unter Verwendung von <tt>even/1</tt> und unter Verwendung des Metaprädikats <tt>not/1</tt>.
# Gesucht ist <tt>ackermann/3</tt>, mit <tt>ackermann(M,N,Z)</tt>, wobei <tt>Z=ackermann(M,N)</tt>.<br/>
:<tt>ackermann(0,N) = N + 1</tt><br/>
:<tt>ackermann(M,0) = ackermann(M-1,1).</tt><br/>
:<tt>ackermann(M,N) = ackermann(M-1, ackermann(M, N-1)).</tt><br/>
:{| border="1" cellpading="2" width="300"
|- bgcolor="lightgray"
! M\N !! 0 !! 1 !! 2 !! 3 !! 4
|-
! bgcolor="lightgray" | 0 || 1 || 2 || 3 || 4 || 5
|-
! bgcolor="lightgray" | 1 || 2 || 3 || 4 || 5 || 6
|-
! bgcolor="lightgray" | 2 || 3 || 5 || 7 || 9 || 11
|-
! bgcolor="lightgray" | 3 || 5 || 13 || 29 || 61 || 125
|-
! bgcolor="lightgray" | 4 || 13 || ? || ? || ? || ?
|}
=== Lösungen zu den Übungsaufgaben ===
<code id="4b8bd2a6231e3" hidden>
succ(Pred, Succ) :-
integer(Pred),
!,
Pred >= 0,
Succ is Pred+1.
succ(Pred, Succ) :-
integer(Succ),
!,
Succ > 0,
Pred is Succ-1.
succ(Pred, Succ) :-
var(Pred), var(Succ),
succ_with_both_arguments_unbound.
</code>
<eval id="4b8bd2a627b97">succ(3,X).</run>
Mit dem <tt>succ</tt> -Prädikat kann man aber auch den Vorgänger einer Zahl bestimmen. Es gibt keine Festlegung darüber, Variable für die "Eingabe" (Argument) bzw. "Ausgabe" (Ergebnis) zuständig ist.
<eval id="4b8bd2a62835f">succ(X,12).</run>
<code id="4b8bd2a6239b4">
pred(0,0).
pred(X,Y) :- succ(Y,X).
</code>
<eval id="4b8bd2a628b31">pred(4,X).</run>
<code id="4b8bd2a6241a9">
minimum(N1,N2,N1) :- N1=<N2.
minimum(N1,N2,N2) :- N2=<N1.
</code>
<eval id="4b8bd2a629337">minimum(91,15,X).</run>
<code id="4b8bd2a624953">
fact(0,1).
fact(N,F) :- succ(N1,N), fact(N1,F1), F is F1*N.
</code>
<eval id="4b8bd2a629ad3">fact(6,X).</run>
<code id="4b8bd2a625124">
summe(X,0,X).
summe(0,X,X).
summe(X,Y,Z) :- succ(X1,X), succ(Y,Y1), summe(X1,Y1,Z).
/* summe(X,Y,Z) :- summe(X1,Y1,Z), succ(X1,X), succ(Y,Y1). */
</code>
<eval id="4b8bd2a62a29f">summe(2,9,X).</run>
<code id="4b8bd2a625913">
fib(0,1).
fib(1,1).
fib(N,F) :- succ(N1,N), N2 is N-2, fib(N1,F1), fib(N2,F2), F is F1+F2.
</code>
<eval id="4b8bd2a62aa72">fib(5,X).</run>
<code id="4b8bd2a6260d4">
ggt(X,0,X) :- X>0.
ggt(X,Y,T) :- Z is X mod Y, ggt(Y,Z,T).
</code>
<eval id="4b8bd2a62b243">ggt(51,34,X).</run>
<code id="4b8bd2a62689f">
even(N) :- N mod 2 =:= 0.
odd(N) :- not(even(N)).
</code>
<eval id="4b8bd2a62ba13">odd(621).</run>
<code id="4b8bd2a627357">
ackermann(0,N,Z) :- succ(N,Z).
ackermann(M,0,Z) :- succ(M1,M), ackermann(M1,1,Z).
ackermann(M,N,Z) :- succ(M1,M), succ(N1,N), ackermann(M,N1,R), ackermann(M1,R,Z).
</code>
<eval id="4b8bd2a62c1e4">ackermann(3,4,X).</run>