Primitive Recursive Functions (Chapter 3)

Presentation on theme: "Primitive Recursive Functions (Chapter 3)"— Presentation transcript:

Primitive Recursive Functions (Chapter 3)

Preliminaries: partial and total functions
The domain of a partial function on set A contains the subset of A. The domain of a total function on set A contains the entire set A. A partial function f is called partially computable if there is some program that computes it. Another term for such functions partial recursive. Similarly, a function f is called computable if it is both total and partially computable. Another term for such function is recursive.

Composition Let f : A → B and g : B → C g ͦ f : A → C
Composition of f and g can then be expressed as: g ͦ f : A → C (g ͦ f)(x) = g(f(x)) h(x) = g(f(x)) NB: In general composition is not commutative: ( g ͦ f )(x) ≠ ( f ͦ g )(x)

Composition Definition: Let g be a function containing k variables and f1 ... fk be functions of n variables, so the composition of g and f is defined as: h(0) = k Base step h( x1, ... , xn) = g( f1(x1 ,..., xn), … , fk(x1 ,..., xn) ) Inductive step Example: h(x , y) = g( f1(x , y), f2(x , y), f3(x , y) ) h is obtained from g and f1... fk by composition. If g and f1...fk are (partially) computable, then h is (partially) computable. (Proof by construction)

Recursion From programming experience we know that recursion refers to a function calling upon itself within its own definition. Definition: Let g be a function containing k variables then h is obtained through recursion as follows: h(x1 , … , xn) = g( … , h(x1 , … , xn) ) Example: x + y f( x , 0 ) = x (1) f(x , y+1 ) = f( x , y ) + 1 (2) Input: f ( 3, 2 ) => f ( 3 , 1 ) + 1 => ( f ( 3 , 0 ) + 1 ) + 1 => ( ) + 1 => 5

PRC: Initial functions
Primitive Recursively Closed (PRC) class of functions. Initial functions: Example of a projection function: u2 ( x1 , x2 , x3 , x4 , x5 ) = x2 Definition: A class of total functions C is called PRC² class if: The initial functions belong to C. Function obtained from functions belonging to C by either composition or recursion belongs to C. s(x) = x + 1 n(x) = 0 ui (x1 , … , xn) = xi

PRC: primitive recursive functions
There exists a class of computable functions that is a PRC class. Definition: Function is considered primitive recursive if it can be obtained from initial functions and through finite number of composition and recursion steps. Theorem: A function is primitive recursive iff it belongs to the PRC class. (see proof in chapter 3) Corollary: Every primitive recursive function is computable.

