The Klotski Problem from last year's MOOC.
"Douglas Lewit [email protected] [ocaml_beginners]" <[email protected]> Wed, 21 Jun 2017 21:31:00 -0500
| Newsgroups | gmane.comp.lang.ocaml.beginners |
|---|---|
| Message-ID | <CAM0XMJSjqxb-yV0zm_P3LRtCBSiS3EuuxRg3tEdaHmo9-JF9ig@mail.gmail.com> |
--001a114104a689ed7f0552834631
Content-Type: text/plain; charset="UTF-8"
Hi everyone,
Was anyone in the group a member of that OCaml MOOC last year that was
hosted by OCaml Pro and Universite Paris Diderot? Anyhow, do you recall
that Klotski Problem that was one of two final projects at the end of the
course? Can someone take a look at my first six functions for that
project. (If you were in the course and if you did the Klotski Project.
Otherwise don't worry about it!) Am I on the right track with this? I'm
not 100% sure that my functions are correct. They DO compile.... but then
again just because a program compiles is no guarantee of correctness!!!! I
appreciate the feedback, and thanks for your time.
Best,
Douglas Lewit
*(* OCaml functions written by Douglas Lewit of Oakton Community College
and Northeastern Illinois University. *)*
*exception NotFound ;;*
*type 'e rel = 'e -> 'e list ;;*
*let rec loop (p : ('a -> bool)) (f : ('a -> 'a)) (x : 'a) : 'a = match p x
with *
* |true -> x *
* |false -> loop p
f (f x) ;;*
*let rec exists (p : ('a -> bool)) (ls : 'a list) : bool = match ls with *
* |[] -> false*
* |head :: tail -> if p head *
* then true *
* else exists
p tail ;;*
*let rec find (p : ('a -> bool)) (ls : 'a list) : 'a = match ls with *
* |[] -> raise
NotFound *
* |head :: tail -> if p head *
* then head *
* else find p
tail ;;*
*(* near returns the function, near'. *)*
*let near : int rel = (* The default step size here is just 1. *)*
* let rec sequence ?step:(s=1) lower upper = *
* if lower > upper *
* then [] *
* else lower :: sequence ~step:s (lower + s)
upper *
* in *
* let near' (n : int) : int list = *
* let lower_bound = n - 2 in *
* let upper_bound = n + 2 in *
* sequence lower_bound upper_bound *
* in near' (* Here we have an example of "partial
function application". *) ;;*
*(* flat_map returns the function, flat_map'. *)*
*let flat_map (rel_function : 'e rel) : 'e list -> 'e list = *
* let rec flatten (lst : 'e list list) : 'e list = *
* match lst with *
* |[] -> [] *
* |head :: tail -> match head with *
* |[] -> flatten tail *
* |hd :: tl -> hd :: flatten (tl ::
tail) *
* in *
* let rec flat_map' (e_list : 'e list) : 'e list list = *
* match e_list with *
* |[] -> [] *
* |head :: tail -> (rel_function head) :: flat_map'
tail *
* in*
* (* The variable "x" in my composition function is really a
dummy variable. *)*
* let composition (f : 'a -> 'b) (g : 'c -> 'a) (x : 'c) : 'b
= f (g x) *
* in composition flatten flat_map' (* This is an example of
"partial function application" *
* and also function
composition. *) ;;*
*(* iter_rel should be used like this: (iter_rel near 5) 2 --> the
interpretation is that (iter_rel near 5) 2 should **yield the same
result as flat_map near (flat_map near( flat_map near( flat_map near (near
2)))). *
* Try it for yourself! By the way, this function was NOT easy to
write!!! *)*
*let iter_rel (rel_func : 'e rel) (i : int) : 'e rel =*
* let rec f x n = if n = 1*
* then x*
* else f (x |> flat_map rel_func) (n - 1)*
* in let g k = f (rel_func k) i*
* in g ;;*
--001a114104a689ed7f0552834631
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/htm=
l4/strict.dtd">
<html>
<head>
</head>
=20
<body style=3D"background-color: #fff;">
<span style=3D"display:none"> </span>
<!--~-|**|PrettyHtmlStartT|**|-~-->
<div id=3D"ygrp-mlmsg" style=3D"position:relative;">
<div id=3D"ygrp-msg" style=3D"z-index: 1;">
<!--~-|**|PrettyHtmlEndT|**|-~-->
<div id=3D"ygrp-text" >
=20=20=20=20=20=20
=20=20=20=20=20=20
<p><div dir=3D"ltr"><font size=3D"4" face=3D"monospace, monospace">Hi=
everyone,</font><div><font size=3D"4" face=3D"monospace, monospace"><br></=
font></div><div><font size=3D"4" face=3D"monospace, monospace">Was anyone i=
n the group a member of that OCaml MOOC last year that was hosted by OCaml =
Pro and Universite Paris Diderot?=C2=A0 Anyhow, do you recall that Klotski =
Problem that was one of two final projects at the end of the course?=C2=A0 =
Can someone take a look at my first six functions for that project. =C2=A0(=
If you were in the course and if you did the Klotski Project.=C2=A0 Otherwi=
se don't worry about it!) =C2=A0Am I on the right track with this?=C2=
=A0 I'm not 100% sure that my functions are correct.=C2=A0 They DO comp=
ile.... but then again just because a program compiles is no guarantee of c=
orrectness!!!!=C2=A0 I appreciate the feedback, and thanks for your time.</=
font></div><div><font size=3D"4" face=3D"monospace, monospace"><br></font><=
/div><div><font size=3D"4" face=3D"monospace, monospace">Best,</font></div>=
<div><font size=3D"4" face=3D"monospace, monospace"><br></font></div><div><=
font size=3D"4" face=3D"monospace, monospace">Douglas Lewit</font></div><di=
v><font size=3D"4" face=3D"monospace, monospace"><br></font></div><div><fon=
t size=3D"4" face=3D"monospace, monospace"><br></font></div><div><font size=
=3D"4"><div><font face=3D"monospace, monospace" color=3D"#0b5394"><b>(* OCa=
ml functions written by Douglas Lewit of Oakton Community College and North=
eastern Illinois University. *)</b></font></div><div><font face=3D"monospac=
e, monospace" color=3D"#0b5394"><b><br></b></font></div><div><font face=3D"=
monospace, monospace" color=3D"#0b5394"><b>exception NotFound ;;</b></font>=
</div><div><font face=3D"monospace, monospace" color=3D"#0b5394"><b><br></b=
></font></div><div><font face=3D"monospace, monospace" color=3D"#0b5394"><b=
>type 'e rel =3D 'e -> 'e list ;;</b></font></div><div><font=
face=3D"monospace, monospace" color=3D"#0b5394"><b><br></b></font></div><d=
iv><font face=3D"monospace, monospace" color=3D"#0b5394"><b>let rec loop (p=
: ('a -> bool)) (f : ('a -> 'a)) (x : 'a) : 'a =
=3D match p x with=C2=A0</b></font></div><div><font face=3D"monospace, mono=
space" color=3D"#0b5394"><b>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 |true=
=C2=A0 =C2=A0 -> x=C2=A0</b></font></div><div><font face=3D"monospace, =
monospace" color=3D"#0b5394"><b>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 |=
false =C2=A0 =C2=A0-> loop p f (f x) ;;</b></font></div><div><font face=
=3D"monospace, monospace" color=3D"#0b5394"><b><br></b></font></div><div><f=
ont face=3D"monospace, monospace" color=3D"#0b5394"><b><br></b></font></div=
><div><font face=3D"monospace, monospace" color=3D"#0b5394"><b>let rec exis=
ts (p : ('a -> bool)) (ls : 'a list) : bool =3D match ls with=C2=
=A0</b></font></div><div><font face=3D"monospace, monospace" color=3D"#0b53=
94"><b>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 |[] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 -> false</b>=
</font></div><div><font face=3D"monospace, monospace" color=3D"#0b5394"><b>=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 |head :: tail -> if p head=C2=A0</b></font></div><div><fon=
t face=3D"monospace, monospace" color=3D"#0b5394"><b>=C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0then true=C2=A0</b><=
/font></div><div><font face=3D"monospace, monospace" color=3D"#0b5394"><b>=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0else exists p tail ;;</b></font></div><div><font face=3D"monospace, mono=
space" color=3D"#0b5394"><b><br></b></font></div><div><font face=3D"monospa=
ce, monospace" color=3D"#0b5394"><b>let rec find (p : ('a -> bool)) =
(ls : 'a list) : 'a =3D match ls with=C2=A0</b></font></div><div><f=
ont face=3D"monospace, monospace" color=3D"#0b5394"><b>=C2=A0 =C2=A0 =C2=A0=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 |[] =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0-> raise NotFound=C2=A0</b></font></div><=
div><font face=3D"monospace, monospace" color=3D"#0b5394"><b>=C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 |head ::=
tail =C2=A0-> if p head=C2=A0</b></font></div><div><font face=3D"monosp=
ace, monospace" color=3D"#0b5394"><b>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 then head=C2=A0</b></font></div><div><font =
face=3D"monospace, monospace" color=3D"#0b5394"><b>=C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 else find p tail ;;</b></font=
></div><div><font face=3D"monospace, monospace" color=3D"#0b5394"><b><br></=
b></font></div><div><font face=3D"monospace, monospace" color=3D"#0b5394"><=
b>(* near returns the function, near'. *)</b></font></div><div><font fa=
ce=3D"monospace, monospace" color=3D"#0b5394"><b>let near : int rel =3D =C2=
=A0 (* The default step size here is just 1. *)</b></font></div><div><font =
face=3D"monospace, monospace" color=3D"#0b5394"><b>=C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0let rec sequence=
?step:(s=3D1) lower upper =3D=C2=A0</b></font></div><div><font face=3D"mon=
ospace, monospace" color=3D"#0b5394"><b>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0if lower > upper=C2=A0</b></font></div><div><font face=3D"monospace, =
monospace" color=3D"#0b5394"><b>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0then [=
]=C2=A0</b></font></div><div><font face=3D"monospace, monospace" color=3D"#=
0b5394"><b>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0else lower :: sequence ~ste=
p:s (lower + s) upper=C2=A0</b></font></div><div><font face=3D"monospace, m=
onospace" color=3D"#0b5394"><b>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0in=C2=A0</b></font></div><div><fon=
t face=3D"monospace, monospace" color=3D"#0b5394"><b>=C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0let near'=
(n : int) : int list =3D=C2=A0</b></font></div><div><font face=3D"monospac=
e, monospace" color=3D"#0b5394"><b>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0le=
t lower_bound =3D n - 2 in=C2=A0</b></font></div><div><font face=3D"monospa=
ce, monospace" color=3D"#0b5394"><b>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0le=
t upper_bound =3D n + 2 in=C2=A0</b></font></div><div><font face=3D"monospa=
ce, monospace" color=3D"#0b5394"><b>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0se=
quence lower_bound upper_bound=C2=A0</b></font></div><div><font face=3D"mon=
ospace, monospace" color=3D"#0b5394"><b>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0in near' (* Here we hav=
e an example of "partial function application". *) ;;</b></font><=
/div><div><font face=3D"monospace, monospace" color=3D"#0b5394"><b><br></b>=
</font></div><div><font face=3D"monospace, monospace" color=3D"#0b5394"><b>=
(* flat_map returns the function, flat_map'. *)</b></font></div><div><f=
ont face=3D"monospace, monospace" color=3D"#0b5394"><b>let flat_map (rel_fu=
nction : 'e rel) : 'e list -> 'e list =3D=C2=A0</b></font></=
div><div><font face=3D"monospace, monospace" color=3D"#0b5394"><b>=C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 let rec flatten (lst : 'e lis=
t list) : 'e list =3D=C2=A0</b></font></div><div><font face=3D"monospac=
e, monospace" color=3D"#0b5394"><b>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 match lst with=C2=A0</b></font></div=
><div><font face=3D"monospace, monospace" color=3D"#0b5394"><b>=C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|[] =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 -> []=C2=A0</b></font></div><div><font f=
ace=3D"monospace, monospace" color=3D"#0b5394"><b>=C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|head :: tail -> mat=
ch head with=C2=A0</b></font></div><div><font face=3D"monospace, monospace"=
color=3D"#0b5394"><b>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0|[] =C2=A0 =C2=A0 =C2=A0 =C2=A0 -> flatten tail=C2=A0</b></font></=
div><div><font face=3D"monospace, monospace" color=3D"#0b5394"><b>=C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|hd :: tl =C2=A0 -> =
hd :: flatten (tl :: tail)=C2=A0</b></font></div><div><font face=3D"monospa=
ce, monospace" color=3D"#0b5394"><b>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 in=C2=A0</b></font></div><div><font face=3D"monospace, monospace=
" color=3D"#0b5394"><b>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 let=
rec flat_map' (e_list : 'e list) : 'e list list =3D=C2=A0</b><=
/font></div><div><font face=3D"monospace, monospace" color=3D"#0b5394"><b>=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 match e_list with=C2=A0</b></font></div><div><font face=3D"monospace, m=
onospace" color=3D"#0b5394"><b>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|[] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 -&=
gt; []=C2=A0</b></font></div><div><font face=3D"monospace, monospace" color=
=3D"#0b5394"><b>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0|head :: tail -> (rel_function head) :: flat_map' t=
ail=C2=A0</b></font></div><div><font face=3D"monospace, monospace" color=3D=
"#0b5394"><b>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 in</b></font>=
</div><div><font face=3D"monospace, monospace" color=3D"#0b5394"><b>=C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (* The variable "x" in =
my composition function is really a dummy variable. *)</b></font></div><div=
><font face=3D"monospace, monospace" color=3D"#0b5394"><b>=C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 let composition (f : 'a -> 'b) (=
g : 'c -> 'a) (x : 'c) : 'b =3D f (g x) =C2=A0</b></font=
></div><div><font face=3D"monospace, monospace" color=3D"#0b5394"><b>=C2=A0=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 in composition flatten flat_map&=
#39; (* This is an example of "partial function application"=C2=
=A0</b></font></div><div><font face=3D"monospace, monospace" color=3D"#0b53=
94"><b>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 and also function composition. *) ;;</b>=
</font></div><div><font face=3D"monospace, monospace" color=3D"#0b5394"><b>=
<br></b></font></div><div><font face=3D"monospace, monospace" color=3D"#0b5=
394"><b>(* iter_rel should be used like this: (iter_rel near 5) 2 --> th=
e interpretation is that (iter_rel near 5) 2 =C2=A0 =C2=A0 =C2=A0should=C2=
=A0</b></font><b style=3D"color:rgb(11,83,148);font-family:monospace,monosp=
ace;">yield the same result as flat_map near (flat_map near( flat_map near(=
flat_map near (near 2)))). =C2=A0</b></div><div><font face=3D"monospace, m=
onospace" color=3D"#0b5394"><b>=C2=A0 =C2=A0Try it for yourself!=C2=A0 By t=
he way, this function was NOT easy to write!!! *)</b></font></div><div><fon=
t face=3D"monospace, monospace" color=3D"#0b5394"><b>let iter_rel (rel_func=
: 'e rel) (i : int) : 'e rel =3D</b></font></div><div><font face=
=3D"monospace, monospace" color=3D"#0b5394"><b>=C2=A0 =C2=A0 let rec f x n =
=3D if n =3D 1</b></font></div><div><font face=3D"monospace, monospace" col=
or=3D"#0b5394"><b><span style=3D"white-space:pre;"> </span> =C2=A0 =C2=A0t=
hen x</b></font></div><div><font face=3D"monospace, monospace" color=3D"#0b=
5394"><b><span style=3D"white-space:pre;"> </span> =C2=A0 =C2=A0else f (x =
|> flat_map rel_func) (n - 1)</b></font></div><div><font face=3D"monospa=
ce, monospace" color=3D"#0b5394"><b>=C2=A0 =C2=A0 in let g k =3D f (rel_fun=
c k) i</b></font></div><div><font face=3D"monospace, monospace" color=3D"#0=
b5394"><b>=C2=A0 =C2=A0 =C2=A0 =C2=A0in g ;;</b></font></div><div><br></div=
></font></div><div><font size=3D"4"><br></font></div></div>
</p>
</div>
=20=20=20=20=20
<!--~-|**|PrettyHtmlStart|**|-~-->
<div style=3D"color: #fff; height: 0;">__._,_.___</div>
=20=20=20=20=20=20=20=20=20=20
=20=20
=20
=20=20=20=20
<div style=3D"clear:both"> </div>
<div id=3D"fromDMARC" style=3D"margin-top: 10px;">
<hr style=3D"height:2px ; border-width:0; color:#E3E3E3; background=
-color:#E3E3E3;">
Posted by: Douglas Lewit <[email protected]> <hr style=
=3D"height:2px ; border-width:0; color:#E3E3E3; background-color:#E3E3E3;">
</div>
<div style=3D"clear:both"> </div>
<table cellspacing=3D4px style=3D"margin-top: 10px; margin-bottom: 10px=
; color: #2D50FD;">
<tbody>
<tr>
<td style=3D"font-size: 12px; font-family: arial; font-weight: bo=
ld; padding: 7px 5px 5px;" >
<a style=3D"text-decoration: none; color: #2D50FD=
" href=3D"https://groups.yahoo.com/neo/groups/ocaml_beginners/conversations=
/messages/14825;_ylc=3DX3oDMTJxNThuamttBF9TAzk3MzU5NzE0BGdycElkAzQ5OTkxOTQE=
Z3Jwc3BJZAMxNzA1MDA2NzY0BG1zZ0lkAzE0ODI1BHNlYwNmdHIEc2xrA3JwbHkEc3RpbWUDMTQ=
5ODA5ODY2Mw--?act=3Dreply&messageNum=3D14825">Reply via web post</a>
</td>
<td>•</td>
<td style=3D"font-size: 12px; font-family: arial; padding: 7px 5p=
x 5px;" >
<a href=3D"mailto:[email protected]?subject=3DRe%3A%20The%20Klo=
tski%20Problem%20from%20last%20year%27s%20MOOC%2E" style=3D"text-decoration=
: none; color: #2D50FD;">
Reply to sender </a>
</td>
<td>•</td>
<td style=3D"font-size: 12px; font-family: arial; padding: 7px 5p=
x 5px;">
<a href=3D"mailto:[email protected]?subject=3DRe%=
3A%20The%20Klotski%20Problem%20from%20last%20year%27s%20MOOC%2E" style=3D"t=
ext-decoration: none; color: #2D50FD">
Reply to group </a>
</td>
<td>•</td>
<td style=3D"font-size: 12px; font-family: arial; padding: 7px 5p=
x 5px;" >
<a href=3D"https://groups.yahoo.com/neo/groups/ocaml_beginners/=
conversations/newtopic;_ylc=3DX3oDMTJlZG1vZWVsBF9TAzk3MzU5NzE0BGdycElkAzQ5O=
TkxOTQEZ3Jwc3BJZAMxNzA1MDA2NzY0BHNlYwNmdHIEc2xrA250cGMEc3RpbWUDMTQ5ODA5ODY2=
Mw--" style=3D"text-decoration: none; color: #2D50FD">Start a New Topic</a>
</td>
<td>•</td>
<td style=3D"font-size: 12px; font-family: arial; padding: 7px 5p=
x 5px;color: #2D50FD;" >
<a href=3D"https://groups.yahoo.com/neo/groups/=
ocaml_beginners/conversations/topics/14825;_ylc=3DX3oDMTM2NHY5MXZ1BF9TAzk3M=
zU5NzE0BGdycElkAzQ5OTkxOTQEZ3Jwc3BJZAMxNzA1MDA2NzY0BG1zZ0lkAzE0ODI1BHNlYwNm=
dHIEc2xrA3Z0cGMEc3RpbWUDMTQ5ODA5ODY2MwR0cGNJZAMxNDgyNQ--" style=3D"text-dec=
oration: none; color: #2D50FD;">Messages in this topic</a>
(1)
</td>
</tr>
</tbody>
</table>
=20=20=20=20=20=20=20=20
<div id=3D"megaphoneModule">
<hr style=3D"height:2px ; border-width:0; color:#E3E3E3; backgr=
ound-color:#E3E3E3;">
<div>
<div class=3D"stream" style=3D"margin-bottom:10px;">
<div style=3D"background-color:white;">
<div class=3D"sn-img" style=3D"display:inline;"><img name=3D"tn=
_file" style=3D"padding:0px 10px;vertical-align:top;margin-top:5px;" src=3D=
"https://s.yimg.com/ru/static/images/yg/img/megaphone/1464031581_phpFA8bON"=
height=3D"82" width=3D"82"></div>
<div class=3D"mod-txt" style=3D"display:inline-block;">
<a rel=3D"nofollow" name=3D"sub_url" target=3D"_blank" href=
=3D"https://yho.com/1wwmgg" style=3D"color:#0000FF;display:block;margin-lef=
t:5px;text-decoration:none;"><span style=3D"font-size:15px;">Have you tried=
the highest rated email app?</span></a>
<div style=3D"max-width:530px;padding:2px 5px;">With 4.5 st=
ars in iTunes, the Yahoo Mail app is the highest rated email app on the mar=
ket. What are you waiting for? Now you can access all your inboxes (Gmail, =
Outlook, AOL and more) in one place. Never delete an email again with 1000G=
B of free cloud storage.</div>
</div>
</div>
</div> </div>=20=20
=20=20=20=20=20
<hr style=3D"height:2px ; border-width:0; color:#E3E3E3; background-col=
or:#E3E3E3;">
</div>
<!------- Start Nav Bar ------>
<div id=3D"ygrp-grfd" style=3D"font-family: Verdana; font-size: 12px; p=
adding: 15px 0;">
=20=20=20=20=20=20
<!-- |**|begin egp html banner|**| -->
Archives up to December 31, 2011 are also downloadable at <a href=3D"=
http://www.connettivo.net/cntprojects/ocaml_beginners">http://www.connettiv=
o.net/cntprojects/ocaml_beginners</a><BR>
The archives of the very official ocaml list (the seniors' one) can be foun=
d at <a href=3D"http://caml.inria.fr">http://caml.inria.fr</a><BR>
Attachments are banned and you're asked to be polite, avoid flames etc. =
=20=20
<!-- |**|end egp html banner|**| -->
</div>
=20=20
=20
<!-- |**|begin egp html banner|**| -->
<div id=3D"ygrp-vital" style=3D"background-color: #f2f2f2; font-family: Ver=
dana; font-size: 10px; margin-bottom: 10px; padding: 10px;">
<span id=3D"vithd" style=3D"font-weight: bold; color: #333; text-transf=
orm: uppercase; "><a href=3D"https://groups.yahoo.com/neo/groups/ocaml_begi=
nners/info;_ylc=3DX3oDMTJlaDhidG5qBF9TAzk3MzU5NzE0BGdycElkAzQ5OTkxOTQEZ3Jwc=
3BJZAMxNzA1MDA2NzY0BHNlYwN2dGwEc2xrA3ZnaHAEc3RpbWUDMTQ5ODA5ODY2Mw--" style=
=3D"text-decoration: none;">Visit Your Group</a></span>
<ul style=3D"list-style-type: none; margin: 0; padding: 0; display: in=
line;">
</ul>
</div>
<div id=3D"ft" style=3D"font-family: Arial; font-size: 11px; margin-top: 5p=
x; padding: 0 2px 0 0; clear: both;">
<a href=3D"https://groups.yahoo.com/neo;_ylc=3DX3oDMTJkbzZlajQxBF9TAzk3ND=
c2NTkwBGdycElkAzQ5OTkxOTQEZ3Jwc3BJZAMxNzA1MDA2NzY0BHNlYwNmdHIEc2xrA2dmcARzd=
GltZQMxNDk4MDk4NjYz" style=3D"float: left;"><img src=3D"http://l.yimg.com/r=
u/static/images/yg/img/email/new_logo/logo-groups-137x15.png" height=3D"15"=
width=3D"137" alt=3D"Yahoo! Groups" style=3D"border: 0;"/></a>
<div style=3D"color: #747575; float: right;"> • <a href=3D"https://i=
nfo.yahoo.com/privacy/us/yahoo/groups/details.html" style=3D"text-decoratio=
n: none;">Privacy</a> • <a href=3D"mailto:ocaml_beginners-unsubscribe@=
yahoogroups.com?subject=3DUnsubscribe" style=3D"text-decoration: none;">Uns=
ubscribe</a> • <a href=3D"https://info.yahoo.com/legal/us/yahoo/utos/t=
erms/" style=3D"text-decoration: none;">Terms of Use</a> </div>
</div>
<br>
<!-- |**|end egp html banner|**| -->
</div> <!-- ygrp-msg -->
=20
<!-- Sponsor -->
<!-- |**|begin egp html banner|**| -->
<div id=3D"ygrp-sponsor" style=3D"width:160px; float:right; clear:none; m=
argin:0 0 25px 0; background: #fff;">
<!-- Start Recommendations -->
<div id=3D"ygrp-reco">
</div>
<!-- End Recommendations -->
</div> <!-- |**|end egp html banner|**| -->
<div style=3D"clear:both; color: #FFF; font-size:1px;">.</div>
</div>
<img src=3D"http://geo.yahoo.com/serv?s=3D97359714/grpId=3D4999194/grpspI=
d=3D1705006764/msgId=3D14825/stime=3D1498098663" width=3D"1" height=3D"1"> =
<br>
<img src=3D"http://y.analytics.yahoo.com/fpc.pl?ywarid=3D515FB27823A7407E&a=
=3D10001310322279&js=3Dno&resp=3Dimg&cf12=3DCP" width=3D"1" height=3D"1">=20
<div style=3D"color: #fff; height: 0;">__,_._,___</div>
<!--~-|**|PrettyHtmlEnd|**|-~-->
</body>
<!--~-|**|PrettyHtmlStart|**|-~-->
<head>
<style type=3D"text/css">
<!--
#ygrp-mkp {
border: 1px solid #d8d8d8;
font-family: Arial;
margin: 10px 0;
padding: 0 10px;
}
#ygrp-mkp hr {
border: 1px solid #d8d8d8;
}
#ygrp-mkp #hd {
color: #628c2a;
font-size: 85%;
font-weight: 700;
line-height: 122%;
margin: 10px 0;
}
#ygrp-mkp #ads {
margin-bottom: 10px;
}
#ygrp-mkp .ad {
padding: 0 0;
}
#ygrp-mkp .ad p {
margin: 0;
}
#ygrp-mkp .ad a {
color: #0000ff;
text-decoration: none;
}
#ygrp-sponsor #ygrp-lc {
font-family: Arial;
}
#ygrp-sponsor #ygrp-lc #hd {
margin: 10px 0px;
font-weight: 700;
font-size: 78%;
line-height: 122%;
}
#ygrp-sponsor #ygrp-lc .ad {
margin-bottom: 10px;
padding: 0 0;
}
#actions {
font-family: Verdana;
font-size: 11px;
padding: 10px 0;
}
#activity {
background-color: #e0ecee;
float: left;
font-family: Verdana;
font-size: 10px;
padding: 10px;
}
#activity span {
font-weight: 700;
}
#activity span:first-child {
text-transform: uppercase;
}
#activity span a {
color: #5085b6;
text-decoration: none;
}
#activity span span {
color: #ff7900;
}
#activity span .underline {
text-decoration: underline;
}
.attach {
clear: both;
display: table;
font-family: Arial;
font-size: 12px;
padding: 10px 0;
width: 400px;
}
.attach div a {
text-decoration: none;
}
.attach img {
border: none;
padding-right: 5px;
}
.attach label {
display: block;
margin-bottom: 5px;
}
.attach label a {
text-decoration: none;
}
=20=20
blockquote {
margin: 0 0 0 4px;
}
.bold {
font-family: Arial;
font-size: 13px;
font-weight: 700;
}
.bold a {
text-decoration: none;
}
dd.last p a {
font-family: Verdana;
font-weight: 700;
}
dd.last p span {
margin-right: 10px;
font-family: Verdana;
font-weight: 700;
}
dd.last p span.yshortcuts {
margin-right: 0;
}
div.attach-table div div a {
text-decoration: none;
}
div.attach-table {
width: 400px;
}
div.file-title a, div.file-title a:active, div.file-title a:hover, div.fi=
le-title a:visited {
text-decoration: none;
}
div.photo-title a, div.photo-title a:active, div.photo-title a:hover, div=
.photo-title a:visited {
text-decoration: none;
}
div#ygrp-mlmsg #ygrp-msg p a span.yshortcuts {
font-family: Verdana;
font-size: 10px;
font-weight: normal;
}
.green {
color: #628c2a;
}
.MsoNormal {
margin: 0 0 0 0;
}
o {
font-size: 0;
}
#photos div {
float: left;
width: 72px;
}
#photos div div {
border: 1px solid #666666;
height: 62px;
overflow: hidden;
width: 62px;
}
#photos div label {
color: #666666;
font-size: 10px;
overflow: hidden;
text-align: center;
white-space: nowrap;
width: 64px;
}
#reco-category {
font-size: 77%;
}
#reco-desc {
font-size: 77%;
}
.replbq {
margin: 4px;
}
#ygrp-actbar div a:first-child {
/* border-right: 0px solid #000;*/
margin-right: 2px;
padding-right: 5px;
}
#ygrp-mlmsg {
font-size: 13px;
font-family: Arial, helvetica,clean, sans-serif;
*font-size: small;
*font: x-small;
}
#ygrp-mlmsg table {
font-size: inherit;
font: 100%;
}
#ygrp-mlmsg select, input, textarea {
font: 99% Arial, Helvetica, clean, sans-serif;
}
#ygrp-mlmsg pre, code {
font:115% monospace;
*font-size:100%;
}
#ygrp-mlmsg * {
line-height: 1.22em;
}
#ygrp-mlmsg #logo {
padding-bottom: 10px;
}
#ygrp-msg p a {
font-family: Verdana;
}
#ygrp-msg p#attach-count span {
color: #1E66AE;
font-weight: 700;
}
#ygrp-reco #reco-head {
color: #ff7900;
font-weight: 700;
}
#ygrp-reco {
margin-bottom: 20px;
padding: 0px;
}
#ygrp-sponsor #ov li a {
font-size: 130%;
text-decoration: none;
}
#ygrp-sponsor #ov li {
font-size: 77%;
list-style-type: square;
padding: 6px 0;
}=20
#ygrp-sponsor #ov ul {
margin: 0;
padding: 0 0 0 8px;
}
#ygrp-text {
font-family: Georgia;
}
#ygrp-text p {
margin: 0 0 1em 0;
}
#ygrp-text tt {
font-size: 120%;
}
#ygrp-vital ul li:last-child {
border-right: none !important;=20
}=20
-->
</style>
</head>
<!--~-|**|PrettyHtmlEnd|**|-~-->
</html>
<!-- end group email -->
--001a114104a689ed7f0552834631--