(* Name: Kwadwo Amoako Sakyi Date: Friday October 4, 2009 *) type vector = float * float;; let (vec_zero:vector) = (0.0,0.0);; let vec_neg (v:vector) = (( ((fst v) *. (-1.)), ((snd v) *. (-1.)) ):vector);; let vec_mag (v:vector) = sqrt( ((fst v) *. (fst v)) +. ((snd v) *. (snd v)) );; let vec_add (v1:vector) (v2:vector) = (((fst v1 +. fst v2), (snd v1 +. snd v2)):vector);; let vec_sub (v1:vector) (v2:vector) = (((fst v1 -. fst v2), (snd v2 -. snd v2)):vector);; let vec_dist v1 v2 = vec_mag(vec_add v1 (vec_neg v2) );; (* helper function for romulus and remus; closer: vector -> vector -> vector -> vector returns the closer of vectors v1 and v2 to vx *) let closer vx v1 v2 = if ( (vec_dist vx v1) <= (vec_dist vx v2) ) then v1 else v2;; let romulus_iter x v = let len = List.length x in if len = 0 then vec_zero else let temp = ref (List.nth x 0) in for i = 0 to (len-1) do temp := closer v !temp (List.nth x i) done; !temp;; let rec romulus_rec x v = let closer vx v1 v2 = let a = vec_dist vx v1 in let b = vec_dist vx v2 in match a with c when c <= b -> v1 | _ -> v2 in match x with [] -> vec_zero | [x] -> x | h::t -> closer v h (romulus_rec t v);; (* Another version of romulus_rec *) let rec romulus_rec x v = let vec_dist v1 v2 = vec_mag(vec_add v1 (vec_neg v2) ) in let closer vx v1 v2 = let a = vec_dist vx v1 in let b = vec_dist vx v2 in match a with c when c <= b -> v1 | _ -> v2 in match x with [] -> vec_zero | [x] -> x | h::t -> closer v h (romulus_rec t v) ;; let remus_iter f n v = match n with x when x < 0 -> vec_zero | _ -> let closer vx v1 v2 = let a = vec_dist vx v1 in let b = vec_dist vx v2 in match a with c when c <= b -> v1 | _ -> v2 in let temp = ref (f 0) in for i = 0 to n do temp := closer v !temp (f i) done; !temp ;; let rec remus_rec f n v = match n with x when x < 0 -> vec_zero |0 -> (f 0) | _ -> let closer vx v1 v2 = let a = vec_dist vx v1 in let b = vec_dist vx v2 in match a with c when c < b -> v1 | _ -> v2 in closer v (f n) (remus_rec f (n-1) v) ;; (* print_vec function to print vectors has type. print_vec: vector->unit *) let print_vec (v:vector) = print_string( "(" ^ string_of_float(fst(v)) ^ "," ^ string_of_float(snd(v)) ^ ")" );; (* print_vec_list function prints a vector list *) let print_vec_list vl = let length = List.length vl in print_string "["; for i = 0 to (length-1) do print_vec (List.nth vl i); if i != (length-1) then print_string ";" else print_string ""; done; print_string "]" ;; (* vector Examples *) let (a:vector) = (1.,1.);; let (b:vector) = (9.,9.);; let (c:vector) = (3.,3.);; let (k:vector) = (20.,20.);; let (e:vector) = (0.,0.);; let (g:vector) = (5.,5.);; let (h:vector) = (6.,6.);; let (t:vector) = (0.5,0.5);; let (d:vector) = (11.,11.);; let (z:vector) = (18.,18.);; (* You can also declare a vector like this *) let l = ((8.0, 7.0):vector);; (* declaration of a list *) let vec_list = [a;b;h;c;k;e];; (* test function f for remus remus functions; f: int -> vector Defined here to return the ith vector in alist *) let f i = List.nth vec_list i;; (* Testings *) print_string("The zero vector: vec_zero ");; print_vec vec_zero;; print_endline" ";; print_string("vector a: ");; print_vec a;; print_endline" ";; print_string("vector b: ");; print_vec b;; print_endline" ";; print_string("vector c: ");; print_vec c;; print_endline" ";; print_string("vector d: ");; print_vec d;; print_endline" ";; print_string("vector k: ");; print_vec k;; print_endline" ";; print_string("vector g: ");; print_vec g;; print_endline" ";; print_string("vector h: ");; print_vec h;; print_endline" ";; print_string("vector z: ");; print_vec z;; print_endline" ";; print_string("vector l: ");; print_vec l;; print_endline" ";; print_string("vector t: ");; print_vec t;; print_endline" ";; print_string("Calling vec_neg a returns: ");; print_vec(vec_neg a);; print_endline" ";; print_string("Calling vec_neg b returns: ");; print_vec(vec_neg b);; print_endline" ";; print_string("Calling vec_mag a returns: ");; print_float(vec_mag a);; print_endline" ";; print_string("Calling vec_mag b returns: ");; print_float(vec_mag b);; print_endline" ";; print_string("Calling vec_add a b returns: ");; print_vec(vec_add a b);; print_endline" ";; print_string("Calling vec_add g h returns: ");; print_vec(vec_add g h);; print_endline" ";; print_string("vec_list contains vectors: vec_list = [a;b;h;c;k;e] ");; print_vec_list vec_list;; print_endline" ";; print_string("vector t: ");; print_vec t;; print_endline" ";; print_string("Testing romulus_iter vec_list t");; print_vec(romulus_iter vec_list t);; print_endline" ";; print_string("Testing romulus_rec vec_list t");; print_vec(romulus_rec vec_list t);; print_endline" ";; print_string("vec_list contains vectors: vec_list = [a;b;h;c;k;e] ");; print_vec_list vec_list;; print_endline" ";; print_string("vector c: ");; print_vec c;; print_endline" ";; print_string("Testing romulus_iter vec_list c");; print_vec(romulus_iter vec_list c);; print_endline" ";; print_string("Testing romulus_rec vec_list c");; print_vec(romulus_rec vec_list c);; print_endline" ";; print_string("vec_list contains vectors: vec_list = [a;b;h;c;k;e] ");; print_vec_list vec_list;; print_endline" ";; print_string("function f: int -> vector, calling f 2 returns");; print_vec(f 2);; print_endline" ";; print_string("vector k: ");; print_vec k;; print_endline" ";; print_string("vec_list contains vectors: vec_list = [a;b;h;c;k;e] ");; print_vec_list vec_list;; print_endline" ";; print_string("Testing remus_iter f vec_list k returns: ");; print_vec(remus_iter f 2 k);; print_endline" ";; print_string("Testing remus_rec f vec_list k returns: ");; print_vec(remus_rec f 2 k);; print_endline" ";; print_string("vector g: ");; print_vec g;; print_endline" ";; print_string("vec_list contains vectors: vec_list = [a;b;h;c;k;e] ");; print_vec_list vec_list;; print_endline" ";; print_string("Testing remus_iter f 4 g returns: ");; print_vec(remus_iter f 4 g);; print_endline" ";; print_string("Testing remus_rec f 4 g returns: ");; print_vec(remus_rec f 4 g);; print_endline" ";;