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>