// // // This file is for Assignment 4, BU CAS CS 520, Fall, 2010 // // (* ****** ****** *) // // An implementation of random-access list based on nested datatypes // (* ****** ****** *) typedef P (a:t@ype) (b:t@ype) = '(a, b) datatype ralist (a:t@ype+, int) = | RAnil (a, 0) | RAone (a, 1) of a | {n:pos} RAevn (a, n+n) of ralist (P a a, n) | {n:pos} RAodd (a, n+n+1) of (a, ralist (P a a, n)) // end of [ralist] (* ****** ****** *) (* example *) fun{a:t@ype} ralist_last {n:pos} (xs: ralist (a, n)):<> a (* ****** ****** *) (* 10 points *) fun{a:t@ype} ralist_length {n:nat} (xs: ralist (a, n)):<> int n (* 5 points *) fun{a:t@ype} ralist_head {n:pos} (xs: ralist (a, n)):<> a (* 5 points *) fun{a:t@ype} ralist_tail {n:pos} (xs: ralist (a, n)):<> ralist (a, n-1) (* 5 points *) fun{a:t@ype} ralist_cons {n:nat} (x: a, xs: ralist (a, n)):<> ralist (a, n+1) (* 5 points *) fun{a:t@ype} ralist_uncons {n:pos} (xs: ralist (a, n), x: &a? >> a):<> ralist (a, n-1) (* 20 points *) fun{a:t@ype} ralist_lookup {n,i:nat | i < n} (xs: ralist (a, n), i: int i):<> a (* 20 points *) fun{a:t@ype} ralist_update {n,i:nat | i < n} (xs: ralist (a, n), i: int i, x: a):<> ralist (a, n) (* ****** ****** *) (* end of [ralist.sats] *)