Lorsqu'un argument est passé à un ensemble de clauses::
p1 -> e1 ∣ … ∣ pn -> en
- la première clause qui filtre l'argument est exécutée, les autres sont
ignorées.
- si aucune clause ne filtre l'argument, une exception est levée.
Définitions récursives
-----------------------
En ocaml, `let rec` définit une variable récursive, ie qui utilise la (les) valeur(s) en cours de définition.
Exemples
--------
::
let rec f (x) = if x <= 1 then 1 else f(x-1) + f(x-2) ;;
let rec g (x) = if x = 0 then 1 else x * g (x-1) ;;
let rec h (x, y) = if x = 0 then 1 else h (x-1, h(x,y)) ;;
let rec m (x) = if x > 100 then x - 10 else m (m (x+11)) ;;
On peut imprimer leur valeurs pour qques valeurs::
begin
for i = 1 to 15 do
printf "%d " (f (i)) done;
printf "\n"
end ;;
f, g sont les fonctions de Fibonacci et factorielles. C'est la même notation que pour les suites récurrentes. Que valent h et m?
La récursivité est très puissante. Invention de Kleene (1935). Théorie des fonctions récursives, comme moyen général de calcul. On peut montrer qu'il existe toujours des fonctions récursives partielles (qui ne terminent pas pour tte valeur de leurs arguments), si on veut un modèle général. La sous théorie des fonctions récursives primitives correspond aux programmes sans boucles, sans appels récursifs, et l'instruction for. Ces programmes terminent toujours. (cf Introduction to Metamathematics, S. Kleene; Recursive Functions Theory and Logic, A. Yasuhara).
Church et les autres logiciens des années 30 ont montré que systèmes de Post, les fonctions récursives de Kleene, les machines de Turing, sont tous équivalentes. Il a émis la thèse suivante: tous les modèles de la calculabilité sont équivalents.
Fonctions récursives
---------------------
::
let rec fact n = if n > 1 then n * fact (n -1) else 1;;
dans le prompt::
utop # let rec fact n = if n > 1 then n * fact (n -1) else 1;;
val fact : int -> int = <fun>
counter: 0 }─utop # fact 5;;
- : int = 120
et mutuellement récursives::
let rec ping n = if n > 0 then pong (n - 1) else "ping"
and pong n = if n > 0 then ping (n - 1) else "pong";;