84 lines
1.7 KiB
Plaintext
84 lines
1.7 KiB
Plaintext
(* ****** ****** *)
|
|
//
|
|
#include
|
|
"share/atspre_define.hats" // defines some names
|
|
#include
|
|
"share/atspre_staload.hats" // for targeting C
|
|
#include
|
|
"share/HATS/atspre_staload_libats_ML.hats" // for ...
|
|
//
|
|
(* ****** ****** *)
|
|
//
|
|
extern
|
|
fun
|
|
Power_set(xs: list0(int)): void
|
|
//
|
|
(* ****** ****** *)
|
|
|
|
// Helper: fast power function.
|
|
fun power(n: int, p: int): int =
|
|
if p = 1 then n
|
|
else if p = 0 then 1
|
|
else if p % 2 = 0 then power(n*n, p/2)
|
|
else n * power(n, p-1)
|
|
|
|
fun print_list(list: list0(int)): void =
|
|
case+ list of
|
|
| nil0() => println!(" ")
|
|
| cons0(car, crd) =>
|
|
let
|
|
val () = begin print car; print ','; end
|
|
val () = print_list(crd)
|
|
in
|
|
end
|
|
|
|
fun get_list_length(list: list0(int), length: int): int =
|
|
case+ list of
|
|
| nil0() => length
|
|
| cons0(car, crd) => get_list_length(crd, length+1)
|
|
|
|
|
|
fun get_list_from_bit_mask(mask: int, list: list0(int), result: list0(int)): list0(int) =
|
|
if mask = 0 then result
|
|
else
|
|
case+ list of
|
|
| nil0() => result
|
|
| cons0(car, crd) =>
|
|
let
|
|
val current: int = mask % 2
|
|
in
|
|
if current = 0 then
|
|
get_list_from_bit_mask(mask >> 1, crd, result)
|
|
else
|
|
get_list_from_bit_mask(mask >> 1, crd, list0_cons(car, result))
|
|
end
|
|
|
|
|
|
implement
|
|
Power_set(xs) = let
|
|
val len: int = get_list_length(xs, 0)
|
|
val pow: int = power(2, len)
|
|
fun loop(mask: int, list: list0(int)): void =
|
|
if mask > 0 && mask >= pow then ()
|
|
else
|
|
let
|
|
val () = print_list(get_list_from_bit_mask(mask, list, list0_nil()))
|
|
in
|
|
loop(mask+1, list)
|
|
end
|
|
in
|
|
loop(0, xs)
|
|
end
|
|
|
|
(* ****** ****** *)
|
|
|
|
implement
|
|
main0() =
|
|
let
|
|
val xs: list0(int) = cons0(1, list0_pair(2, 3))
|
|
in
|
|
Power_set(xs)
|
|
end (* end of [main0] *)
|
|
|
|
(* ****** ****** *)
|