[Kos-dev] Caml : mes debuts

Thomas Petazzoni kos-dev@enix.org
Sun, 18 Nov 2001 18:55:44 +0100


salut,

je commence a me pencher sur le Caml, et j'ai voulu commencer par simple
: je recopie un programme du bouquin et je regarde.

J'ai donc commence par recopier le code de l'exemple du chapitre 12 du
bouquin (le demonstrateur de propositions).

J'ai commence (prop.mli et prop.ml), mais j'ai des problemes de
compilation. Voici ces deux fichiers, un peu modifie pour que ca
fonctionne avec ocaml.

(* fichier prop.mli *)
type proposition =
  | Vrai
  | Faux
  | Non of proposition
  | Et of proposition * proposition
  | Ou of proposition * proposition
  | Implique of proposition * proposition
  | Equivalent of proposition * proposition
  | Variable of string;;

exception Refutation of (string * bool) list;;
val verifie_tautologie: proposition -> string list -> unit;;
val variables_libres: proposition -> string list -> unit;;

(* fichier prop.ml *)
open Prop

let rec evalue_dans liaisons = function
  | Vrai -> true
  | Faux -> false
  | Non p -> not (evalue_dans liaisons p)
  | Et (p,q) -> (evalue_dans liaisons p) && (evalue_dans liaisons q)
  | Ou (p,q) -> (evalue_dans liaisons p) || (evalue_dans liaisons q)
  | Implique (p,q) -> (not (evalue_dans liaisons p)) || (evalue_dans
liaisons q)
  | Equivalent (p,q) -> evalue_dans liaisons p = evalue_dans liaisons q
  | Variable v -> List.assoc v liaisons;;

let rec verifie_lignes proposition liaisons variables =
  match variables with
  | [] -> 
      if not (evalue_dans liaisons proposition)
          then raise (Refutation liaisons)
  | var :: autres ->
      verifie_lignes proposition ((var,true)::liaisons) autres;
      verifie_lignes proposition ((var,false)::liaisons) autres;;

let verifie_tautologie proposition variables = 
  verifie_lignes proposition [] variables;;

let rec variables accu proposition =
  match proposition with
  | Variable v -> if List.mem v accu then accu else v :: accu
  | Non p -> variables accu p
  | Et (p,q) -> variables (variables accu p) q
  | Ou (p,q) -> variables (variables accu p) q
  | Implique (p,q) -> variables (variables accu p) q
  | Equivalent (p,q) -> variables (variables accu p) q
  | _ -> accu;;


Pour compiler :
	ocamlc -c prop.mli (compile sans pb, genere bien le .cmi attendu)
	ocamlc -c prop.ml
=> Boum !

thomas@crazy:~/src/caml/proposition$ ocamlc -c prop.ml
The implementation prop.ml does not match the interface prop.cmi:
The field `Refutation' is required but not provided
The field `proposition' is required but not provided

C'est comme si le machin voulait que j'implemente le type proposition ou
l'exception Refutation. Je comprends pas ce qu'il veut dire par la. J'ai
regarde dans la reference de Ocaml, mais j'ai rien trouve :((

Par contre, a noter que je n'ai pas eu besoin de recopier le contenu de
prop.mli dans prop.ml pour que prop.ml ai connaissance de prop.mli
(c'est le truc crade qu'on avait decouvert pendant la toussaint).

Help !

thomas


PS : pour ceux qui nous lisent, le bouquin dont je parle est Le Langage
Caml, Pierre Weis et Xavier Leroy, Editions DUNOD, ISBN 2 10 004383 8
-- 
PETAZZONI Thomas
thomas.petazzoni@meridon.com     UIN : 34937744
Projet KOS : http://kos.enix.org
Page Perso : http://www.enix.org/~thomas/