caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Miles Egan <miles@caddr.com>
To: caml-list@inria.fr
Subject: [Caml-list] lisp -> ocaml
Date: Tue, 22 May 2001 09:33:41 -0700	[thread overview]
Message-ID: <20010522093341.A97425@caddr.com> (raw)

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
    begin
      print_endline ("executing " ^ op.op_action);
      global_state := Stateset.diff !global_state op.op_dellist;
      global_state := Stateset.union !global_state op.op_addlist;
      true
    end
    else
      false

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.                                                                               
-- 
miles
-------------------
To unsubscribe, mail caml-list-request@inria.fr.  Archives: http://caml.inria.fr


             reply	other threads:[~2001-05-22 16:33 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-05-22 16:33 Miles Egan [this message]
2001-05-22 16:52 ` Markus Mottl
2001-05-22 17:09 ` Brian Rogoff
2001-05-22 18:27 ` Remi VANICAT
2001-05-22 17:12   ` Miles Egan
2001-05-22 18:26     ` Chris Hecker
2001-05-27 13:01 ` Xavier Leroy
2001-05-27 14:43   ` Miles Egan
2001-05-27 21:24   ` Dave Mason
2001-05-28 17:10     ` William Chesters
2001-05-28  0:06   ` Chris Hecker
2001-05-28 13:32     ` Xavier Leroy
2001-05-28 19:02       ` Chris Hecker

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20010522093341.A97425@caddr.com \
    --to=miles@caddr.com \
    --cc=caml-list@inria.fr \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).