∗ 1 semantics of programming languages recursion ∗ 59 (2007), 180–191 1 2 2.1 fact(x) ≡ if x = 0 then 1 else x × fact(x−1) well-defined Z * Z Z * Z F : (Z * Z) → (Z * Z) F(f)(x) = 1 (x = 0) x × f(x − 1) (x 6= 0, f(x − 1) ) ( ) F F fact fact [[fact]] : Z * Z [[fact]](x) = ( x! (x ≥ 0) ( ) 2 F f [[fact]] F([[fact]])(x) = 1 (x = 0) x × y (x 6= 0, [[fact]](x−1) = y) ( ) = ( x! (x ≥