1
0
This repository has been archived on 2025-03-31. You can view files and clone it, but cannot push or open issues or pull requests.
opal-examples/Blatt02/Recursion.impl
2013-10-19 01:17:37 +02:00

65 lines
1.8 KiB
Plaintext

IMPLEMENTATION Recursion
IMPORT Nat COMPLETELY
IMPORT Denotation COMPLETELY
IMPORT Char COMPLETELY
DEF plus == \\m,n . IF n = 0
THEN m
ELSE plus(succ(m), pred(n))
FI
DEF sum == \\m,n. IF m>n THEN 0
ELSE m + sum(m+1,n)
FI
DEF in? == \\c,d. IF d = "" THEN false
ELSE IF d ! 0 = c THEN true
ELSE in?(c,delete(d,0,0))
FI
FI
DEF mult == \\a,b. IF a>0 THEN b+mult(a-1,b) ELSE 0 FI
/* Alternativ: IF a>1 THEN b+mult(a-1,b) ELSE b FI */
DEF sumEven == \\m,n. IF m>n THEN 0
ELSE IF m%2=0 THEN m + sumEven(m+1,n)
ELSE sumEven(m+1,n) FI FI
DEF count == \\c,d. IF d = "" THEN 0
ELSE IF d ! 0 = c THEN 1+count(c,delete(d,0,0))
ELSE count(c,delete(d,0,0)) FI FI
DEF countDigits == \\d. IF d = "" THEN 0
ELSE IF digit?(d!0) THEN 1+countDigits(delete(d,0,0))
ELSE countDigits(delete(d,0,0)) FI FI
/* TUT-Examples following */
FUN h : nat ** nat -> nat ** nat
DEF h == \\m,n. (h1(m,n), h2(m,n))
FUN h1 : nat ** nat -> nat
DEF h1 == \\m,n. IF m < n THEN 0 ELSE h1(m-n,n) + 1 FI
FUN h2 : nat ** nat -> nat
DEF h2 == \\m,n. IF m < n THEN m ELSE h2(m-n,n) FI
FUN f : nat ** nat -> nat
DEF f == \\a,b. IF a > b THEN f1(a,b,a)
ELSE f1(b,a,b)
FI
FUN f1 : nat ** nat ** nat -> nat
DEF f1 == \\a,b,z. IF mod(a,b) = 0 THEN a
ELSE f1(a+z,b,z)
FI
FUN g : nat ** nat -> nat
DEF g == \\a,b. IF b = 0 THEN a
ELSE g(b,mod(a,b))
FI