Primitive recursive functions: sum
We have already seen the addition function, which can be rewritten in LRR as follows: sum( x, succ(y) ) => succ( sum( x , y)) ; sum( x , 0 ) => x ; Example: sum(succ(0),succ(succ(succ(0)))) => succ(sum(succ(0),succ(succ(0)))) => succ(succ(sum(succ(0),succ(0)))) => succ(succ(succ(sum(succ(0),0) => succ(succ(succ(succ(0))) => succ(succ(succ(1))) => succ(succ(2)) => succ(3) => 4 NB: To prove that a function is primitive recursive you need show that it can be obtained from the initial functions using only concatenation and recursion.

Primitive recursive functions: multiplication
h( x , 0 ) = 0 h( x , y + 1) = h( x , y ) + x In LRR this can be written as: mult(x,0) => 0 ; mult(x,succ(y)) => sum(mult(x,y),x) ; What would happen on the following input? mult(succ(succ(0)),succ(succ(0)))

Primitive recursive functions: factorial
0! = 1 ( x + 1 ) ! = x ! * s( x ) LRR implementation would be as follows: fact(0) => succ(null(0)) ; fact(succ(x)) => mult(fact(x),succ(x)) ; Output for the following? fact(succ(succ(null(0))))

Primitive recursive functions: power and predecessor
Power function In LRR the power function can be expressed as follows: pow(x,0) => succ(null(0)) ; pow(x,succ(y)) => mult(pow(x,y),x) ; Predecessor function In LRR the predecessor is as follows: pred(1) => 0 ; pred(succ(x)) => x ; p (0) = 0 p ( t + 1 ) = t

Primitive recursive functions: ∸, | x – y | and α
dotsub(x,x) => 0 ; dotsub(x,succ(y)) => pred(dotsub(x,y)) ; x ∸ 0 = x x ∸ ( t + 1) = p( x ∸ t ) What would be the output? dotsub(succ(succ(succ(0))),succ(0)) | x – y | = ( x ∸ y ) + ( y ∸ x ) abs(x,y) => sum(dotsub(x,y),dotsub(y,x)) ; α(x) = 1 ∸ x α(x) => dotsub(1,x) ; Output for the following? a(succ(succ(0))) a(null(0))

Primitive recursive functions
x + y f( x , 0 ) = x f( x , y + 1 ) = f( x , y ) + 1 x * y h( x , 0 ) = 0 h( x , y + 1 ) = h( x , y ) + x x! 0! = 1 ( x + 1 )! = x! * s(x) x^y x^0 = 1 x^( y + 1 ) = x^y * x p(x) p( 0 ) = 0 p( x + 1 ) = x x ∸ y if x ≥ y then x ∸ y = x – y; else x ∸ y = 0 x ∸ 0 = x x ∸ ( t + 1) = p( x ∸ t ) | x – y | | x – y | = ( x ∸ y ) + ( y ∸ x ) α(x) α(x) = 1 ∸ x

Bounded quantifiers Theorem: Let C be a PRC class. If f( t , x1 , … , xn) belongs to C then so do the functions g( y , x1 , ... , xn ) = f( t , x1 , …, xn ) g( y , x1 , ... , xn ) = f( t , x1 , …, xn )

Bounded quantifiers Theorem: Let C be a PRC class. If f( t , x1 , … , xn) belongs to C then so do the functions g( y , x1 , ... , xn ) = f( t , x1 , …, xn ) g( y , x1 , ... , xn ) = f( t , x1 , …, xn ) Theorem: If the predicate P( t, x1 , … , xn ) belongs to some PRC class C, then so do the predicates: ( t)≤y P(t, x1, … , xn ) (∃t)≤y P(t, x1, … , xn )

Primitive recursive predicates
x = y d( x , y ) = α( | x – y | ) x ≤ y α ( x ∸ y ) ~P α( P ) P & Q P * Q P v Q ~ ( ~P & ~Q ) y | x y | x = (∃t)≤x { y * t = x } Prime(x) Prime(x) = x > 1 & ( t)≤x { t = 1 v t = x v ~( t | x ) } Exercises for Chapter 3: page 62 Questions 3,4 and 5. Fibonacci function

Bounded minimalization
Let P(t, x1, … ,xn) be in some PRC class C and we can define a function g as follows:

Bounded minimalization
Let P(t, x1, … ,xn) be in some PRC class C and we can define a function g as follows: ,where

Bounded minimalization
Let P(t, x1, … ,xn) be in some PRC class C and we can define a function g as follows: ,where Function g also belongs to C as it is attained from composition of primitive recursive functions.

Bounded minimalization
Let P(t, x1, … ,xn) be in some PRC class C and we can define a function g as follows: ,where Function g also belongs to C as it is attained from composition of primitive recursive functions. t0 is the least value for for which the predicate P is true (1).

Bounded minimalization
Let P(t, x1, … ,xn) be in some PRC class C and we can define a function g as follows: ,where Function g also belongs to C as it is attained from composition of primitive recursive functions. t0 is the least value for for which the predicate P is true (1).

Bounded minimalization
Let P(t, x1, … ,xn) be in some PRC class C and we can define a function g as follows: ,where Function g also belongs to C as it is attained from composition of primitive recursive functions. t0 is the least value for for which the predicate P is true (1).

Bounded minimalization
Let P(t, x1, … ,xn) be in some PRC class C and we can define a function g as follows: ,where Function g also belongs to C as it is attained from composition of primitive recursive functions. t0 is the least value for for which the predicate P is true (1).

Bounded minimalization
Let P(t, x1, … ,xn) be in some PRC class C and we can define a function g as follows: ,where Function g also belongs to C as it is attained from composition of primitive recursive functions. t0 is the least value for for which the predicate P is true (1). g( y , x1 , ... , xn ) produces the least value for which P is true. Finally the definition for bounded minimalization can be given as:

Bounded minimalization
Let P(t, x1, … ,xn) be in some PRC class C and we can define a function g as follows: ,where Function g also belongs to C as it is attained from composition of primitive recursive functions. t0 is the least value for for which the predicate P is true (1). g( y , x1 , ... , xn ) produces the least value for which P is true. Finally the definition for bounded minimalization can be given as: Theorem: If P(t,x1, … ,xn) belongs to some PRC class C and there is function g that does the bounded minimalization for P, then f belongs to C.

Unbounded minimalization
Definition: y is the least value for which predicate P is true if it exists. If there is no value of y for which P is true, the unbounded minimalization is undefined.

Unbounded minimalization
Definition: y is the least value for which predicate P is true if it exists. If there is no value of y for which P is true, the unbounded minimalization is undefined. We can then define this as a non-total function in the following way:

Unbounded minimalization
Definition: y is the least value for which predicate P is true if it exists. If there is no value of y for which P is true, the unbounded minimalization is undefined. We can then define this as a non-total function in the following way: Theorem: If P(x1, … , xn, y) is a computable predicate and if then g is a partially computable function. (Proof by construction)

[ x / y ] , the whole part of the division i.e. [10/4]=2 R(x,y) , remainder of the division of x by y. pn , nth prime number i.e p1=2 , p2=3 etc.

Pairing functions Let us consider the following primitive recursive function that provides a coding for two numbers x and y.

Pairing functions Let us consider the following primitive recursive function that provides a coding for two numbers x and y. Example: <1,1> = 2 * ( ) ∸ 1 = 6 ∸ 1 = 5 <1,2> = 2 * ( 2*2 + 1) ∸ 1 = 10 ∸ 1 = 9

Pairing functions Let us consider the following primitive recursive function that provides a coding for two numbers x and y. Example: <1,1> = 2 * ( ) ∸ 1 = 6 ∸ 1 = 5 <1,2> = 2 * ( 2*2 + 1) ∸ 1 = 10 ∸ 1 = 9

Pairing functions Let us consider the following primitive recursive function that provides a coding for two numbers x and y. Example: <1,1> = 2 * ( ) ∸ 1 = 6 ∸ 1 = 5 <1,2> = 2 * ( 2*2 + 1) ∸ 1 = 10 ∸ 1 = 9 Define z to be as: < x , y > = z Then for any z there is always a unique solution x and y.

Pairing functions Let us consider the following primitive recursive function that provides a coding for two numbers x and y. Example: <1,1> = 2 * ( ) ∸ 1 = 6 ∸ 1 = 5 <1,2> = 2 * ( 2*2 + 1) ∸ 1 = 10 ∸ 1 = 9 Define z to be as: < x , y > = z Then for any z there is always a unique solution x and y.

Pairing functions Let us consider the following primitive recursive function that provides a coding for two numbers x and y. Example: <1,1> = 2 * ( ) ∸ 1 = 6 ∸ 1 = 5 <1,2> = 2 * ( 2*2 + 1) ∸ 1 = 10 ∸ 1 = 9 Define z to be as: < x , y > = z Then for any z there is always a unique solution x and y. Thus we have the solutions for x and y which can then be defined using the following functions:

Pairing functions More formally this can written as:
Pairing Function Theorem: functions <x,y>, l(z), r(z) have the following properties: are primitive recursive l(<x,y>) = x and r(<x,y>) = y < l(z) , r(z) > = z l(z) , r(z)≤ z

Gödel numbers Let (a1, … , an) be any sequence, then the Gödel number is computed as follows:

Gödel numbers Let (a1, … , an) be any sequence, then the Gödel number is computed as follows: Example: Take a sequence (1,2,3,4), the Gödel number will be computed as follows:

Gödel numbers Let (a1, … , an) be any sequence, then the Gödel number is computed as follows: Example: Take a sequence (1,2,3,4), the Gödel number will be computed as follows: Gödel numbering has a special uniqueness property: If [a1, … , an ] = [ b1, … , bn ] then ai = bi , where i = 1, … , n

Gödel numbers Let (a1, … , an) be any sequence, then the Gödel number is computed as follows: Example: Take a sequence (1,2,3,4), the Gödel number will be computed as follows: Gödel numbering has a special uniqueness property: If [a1, … , an ] = [ b1, … , bn ] then ai = bi , where i = 1, … , n Also notice: [ a1, … , an ] = [ a1, … , an, 0 ]

Gödel numbers Given that x = [a1, … , an ], we can now define two important functions:

Gödel numbers Given that x = [a1, … , an ], we can now define two important functions: Example: Let x = [ 4 , 3 , 2 , 1 ], then (x)2 = 3 and (x)4=1 and (x)0 = 0

Gödel numbers Given that x = [a1, … , an ], we can now define two important functions: Example: Let x = [ 4 , 3 , 2 , 1 ], then (x)2 = 3 and (x)4=1 and (x)0 = 0 Lt(10) = will be the length of the sequence derived using Gödel numbering

Gödel numbers Given that x = [a1, … , an ], we can now define two important functions: Example: Let x = [ 4 , 3 , 2 , 1 ], then (x)2 = 3 and (x)4=1 and (x)0 = 0 Lt(10) = will be the length of the sequence derived using Gödel numbering So: 10 = 2^1 * 3^0 * 5^1 = [ 1, 0, 1 ] => Lt(10) = 3

Gödel numbers Given that x = [a1, … , an ], we can now define two important functions: Example: Let x = [ 4 , 3 , 2 , 1 ], then (x)2 = 3 and (x)4=1 and (x)0 = 0 Lt(10) = will be the length of the sequence derived using Gödel numbering So: 10 = 2^1 * 3^0 * 5^1 = [ 1, 0, 1 ] => Lt(10) = 3 Sequence Number Theorem: (1)

Gödel numbers Given that x = [a1, … , an ], we can now define two important functions: Example: Let x = [ 4 , 3 , 2 , 1 ], then (x)2 = 3 and (x)4=1 and (x)0 = 0 Lt(10) = will be the length of the sequence derived using Gödel numbering So: 10 = 2^1 * 3^0 * 5^1 = [ 1, 0, 1 ] => Lt(10) = 3 Sequence Number Theorem: (1) (2)

Similar presentations