English version
Accueil     À propos     Téléchargement     Ressources     Contactez-nous    

Ce site est rarement mis à jour. Pour les informations les plus récentes, rendez-vous sur le nouveau site OCaml à l'adresse ocaml.org.

Browse thread
[Caml-list] lisp -> ocaml
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2001-05-22 (16:33)
From: Miles Egan <miles@c...>
Subject: [Caml-list] lisp -> ocaml
For my own edification I've been translating some of the code from Norvig's
PAIP AI text to get an idea of what this kind of code looks like in OCaml and
I've come up against two small problems.

First, I have two mutually recursive function definitions:

let apply_op op =
  if (Stateset.for_all achieve op.op_preconds) then
      print_endline ("executing " ^ op.op_action);
      global_state := Stateset.diff !global_state op.op_dellist;
      global_state := Stateset.union !global_state op.op_addlist;

let achieve goal ops =
  Stateset.mem goal global_state or
  List.exists apply_op (List.filter (appropriate_p goal) ops)

Which fails to compile, for obvious reasons.  Is the solution to refactor the
code into a nonrecursive form?  In the absence of forward declarations, I'm
not sure what else to do.

Second, the PAIP code makes fairly heavy use of Lisp's symbolic features and
uses symbols as a kind of type tag but also as printable strings.  I've been
using variants, both traditional and polymorphic, as a substitute, but they're
not really quite equivalent.  For example, one of the first programs is a
simple implementation of the old GPS (general problem solver), which
manipulates sets of states.  Lisp provides set operations on lists and allows
printing of symbols, which makes it possible to both manipulate "state" lists
and print them with very little code.  I can't use variants with the same
flexibility because I have to provide an explicit ordering if I want to use
them as set members and I can't print them because there doesn't seem to be a
way to print something like:

type t = ONE | TWO | THREE

as "ONE", "TWO", "THREE".

I'm using strings in the meantime but this isn't very satisfying.                                                                               
To unsubscribe, mail caml-list-request@inria.fr.  Archives: http://caml.inria.fr