# letfill_arraytreetabempty=letrecauxip=functionEmpty->tab.(i)<-empty|Node(l,e,r)->tab.(i)<-e;aux(i+1)(p/2)l;aux(i+p)(p/2)rinaux0(((Array.lengthtab)+1)/2)tree;;val fill_array : 'a arbre_bin -> 'a array -> 'a -> unit = <fun>
# type'aarbre_bin=Empty|Nodeof'aarbre_bin*'a*'aarbre_bin;;type 'a arbre_bin = | Empty | Node of 'a arbre_bin * 'a * 'a arbre_bin
# letleafempty=[|empty|];;val leaf : 'a -> 'a array = <fun>
# letnodeeltleftright=letll=Array.lengthleftandlr=Array.lengthrightinletl=maxlllrinletres=Array.create(2*l+1)eltinArray.blitleft0res1ll;Array.blitright0res(ll+1)lr;res;;val node : 'a -> 'a array -> 'a array -> 'a array = <fun>
# letrecmake_arrayempty=functionEmpty->leafempty|Node(l,e,r)->nodee(make_arrayemptyl)(make_arrayemptyr);;val make_array : 'a -> 'a arbre_bin -> 'a array = <fun>
# letinfixetabemptyf=letrecauxip=iftab.(i)<>emptythen(aux(i+1)(p/2);ftab.(i);aux(i+p)(p/2))inaux0(((Array.lengthtab)+1)/2);;val infixe : 'a array -> 'a -> ('a -> 'b) -> unit = <fun>
# letprint_tab_inttabempty=infixetabempty(funx->print_intx;print_string" - ");;val print_tab_int : int array -> int -> unit = <fun>
# letprefixetabemptyf=fori=0to(Array.lengthtab)-1doiftab.(i)<>emptythenftab.(i)done;;val prefixe : 'a array -> 'a -> ('a -> unit) -> unit = <fun>
# typenoeud_lex=Lettreofchar*bool*arbre_lexandarbre_lex=noeud_lexlist;;type noeud_lex = | Lettre of char * bool * arbre_lextype arbre_lex = noeud_lex list
# typemot=string;;type mot = string
# letrecexistemd=letauxsmin=matchdwith[]->false|(Lettre(c,b,l))::q->ifc=sm.[i]thenifn=1thenbelseexiste(String.subsm(i+1)(n-1))lelseexistesmqinauxm0(String.lengthm);;val existe : string -> arbre_lex -> bool = <fun>
# letrecajoutemd=letauxsmin=ifn=0thendelsematchdwith[]->[Lettre(sm.[i],n=1,ajoute(String.subsm(i+1)(n-1))[])]|(Lettre(c,b,l))::q->ifc=sm.[i]thenifn=1then(Lettre(c,true,l))::qelseLettre(c,b,ajoute(String.subsm(i+1)(n-1))l)::qelse(Lettre(c,b,l))::(ajoutesmq)inauxm0(String.lengthm);;val ajoute : string -> arbre_lex -> arbre_lex = <fun>
# letrecverifield=matchlwith[]->[]|t::q->ifexistetdthent::(verifieqd)elseverifieqd;;val verifie : string list -> arbre_lex -> string list = <fun>
# letstring_of_charc=String.make1c;;val string_of_char : char -> string = <fun>
# letrecfilterpl=matchlwith[]->[]|t::q->ifptthent::(filterpq)elsefilterpq;;val filter : ('a -> bool) -> 'a list -> 'a list = <fun>
# letrecselectend=matchdwith[]->[]|(Lettre(c,b,l))::q->ifn=1thenfilter(functionx->x<>"!")(List.map(function(Lettre(c,b,_))->ifbthenstring_of_charcelse"!")d)elseletr=selecte(n-1)landr2=selectenqinletpr=List.map(functions->(string_of_charc)^s)rinpr@r2;;val selecte : int -> arbre_lex -> string list = <fun>
# letlire_fichiernom_fichier=letdico=ref[]andcanal=open_innom_fichierintrywhiletruedodico:=ajoute(input_linecanal)!dicodone;failwith"cas impossible"withEnd_of_file->close_incanal;!dico|x->close_incanal;raisex;;val lire_fichier : string -> arbre_lex = <fun>
# letmotss=letest_sep=function' '|'\t'|'\''|'"'->true|_->falseinletres=ref[]andp=ref((String.lengths)-1)inletn=ref!pinwhile!p>=0&&est_seps.[!p]dodecrpdone;n:=!p;while(!n>=0)dowhile!n>=0&¬(est_seps.[!n])dodecrndone;res:=String.subs(!n+1)(!p-!n)::!res;while!n>=0&&est_seps.[!n]dodecrndone;p:=!ndone;!res;;val mots : string -> string list = <fun>
# letrecverifiedico=function[]->[]|m::l->ifexistemdicothenverifiedicolelsem::(verifiedicol);;val verifie : arbre_lex -> string list -> string list = <fun>
# letrecajoutex=function[]->[(x,1)]|((y,n)asp)::l->ifx=ythen(y,n+1)::lelsep::(ajoutexl);;val ajoute : 'a -> ('a * int) list -> ('a * int) list = <fun>
# letrecajoute_listeld=function[]->ld|n::l->letres=ajoute_listeldlinajoutenres;;val ajoute_liste : ('a * int) list -> 'a list -> ('a * int) list = <fun>
# letoccurencesl=ajoute_liste[]l;;val occurences : 'a list -> ('a * int) list = <fun>
# letorthographediconom=letf=open_innomandres=ref[]intrywhiletruedolets=input_linefinletls=motssinletlv=verifiedicolsinres:=ajoute_liste!reslvdone;failwith"cas impossible"withEnd_of_file->close_inf;!res|x->close_inf;raisex;;val orthographe : arbre_lex -> string -> (string * int) list = <fun>
# letrecest_divisiblex=function[]->false|n::l->(xmodn)=0||((n*n<=x)&&(est_divisiblexl));;val est_divisible : int -> int list -> bool = <fun>
On cherche le premier nombre premier à partir d'un certain entier en les testant de deux en deux.
# letrecdernier=function[]->failwith"liste vide"|[x]->x|_::l->dernierl;;val dernier : 'a list -> 'a = <fun>
Et on assemble.
# letrecplus_petit_premierln=ifest_divisiblenlthenplus_petit_premierl(n+2)elsen;;val plus_petit_premier : int list -> int -> int = <fun>
# letsuivant=function[]->2|[2]->3|l->letpg=dernierlinplus_petit_premierl(pg+2);;val suivant : int list -> int = <fun>
# type'aens={mutablei:'a;f:'a->'a};;type 'a ens = { mutable i: 'a; f: 'a -> 'a }
# letnexte=letx=e.iine.i<-(e.fe.i);x;;val next : 'a ens -> 'a = <fun>
# letensprem=letprec=ref[2]inletfonct_=letn=suivant!precinprec:=!prec@[n];nin{i=2;f=fonct};;val ensprem : int ens = {i=2; f=<fun>}