mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
Replace .dats and .sats samples with MIT alternatives
This commit is contained in:
294
samples/ATS/basis_ssntype.sats
Normal file
294
samples/ATS/basis_ssntype.sats
Normal file
@@ -0,0 +1,294 @@
|
|||||||
|
// Source: https://github.com/githwxi/ATS-Postiats-contrib/blob/201d635062d0ea64ff5ba5457a4ea0bb4d5ae202/contrib/libats-/hwxi/teaching/mysession-g/SATS/basis_ssntype.sats
|
||||||
|
|
||||||
|
(*
|
||||||
|
** Basis for g-session types
|
||||||
|
*)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
staload
|
||||||
|
"./basis_intset.sats"
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel_cap(): intGte(1)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
abstype
|
||||||
|
session_msg
|
||||||
|
(i:int, j:int, a:vt@ype)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
abstype ssession_nil
|
||||||
|
abstype ssession_cons(a:type, ssn:type)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
stadef msg = session_msg
|
||||||
|
//
|
||||||
|
stadef nil = ssession_nil
|
||||||
|
//
|
||||||
|
stadef :: = ssession_cons
|
||||||
|
stadef cons = ssession_cons
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
abstype
|
||||||
|
session_append
|
||||||
|
(ssn1: type, ssn2: type)
|
||||||
|
//
|
||||||
|
stadef append = session_append
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
abstype
|
||||||
|
session_choose
|
||||||
|
(
|
||||||
|
i:int, ssn1:type, ssn2:type
|
||||||
|
) (* session_choose *)
|
||||||
|
//
|
||||||
|
stadef choose = session_choose
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
abstype
|
||||||
|
session_repeat
|
||||||
|
(
|
||||||
|
i:int, ssn:type(*body*)
|
||||||
|
) (* session_repeat *)
|
||||||
|
//
|
||||||
|
stadef repeat = session_repeat
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
typedef
|
||||||
|
session_sing
|
||||||
|
(
|
||||||
|
i: int
|
||||||
|
, j: int
|
||||||
|
, a:vt@ype
|
||||||
|
) = cons(msg(i, j, a), nil)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
absvtype
|
||||||
|
channel1_vtype
|
||||||
|
(G:iset, n:int, ssn:type) = ptr
|
||||||
|
//
|
||||||
|
vtypedef
|
||||||
|
channel1
|
||||||
|
(G:iset, n:int, ssn:type) = channel1_vtype(G, n, ssn)
|
||||||
|
//
|
||||||
|
vtypedef
|
||||||
|
cchannel1
|
||||||
|
(G:iset, n:int, ssn:type) = channel1_vtype(ncomp(n, G), n, ssn)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_get_nrole
|
||||||
|
{n:int}{ssn:type}{G:iset}
|
||||||
|
(chan: !channel1(G, n, ssn)): int(n)
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_get_group
|
||||||
|
{n:int}{ssn:type}{G:iset}
|
||||||
|
(chan: !channel1(G, n, ssn)): intset(n,G)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun
|
||||||
|
{a:vt0p}
|
||||||
|
channel1_close
|
||||||
|
{n:int}{ssn:type}{G:iset}(chan: channel1(G, n, nil)): void
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_skipin
|
||||||
|
{a:vt0p}
|
||||||
|
{n:int}{ssn:type}{G:iset}
|
||||||
|
{i,j:nat | ismbr(G, i); ismbr(G, j)}
|
||||||
|
(
|
||||||
|
!channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn)
|
||||||
|
) : void // end-of-function
|
||||||
|
praxi
|
||||||
|
lemma_channel1_skipin
|
||||||
|
{a:vt0p}
|
||||||
|
{n:int}{ssn:type}{G:iset}
|
||||||
|
{i,j:nat | ismbr(G, i); ismbr(G, j)}
|
||||||
|
(
|
||||||
|
!channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn)
|
||||||
|
) : void // lemma_channel1_skipin
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_skipex
|
||||||
|
{a:vt0p}
|
||||||
|
{n:int}{ssn:type}{G:iset}
|
||||||
|
{i,j:nat | ~ismbr(G, i); ~ismbr(G, j)}
|
||||||
|
(
|
||||||
|
!channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn)
|
||||||
|
) : void // end-of-function
|
||||||
|
praxi
|
||||||
|
lemma_channel1_skipex
|
||||||
|
{a:vt0p}
|
||||||
|
{n:int}{ssn:type}{G:iset}
|
||||||
|
{i,j:nat | ~ismbr(G, i); ~ismbr(G, j)}
|
||||||
|
(
|
||||||
|
!channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn)
|
||||||
|
) : void // lemma_channel1_skipex
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun
|
||||||
|
{a:vt0p}
|
||||||
|
channel1_send
|
||||||
|
{n:int}{ssn:type}{G:iset}
|
||||||
|
{i,j:nat | i < n; j < n; ismbr(G, i); ~ismbr(G, j)}
|
||||||
|
(
|
||||||
|
!channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn), int(i), int(j), a
|
||||||
|
) : void // end of [channel1_send]
|
||||||
|
//
|
||||||
|
fun
|
||||||
|
{a:vt0p}
|
||||||
|
channel1_recv
|
||||||
|
{n:int}{ssn:type}{G:iset}
|
||||||
|
{i,j:nat | i < n; j < n; ~ismbr(G, i); ismbr(G, j)}
|
||||||
|
(
|
||||||
|
!channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn), int(i), int(j), &a? >> a
|
||||||
|
) : void // end of [channel1_recv]
|
||||||
|
//
|
||||||
|
fun
|
||||||
|
{a:vt0p}
|
||||||
|
channel1_recv_val
|
||||||
|
{n:int}{ssn:type}{G:iset}
|
||||||
|
{i,j:nat | i < n; j < n; ~ismbr(G, i); ismbr(G, j)}
|
||||||
|
(!channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn), int(i), int(j)): (a)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
fun{}
|
||||||
|
channel1_append
|
||||||
|
{n:int}
|
||||||
|
{ssn1,ssn2:type}
|
||||||
|
{G:iset}
|
||||||
|
(
|
||||||
|
chan: !channel1(G, n, append(ssn1, ssn2)) >> channel1(G, n, ssn2)
|
||||||
|
, fserv: (!channel1(G, n, ssn1) >> channel1(G, n, nil)) -<lincloptr1> void
|
||||||
|
) : void // end of [channel1_append]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
datatype
|
||||||
|
choosetag
|
||||||
|
(
|
||||||
|
a:type, b:type, c:type
|
||||||
|
) =
|
||||||
|
| choosetag_l(a, b, a) of ()
|
||||||
|
| choosetag_r(a, b, b) of ()
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_choose_l
|
||||||
|
{n:int}
|
||||||
|
{ssn1,ssn2:type}
|
||||||
|
{G:iset}
|
||||||
|
{i:nat | i < n; ismbr(G, i)}
|
||||||
|
(
|
||||||
|
!channel1(G, n, choose(i,ssn1,ssn2)) >> channel1(G, n, ssn1), i: int(i)
|
||||||
|
) : void // end of [channel1_choose_l]
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_choose_r
|
||||||
|
{n:int}
|
||||||
|
{ssn1,ssn2:type}
|
||||||
|
{G:iset}
|
||||||
|
{i:nat | i < n; ismbr(G, i)}
|
||||||
|
(
|
||||||
|
!channel1(G, n, choose(i,ssn1,ssn2)) >> channel1(G, n, ssn2), i: int(i)
|
||||||
|
) : void // end of [channel1_choose_r]
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_choose_tag
|
||||||
|
{n:int}
|
||||||
|
{ssn1,ssn2:type}
|
||||||
|
{G:iset}
|
||||||
|
{i:nat | i < n; ~isnil(G); ~ismbr(G, i)}
|
||||||
|
(
|
||||||
|
!channel1(G, n, choose(i,ssn1,ssn2)) >> channel1(G, n, ssn_chosen), i: int(i)
|
||||||
|
) : #[ssn_chosen:type] choosetag(ssn1, ssn2, ssn_chosen)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_repeat_0
|
||||||
|
{n:int}
|
||||||
|
{ssn:type}
|
||||||
|
{G:iset}
|
||||||
|
{i:nat | i < n; ismbr(G, i)}
|
||||||
|
(
|
||||||
|
!channel1(G, n, repeat(i,ssn)) >> channel1(G, n, nil), i: int(i)
|
||||||
|
) : void // end of [channel1_repeat_nil]
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_repeat_1
|
||||||
|
{n:int}
|
||||||
|
{ssn:type}
|
||||||
|
{G:iset}
|
||||||
|
{i:nat | i < n; ismbr(G, i)}
|
||||||
|
(
|
||||||
|
!channel1(G, n, repeat(i,ssn)) >> channel1(G, n, append(ssn,repeat(i,ssn))), i: int(i)
|
||||||
|
) : void // end of [channel1_repeat_more]
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_repeat_tag
|
||||||
|
{n:int}
|
||||||
|
{ssn:type}
|
||||||
|
{G:iset}
|
||||||
|
{i:nat | i < n; ~isnil(G); ~ismbr(G, i)}
|
||||||
|
(
|
||||||
|
!channel1(G, n, repeat(i,ssn)) >> channel1(G, n, ssn_chosen), i: int(i)
|
||||||
|
) : #[ssn_chosen:type] choosetag(nil, append(ssn,repeat(i,ssn)), ssn_chosen)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
(*
|
||||||
|
//
|
||||||
|
// HX-2015-03-06:
|
||||||
|
// This one does not work with sschoose!!!
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_link
|
||||||
|
{n:int}{ssn:type}
|
||||||
|
{G1,G2:iset | isnil(G1*G2)}
|
||||||
|
(channel1(G1, n, ssn), channel1(G2, n, ssn)): channel1(G1+G2, n, ssn)
|
||||||
|
*)
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_link
|
||||||
|
{n:int}{ssn:type}
|
||||||
|
{G1,G2:iset | isful(G1+G2,n)}
|
||||||
|
(channel1(G1, n, ssn), channel1(G2, n, ssn)): channel1(G1*G2, n, ssn)
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
channel1_link_elim
|
||||||
|
{n:int}{ssn:type}{G:iset}(channel1(G, n, ssn), cchannel1(G, n, ssn)): void
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
fun{}
|
||||||
|
cchannel1_create_exn
|
||||||
|
{n:nat}{ssn:type}{G:iset}
|
||||||
|
(
|
||||||
|
nrole: int(n), G: intset(n), fserv: channel1(G, n, ssn) -<lincloptr1> void
|
||||||
|
) : cchannel1(G, n, ssn) // end of [cchannel1_create_exn]
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
(* end of [basis_ssntype.sats] *)
|
||||||
694
samples/ATS/intinf_vt.dats
Normal file
694
samples/ATS/intinf_vt.dats
Normal file
@@ -0,0 +1,694 @@
|
|||||||
|
// Source: https://github.com/githwxi/ATS-Postiats-contrib/blob/04a984d9c08c1831f7dda8a05ce356db01f81850/contrib/libats-/hwxi/intinf/DATS/intinf_vt.dats
|
||||||
|
|
||||||
|
(***********************************************************************)
|
||||||
|
(* *)
|
||||||
|
(* ATS/contrib/atshwxi *)
|
||||||
|
(* *)
|
||||||
|
(***********************************************************************)
|
||||||
|
|
||||||
|
(*
|
||||||
|
** Copyright (C) 2013 Hongwei Xi, ATS Trustful Software, Inc.
|
||||||
|
**
|
||||||
|
** Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
** copy of this software and associated documentation files (the "Software"),
|
||||||
|
** to deal in the Software without restriction, including without limitation
|
||||||
|
** the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||||
|
** and/or sell copies of the Software, and to permit persons to whom the
|
||||||
|
** Software is furnished to do so, subject to the following stated conditions:
|
||||||
|
**
|
||||||
|
** The above copyright notice and this permission notice shall be included in
|
||||||
|
** all copies or substantial portions of the Software.
|
||||||
|
**
|
||||||
|
** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||||
|
** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
** FROM OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
** IN THE SOFTWARE.
|
||||||
|
*)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
// Author: Hongwei Xi
|
||||||
|
// Authoremail: hwxi AT gmail DOT com
|
||||||
|
// Start Time: April, 2013
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
#include
|
||||||
|
"share/atspre_define.hats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
staload
|
||||||
|
UN = "prelude/SATS/unsafe.sats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
staload
|
||||||
|
GMP = "{$LIBGMP}/SATS/gmp.sats"
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
vtypedef mpz = $GMP.mpz_vt0ype
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
staload "./../SATS/intinf.sats"
|
||||||
|
staload "./../SATS/intinf_vt.sats"
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
macdef i2u (x) = g1int2uint_int_uint (,(x))
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
local
|
||||||
|
|
||||||
|
assume
|
||||||
|
intinf_vtype
|
||||||
|
(i: int) = // HX: [i] is a fake
|
||||||
|
[l:addr] (mpz @ l, mfree_gc_v (l) | ptr l)
|
||||||
|
// end of [intinf_vtype]
|
||||||
|
|
||||||
|
in (* in of [local] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
intinf_make_int
|
||||||
|
(i) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val x = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init_set_int (!(x.2), i)
|
||||||
|
//
|
||||||
|
} (* end of [intinf_make_int] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
intinf_make_uint
|
||||||
|
(i) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val x = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init_set_uint (!(x.2), i)
|
||||||
|
//
|
||||||
|
} (* end of [intinf_make_uint] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
intinf_make_lint
|
||||||
|
(i) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val x = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init_set_lint (!(x.2), i)
|
||||||
|
//
|
||||||
|
} (* end of [intinf_make_lint] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
intinf_make_ulint
|
||||||
|
(i) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val x = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init_set_ulint (!(x.2), i)
|
||||||
|
//
|
||||||
|
} (* end of [intinf_make_ulint] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
intinf_free (x) = let
|
||||||
|
val (pfat, pfgc | p) = x
|
||||||
|
val () = $GMP.mpz_clear (!p) in ptr_free (pfgc, pfat | p)
|
||||||
|
end (* end of [intinf_free] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
intinf_get_int (x) = $GMP.mpz_get_int (!(x.2))
|
||||||
|
implement{}
|
||||||
|
intinf_get_lint (x) = $GMP.mpz_get_lint (!(x.2))
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
intinf_get_strptr
|
||||||
|
(x, base) = $GMP.mpz_get_str_null (base, !(x.2))
|
||||||
|
// end of [intinf_get_strptr]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
fprint_intinf_base
|
||||||
|
(out, x, base) = let
|
||||||
|
val nsz = $GMP.mpz_out_str (out, base, !(x.2))
|
||||||
|
in
|
||||||
|
//
|
||||||
|
if (nsz = 0) then
|
||||||
|
exit_errmsg (1, "libgmp/gmp: fprint_intinf_base")
|
||||||
|
// end of [if]
|
||||||
|
//
|
||||||
|
end (* fprint_intinf_base *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{
|
||||||
|
} neg_intinf0
|
||||||
|
(x) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val () = $GMP.mpz_neg (!(x.2))
|
||||||
|
//
|
||||||
|
} (* end of [neg_intinf0] *)
|
||||||
|
|
||||||
|
implement{
|
||||||
|
} neg_intinf1
|
||||||
|
(x) = (y) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val y = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init (!(y.2))
|
||||||
|
val () = $GMP.mpz_neg (!(y.2), !(x.2))
|
||||||
|
//
|
||||||
|
} (* end of [neg_intinf1] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{
|
||||||
|
} abs_intinf0
|
||||||
|
(x) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val () = $GMP.mpz_abs (!(x.2))
|
||||||
|
//
|
||||||
|
} (* end of [abs_intinf0] *)
|
||||||
|
|
||||||
|
implement{
|
||||||
|
} abs_intinf1
|
||||||
|
(x) = (y) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val y = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init (!(y.2))
|
||||||
|
val () = $GMP.mpz_abs (!(y.2), !(x.2))
|
||||||
|
//
|
||||||
|
} (* end of [abs_intinf1] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
succ_intinf0 (x) = add_intinf0_int (x, 1)
|
||||||
|
implement{}
|
||||||
|
succ_intinf1 (x) = add_intinf1_int (x, 1)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
pred_intinf0 (x) = sub_intinf0_int (x, 1)
|
||||||
|
implement{}
|
||||||
|
pred_intinf1 (x) = sub_intinf1_int (x, 1)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
add_intinf0_int
|
||||||
|
(x, y) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val () = $GMP.mpz_add2_int (!(x.2), y)
|
||||||
|
//
|
||||||
|
} (* end of [add_intinf0_int] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
add_intinf1_int
|
||||||
|
(x, y) = (z) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val z = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init (!(z.2))
|
||||||
|
val () = $GMP.mpz_add3_int (!(z.2), !(x.2), y)
|
||||||
|
//
|
||||||
|
} (* end of [add_intinf1_int] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
add_int_intinf0 (x, y) = add_intinf0_int (y, x)
|
||||||
|
implement{}
|
||||||
|
add_int_intinf1 (x, y) = add_intinf1_int (y, x)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
add_intinf0_intinf1
|
||||||
|
(x, y) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val () = $GMP.mpz_add2_mpz (!(x.2), !(y.2))
|
||||||
|
//
|
||||||
|
} (* end of [add_intinf0_intinf1] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
add_intinf1_intinf0
|
||||||
|
(x, y) = (y) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val () = $GMP.mpz_add2_mpz (!(y.2), !(x.2))
|
||||||
|
//
|
||||||
|
} (* end of [add_intinf1_intinf0] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
add_intinf1_intinf1
|
||||||
|
(x, y) = (z) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val z = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init (!(z.2))
|
||||||
|
val () = $GMP.mpz_add3_mpz (!(z.2), !(x.2), !(y.2))
|
||||||
|
//
|
||||||
|
} (* end of [add_intinf1_intinf1] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
sub_intinf0_int
|
||||||
|
(x, y) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val () = $GMP.mpz_sub2_int (!(x.2), y)
|
||||||
|
//
|
||||||
|
} (* end of [sub_intinf0_int] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
sub_intinf1_int
|
||||||
|
(x, y) = (z) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val z = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init (!(z.2))
|
||||||
|
val () = $GMP.mpz_sub3_int (!(z.2), !(x.2), y)
|
||||||
|
//
|
||||||
|
} (* end of [sub_intinf1_int] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
sub_int_intinf0 (x, y) = let
|
||||||
|
val z = sub_intinf0_int (y, x) in neg_intinf0 (z)
|
||||||
|
end (* end of [sub_int_intinf0] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
sub_int_intinf1 (x, y) = let
|
||||||
|
val z = sub_intinf1_int (y, x) in neg_intinf0 (z)
|
||||||
|
end (* end of [sub_int_intinf1] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
sub_intinf0_intinf1
|
||||||
|
(x, y) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val () = $GMP.mpz_sub2_mpz (!(x.2), !(y.2))
|
||||||
|
//
|
||||||
|
} (* end of [sub_intinf0_intinf1] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
sub_intinf1_intinf0
|
||||||
|
(x, y) = neg_intinf0 (sub_intinf0_intinf1 (y, x))
|
||||||
|
// end of [sub_intinf1_intinf0]
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
sub_intinf1_intinf1
|
||||||
|
(x, y) = (z) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val z = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init (!(z.2))
|
||||||
|
val () = $GMP.mpz_sub3_mpz (!(z.2), !(x.2), !(y.2))
|
||||||
|
//
|
||||||
|
} (* end of [sub_intinf1_intinf1] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
mul_intinf0_int
|
||||||
|
(x, y) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val () = $GMP.mpz_mul2_int (!(x.2), y)
|
||||||
|
//
|
||||||
|
} (* end of [mul_intinf0_int] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
mul_intinf1_int
|
||||||
|
(x, y) = (z) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val z = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init (!(z.2))
|
||||||
|
val () = $GMP.mpz_mul3_int (!(z.2), !(x.2), y)
|
||||||
|
//
|
||||||
|
} (* end of [mul_intinf1_int] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
mul_int_intinf0 (x, y) = mul_intinf0_int (y, x)
|
||||||
|
implement{}
|
||||||
|
mul_int_intinf1 (x, y) = mul_intinf1_int (y, x)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
mul_intinf0_intinf1
|
||||||
|
(x, y) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val () = $GMP.mpz_mul2_mpz (!(x.2), !(y.2))
|
||||||
|
//
|
||||||
|
} (* end of [mul_intinf0_intinf1] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
mul_intinf1_intinf0
|
||||||
|
(x, y) = (y) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val () = $GMP.mpz_mul2_mpz (!(y.2), !(x.2))
|
||||||
|
//
|
||||||
|
} (* end of [mul_intinf0_intinf1] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
mul_intinf1_intinf1
|
||||||
|
(x, y) = (z) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val z = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init (!(z.2))
|
||||||
|
val () = $GMP.mpz_mul3_mpz (!(z.2), !(x.2), !(y.2))
|
||||||
|
//
|
||||||
|
} (* end of [mul_intinf1_intinf1] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
div_intinf0_int
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
in
|
||||||
|
//
|
||||||
|
if y >= 0 then let
|
||||||
|
val () = $GMP.mpz_tdiv2_q_uint (!(x.2), i2u(y)) in x
|
||||||
|
end else let
|
||||||
|
val () = $GMP.mpz_tdiv2_q_uint (!(x.2), i2u(~y)) in neg_intinf0 (x)
|
||||||
|
end // end of [if]
|
||||||
|
//
|
||||||
|
end (* end of [div_intinf0_int] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
div_intinf1_int
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val z = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init (!(z.2))
|
||||||
|
//
|
||||||
|
in
|
||||||
|
//
|
||||||
|
if y >= 0 then let
|
||||||
|
val () = $GMP.mpz_tdiv3_q_uint (!(z.2), !(x.2), i2u(y)) in z
|
||||||
|
end else let
|
||||||
|
val () = $GMP.mpz_tdiv3_q_uint (!(z.2), !(x.2), i2u(~y)) in neg_intinf0 (z)
|
||||||
|
end // end of [if]
|
||||||
|
//
|
||||||
|
end (* end of [div_intinf1_int] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
div_intinf0_intinf1
|
||||||
|
(x, y) = (x) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val () = $GMP.mpz_tdiv2_q_mpz (!(x.2), !(y.2))
|
||||||
|
//
|
||||||
|
} (* end of [div_intinf0_intinf1] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
div_intinf1_intinf1
|
||||||
|
(x, y) = (z) where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val z = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init (!(z.2))
|
||||||
|
val () = $GMP.mpz_tdiv3_q_mpz (!(z.2), !(x.2), !(y.2))
|
||||||
|
//
|
||||||
|
} (* end of [div_intinf1_intinf1] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
ndiv_intinf0_int (x, y) = div_intinf0_int (x, y)
|
||||||
|
implement{}
|
||||||
|
ndiv_intinf1_int (x, y) = div_intinf1_int (x, y)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
nmod_intinf0_int
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val r =
|
||||||
|
$GMP.mpz_fdiv_uint (!(x.2), i2u(y))
|
||||||
|
val () = intinf_free (x)
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{intBtw(0,j)}(r)
|
||||||
|
end (* end of [nmod_intinf0_int] *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
nmod_intinf1_int
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val r = $GMP.mpz_fdiv_uint (!(x.2), i2u(y))
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{intBtw(0,j)}(r)
|
||||||
|
end (* end of [nmod_intinf1_int] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
//
|
||||||
|
// comparison-functions
|
||||||
|
//
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
lt_intinf_int
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_int (!(x.2), y)
|
||||||
|
val ans = (if sgn < 0 then true else false): bool
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{bool(i < j)}(sgn)
|
||||||
|
end // end of [lt_intinf_int]
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
lt_intinf_intinf
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))
|
||||||
|
val ans = (if sgn < 0 then true else false): bool
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{bool(i < j)}(sgn)
|
||||||
|
end // end of [lt_intinf_intinf]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
lte_intinf_int
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_int (!(x.2), y)
|
||||||
|
val ans = (if sgn <= 0 then true else false): bool
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{bool(i <= j)}(sgn)
|
||||||
|
end // end of [lte_intinf_int]
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
lte_intinf_intinf
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))
|
||||||
|
val ans = (if sgn <= 0 then true else false): bool
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{bool(i <= j)}(sgn)
|
||||||
|
end // end of [lte_intinf_intinf]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
gt_intinf_int
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_int (!(x.2), y)
|
||||||
|
val ans = (if sgn > 0 then true else false): bool
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{bool(i > j)}(sgn)
|
||||||
|
end // end of [gt_intinf_int]
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
gt_intinf_intinf
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))
|
||||||
|
val ans = (if sgn > 0 then true else false): bool
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{bool(i > j)}(sgn)
|
||||||
|
end // end of [gt_intinf_intinf]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
gte_intinf_int
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_int (!(x.2), y)
|
||||||
|
val ans = (if sgn >= 0 then true else false): bool
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{bool(i >= j)}(sgn)
|
||||||
|
end // end of [gte_intinf_int]
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
gte_intinf_intinf
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))
|
||||||
|
val ans = (if sgn >= 0 then true else false): bool
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{bool(i >= j)}(sgn)
|
||||||
|
end // end of [gte_intinf_intinf]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
eq_intinf_int
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_int (!(x.2), y)
|
||||||
|
val ans = (if sgn = 0 then true else false): bool
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{bool(i == j)}(sgn)
|
||||||
|
end // end of [eq_intinf_int]
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
eq_intinf_intinf
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))
|
||||||
|
val ans = (if sgn = 0 then true else false): bool
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{bool(i == j)}(sgn)
|
||||||
|
end // end of [eq_intinf_intinf]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
neq_intinf_int
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_int (!(x.2), y)
|
||||||
|
val ans = (if sgn != 0 then true else false): bool
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{bool(i != j)}(sgn)
|
||||||
|
end // end of [neq_intinf_int]
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
neq_intinf_intinf
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))
|
||||||
|
val ans = (if sgn != 0 then true else false): bool
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{bool(i != j)}(sgn)
|
||||||
|
end // end of [neq_intinf_intinf]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
compare_intinf_int
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_int (!(x.2), y)
|
||||||
|
val sgn = (if sgn < 0 then ~1 else (if sgn > 0 then 1 else 0)): int
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{int(sgn(i-j))}(sgn)
|
||||||
|
end // end of [compare_intinf_int]
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
compare_int_intinf
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_int (!(y.2), x)
|
||||||
|
val sgn = (if sgn > 0 then ~1 else (if sgn < 0 then 1 else 0)): int
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{int(sgn(i-j))}(sgn)
|
||||||
|
end // end of [compare_int_intinf]
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
compare_intinf_intinf
|
||||||
|
{i,j} (x, y) = let
|
||||||
|
//
|
||||||
|
val sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2))
|
||||||
|
val sgn = (if sgn < 0 then ~1 else (if sgn > 0 then 1 else 0)): int
|
||||||
|
//
|
||||||
|
in
|
||||||
|
$UN.cast{int(sgn(i-j))}(sgn)
|
||||||
|
end // end of [compare_intinf_intinf]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
pow_intinf_int
|
||||||
|
(base, exp) = r where
|
||||||
|
{
|
||||||
|
//
|
||||||
|
val r = ptr_alloc<mpz> ()
|
||||||
|
val () = $GMP.mpz_init (!(r.2))
|
||||||
|
val () = $GMP.mpz_pow_uint (!(r.2), !(base.2), i2u(exp))
|
||||||
|
//
|
||||||
|
} (* end of [pow_intinf_int] *)
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
end // end of [local]
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
implement{}
|
||||||
|
print_intinf (x) = fprint_intinf (stdout_ref, x)
|
||||||
|
implement{}
|
||||||
|
prerr_intinf (x) = fprint_intinf (stderr_ref, x)
|
||||||
|
implement{}
|
||||||
|
fprint_intinf (out, x) = fprint_intinf_base (out, x, 10(*base*))
|
||||||
|
|
||||||
|
(* ****** ****** *)
|
||||||
|
|
||||||
|
(* end of [intinf_vt.dats] *)
|
||||||
@@ -1,504 +0,0 @@
|
|||||||
(***********************************************************************)
|
|
||||||
(* *)
|
|
||||||
(* Applied Type System *)
|
|
||||||
(* *)
|
|
||||||
(***********************************************************************)
|
|
||||||
|
|
||||||
(*
|
|
||||||
** ATS/Postiats - Unleashing the Potential of Types!
|
|
||||||
** Copyright (C) 2011-2013 Hongwei Xi, ATS Trustful Software, Inc.
|
|
||||||
** All rights reserved
|
|
||||||
**
|
|
||||||
** ATS is free software; you can redistribute it and/or modify it under
|
|
||||||
** the terms of the GNU GENERAL PUBLIC LICENSE (GPL) as published by the
|
|
||||||
** Free Software Foundation; either version 3, or (at your option) any
|
|
||||||
** later version.
|
|
||||||
**
|
|
||||||
** ATS is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
||||||
** WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
** FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
** for more details.
|
|
||||||
**
|
|
||||||
** You should have received a copy of the GNU General Public License
|
|
||||||
** along with ATS; see the file COPYING. If not, please write to the
|
|
||||||
** Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
|
|
||||||
** 02110-1301, USA.
|
|
||||||
*)
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
(* Author: Hongwei Xi *)
|
|
||||||
(* Authoremail: hwxi AT cs DOT bu DOT edu *)
|
|
||||||
(* Start time: February, 2013 *)
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
//
|
|
||||||
// HX-2013-08:
|
|
||||||
// a set is represented as a sorted list in descending order;
|
|
||||||
// note that descending order is chosen to faciliate set comparison
|
|
||||||
//
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
staload
|
|
||||||
UN = "prelude/SATS/unsafe.sats"
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
staload "libats/SATS/linset_listord.sats"
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
#include "./SHARE/linset.hats" // code reuse
|
|
||||||
#include "./SHARE/linset_node.hats" // code reuse
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
assume
|
|
||||||
set_vtype (elt:t@ype) = List0_vt (elt)
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
implement{}
|
|
||||||
linset_nil () = list_vt_nil ()
|
|
||||||
implement{}
|
|
||||||
linset_make_nil () = list_vt_nil ()
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
implement
|
|
||||||
{a}(*tmp*)
|
|
||||||
linset_sing
|
|
||||||
(x) = list_vt_cons{a}(x, list_vt_nil)
|
|
||||||
// end of [linset_sing]
|
|
||||||
implement{a}
|
|
||||||
linset_make_sing
|
|
||||||
(x) = list_vt_cons{a}(x, list_vt_nil)
|
|
||||||
// end of [linset_make_sing]
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
implement{}
|
|
||||||
linset_is_nil (xs) = list_vt_is_nil (xs)
|
|
||||||
implement{}
|
|
||||||
linset_isnot_nil (xs) = list_vt_is_cons (xs)
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
implement{a}
|
|
||||||
linset_size (xs) =
|
|
||||||
let val n = list_vt_length(xs) in i2sz(n) end
|
|
||||||
// end of [linset_size]
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
implement{a}
|
|
||||||
linset_is_member
|
|
||||||
(xs, x0) = let
|
|
||||||
//
|
|
||||||
fun aux
|
|
||||||
{n:nat} .<n>.
|
|
||||||
(
|
|
||||||
xs: !list_vt (a, n)
|
|
||||||
) :<> bool = let
|
|
||||||
in
|
|
||||||
//
|
|
||||||
case+ xs of
|
|
||||||
| list_vt_cons (x, xs) => let
|
|
||||||
val sgn = compare_elt_elt<a> (x0, x) in
|
|
||||||
if sgn > 0 then false else (if sgn < 0 then aux (xs) else true)
|
|
||||||
end // end of [list_vt_cons]
|
|
||||||
| list_vt_nil ((*void*)) => false
|
|
||||||
//
|
|
||||||
end // end of [aux]
|
|
||||||
//
|
|
||||||
in
|
|
||||||
aux (xs)
|
|
||||||
end // end of [linset_is_member]
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
implement{a}
|
|
||||||
linset_copy (xs) = list_vt_copy<a> (xs)
|
|
||||||
implement{a}
|
|
||||||
linset_free (xs) = list_vt_free<a> (xs)
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
implement{a}
|
|
||||||
linset_insert
|
|
||||||
(xs, x0) = let
|
|
||||||
//
|
|
||||||
fun
|
|
||||||
mynode_cons
|
|
||||||
{n:nat} .<>.
|
|
||||||
(
|
|
||||||
nx: mynode1 (a), xs: list_vt (a, n)
|
|
||||||
) : list_vt (a, n+1) = let
|
|
||||||
//
|
|
||||||
val xs1 =
|
|
||||||
$UN.castvwtp0{List1_vt(a)}(nx)
|
|
||||||
val+@list_vt_cons (_, xs2) = xs1
|
|
||||||
prval () = $UN.cast2void (xs2); val () = (xs2 := xs)
|
|
||||||
//
|
|
||||||
in
|
|
||||||
fold@ (xs1); xs1
|
|
||||||
end // end of [mynode_cons]
|
|
||||||
//
|
|
||||||
fun ins
|
|
||||||
{n:nat} .<n>. // tail-recursive
|
|
||||||
(
|
|
||||||
xs: &list_vt (a, n) >> list_vt (a, n1)
|
|
||||||
) : #[n1:nat | n <= n1; n1 <= n+1] bool =
|
|
||||||
(
|
|
||||||
case+ xs of
|
|
||||||
| @list_vt_cons
|
|
||||||
(x, xs1) => let
|
|
||||||
val sgn =
|
|
||||||
compare_elt_elt<a> (x0, x)
|
|
||||||
// end of [val]
|
|
||||||
in
|
|
||||||
if sgn > 0 then let
|
|
||||||
prval () = fold@ (xs)
|
|
||||||
val nx = mynode_make_elt<a> (x0)
|
|
||||||
val ((*void*)) = xs := mynode_cons (nx, xs)
|
|
||||||
in
|
|
||||||
false
|
|
||||||
end else if sgn < 0 then let
|
|
||||||
val ans = ins (xs1)
|
|
||||||
prval () = fold@ (xs)
|
|
||||||
in
|
|
||||||
ans
|
|
||||||
end else let // [x0] is found
|
|
||||||
prval () = fold@ (xs)
|
|
||||||
in
|
|
||||||
true (* [x0] in [xs] *)
|
|
||||||
end (* end of [if] *)
|
|
||||||
end // end of [list_vt_cons]
|
|
||||||
| list_vt_nil () => let
|
|
||||||
val nx = mynode_make_elt<a> (x0)
|
|
||||||
val ((*void*)) = xs := mynode_cons (nx, xs)
|
|
||||||
in
|
|
||||||
false
|
|
||||||
end // end of [list_vt_nil]
|
|
||||||
) (* end of [ins] *)
|
|
||||||
//
|
|
||||||
in
|
|
||||||
$effmask_all (ins (xs))
|
|
||||||
end // end of [linset_insert]
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
(*
|
|
||||||
//
|
|
||||||
HX-2013-08:
|
|
||||||
[linset_remove] moved up
|
|
||||||
//
|
|
||||||
implement{a}
|
|
||||||
linset_remove
|
|
||||||
(xs, x0) = let
|
|
||||||
//
|
|
||||||
fun rem
|
|
||||||
{n:nat} .<n>. // tail-recursive
|
|
||||||
(
|
|
||||||
xs: &list_vt (a, n) >> list_vt (a, n1)
|
|
||||||
) : #[n1:nat | n1 <= n; n <= n1+1] bool =
|
|
||||||
(
|
|
||||||
case+ xs of
|
|
||||||
| @list_vt_cons
|
|
||||||
(x, xs1) => let
|
|
||||||
val sgn =
|
|
||||||
compare_elt_elt<a> (x0, x)
|
|
||||||
// end of [val]
|
|
||||||
in
|
|
||||||
if sgn > 0 then let
|
|
||||||
prval () = fold@ (xs)
|
|
||||||
in
|
|
||||||
false
|
|
||||||
end else if sgn < 0 then let
|
|
||||||
val ans = rem (xs1)
|
|
||||||
prval () = fold@ (xs)
|
|
||||||
in
|
|
||||||
ans
|
|
||||||
end else let // x0 = x
|
|
||||||
val xs1_ = xs1
|
|
||||||
val ((*void*)) = free@{a}{0}(xs)
|
|
||||||
val () = xs := xs1_
|
|
||||||
in
|
|
||||||
true // [x0] in [xs]
|
|
||||||
end (* end of [if] *)
|
|
||||||
end // end of [list_vt_cons]
|
|
||||||
| list_vt_nil () => false
|
|
||||||
) (* end of [rem] *)
|
|
||||||
//
|
|
||||||
in
|
|
||||||
$effmask_all (rem (xs))
|
|
||||||
end // end of [linset_remove]
|
|
||||||
*)
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
(*
|
|
||||||
** By Brandon Barker
|
|
||||||
*)
|
|
||||||
implement
|
|
||||||
{a}(*tmp*)
|
|
||||||
linset_choose
|
|
||||||
(xs, x0) = let
|
|
||||||
in
|
|
||||||
//
|
|
||||||
case+ xs of
|
|
||||||
| list_vt_cons
|
|
||||||
(x, xs1) => let
|
|
||||||
val () = x0 := x
|
|
||||||
prval () = opt_some{a}(x0)
|
|
||||||
in
|
|
||||||
true
|
|
||||||
end // end of [list_vt_cons]
|
|
||||||
| list_vt_nil () => let
|
|
||||||
prval () = opt_none{a}(x0)
|
|
||||||
in
|
|
||||||
false
|
|
||||||
end // end of [list_vt_nil]
|
|
||||||
//
|
|
||||||
end // end of [linset_choose]
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
implement
|
|
||||||
{a}{env}
|
|
||||||
linset_foreach_env (xs, env) = let
|
|
||||||
//
|
|
||||||
implement
|
|
||||||
list_vt_foreach$fwork<a><env>
|
|
||||||
(x, env) = linset_foreach$fwork<a><env> (x, env)
|
|
||||||
//
|
|
||||||
in
|
|
||||||
list_vt_foreach_env<a><env> (xs, env)
|
|
||||||
end // end of [linset_foreach_env]
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
implement{a}
|
|
||||||
linset_listize (xs) = xs
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
implement{a}
|
|
||||||
linset_listize1 (xs) = list_vt_copy (xs)
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
//
|
|
||||||
// HX: functions for processing mynodes
|
|
||||||
//
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
implement{
|
|
||||||
} mynode_null{a} () =
|
|
||||||
$UN.castvwtp0{mynode(a,null)}(the_null_ptr)
|
|
||||||
// end of [mynode_null]
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
implement
|
|
||||||
{a}(*tmp*)
|
|
||||||
mynode_make_elt
|
|
||||||
(x) = let
|
|
||||||
//
|
|
||||||
val nx = list_vt_cons{a}{0}(x, _ )
|
|
||||||
//
|
|
||||||
in
|
|
||||||
$UN.castvwtp0{mynode1(a)}(nx)
|
|
||||||
end // end of [mynode_make_elt]
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
implement{
|
|
||||||
} mynode_free
|
|
||||||
{a}(nx) = () where {
|
|
||||||
val nx =
|
|
||||||
$UN.castvwtp0{List1_vt(a)}(nx)
|
|
||||||
//
|
|
||||||
val+~list_vt_cons (_, nx2) = nx
|
|
||||||
//
|
|
||||||
prval ((*void*)) = $UN.cast2void (nx2)
|
|
||||||
//
|
|
||||||
} (* end of [mynode_free] *)
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
implement
|
|
||||||
{a}(*tmp*)
|
|
||||||
mynode_get_elt
|
|
||||||
(nx) = (x) where {
|
|
||||||
//
|
|
||||||
val nx1 =
|
|
||||||
$UN.castvwtp1{List1_vt(a)}(nx)
|
|
||||||
//
|
|
||||||
val+list_vt_cons (x, _) = nx1
|
|
||||||
//
|
|
||||||
prval ((*void*)) = $UN.cast2void (nx1)
|
|
||||||
//
|
|
||||||
} (* end of [mynode_get_elt] *)
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
implement
|
|
||||||
{a}(*tmp*)
|
|
||||||
mynode_set_elt
|
|
||||||
{l} (nx, x0) =
|
|
||||||
{
|
|
||||||
//
|
|
||||||
val nx1 =
|
|
||||||
$UN.castvwtp1{List1_vt(a)}(nx)
|
|
||||||
//
|
|
||||||
val+@list_vt_cons (x, _) = nx1
|
|
||||||
//
|
|
||||||
val () = x := x0
|
|
||||||
//
|
|
||||||
prval () = fold@ (nx1)
|
|
||||||
prval () = $UN.cast2void (nx1)
|
|
||||||
//
|
|
||||||
prval () = __assert (nx) where
|
|
||||||
{
|
|
||||||
extern praxi __assert (nx: !mynode(a?, l) >> mynode (a, l)): void
|
|
||||||
} (* end of [prval] *)
|
|
||||||
//
|
|
||||||
} (* end of [mynode_set_elt] *)
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
implement
|
|
||||||
{a}(*tmp*)
|
|
||||||
mynode_getfree_elt
|
|
||||||
(nx) = (x) where {
|
|
||||||
//
|
|
||||||
val nx =
|
|
||||||
$UN.castvwtp0{List1_vt(a)}(nx)
|
|
||||||
//
|
|
||||||
val+~list_vt_cons (x, nx2) = nx
|
|
||||||
//
|
|
||||||
prval ((*void*)) = $UN.cast2void (nx2)
|
|
||||||
//
|
|
||||||
} (* end of [mynode_getfree_elt] *)
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
(*
|
|
||||||
fun{a:t0p}
|
|
||||||
linset_takeout_ngc
|
|
||||||
(set: &set(INV(a)) >> _, x0: a):<!wrt> mynode0 (a)
|
|
||||||
// end of [linset_takeout_ngc]
|
|
||||||
*)
|
|
||||||
implement
|
|
||||||
{a}(*tmp*)
|
|
||||||
linset_takeout_ngc
|
|
||||||
(set, x0) = let
|
|
||||||
//
|
|
||||||
fun takeout
|
|
||||||
(
|
|
||||||
xs: &List0_vt (a) >> _
|
|
||||||
) : mynode0(a) = let
|
|
||||||
in
|
|
||||||
//
|
|
||||||
case+ xs of
|
|
||||||
| @list_vt_cons
|
|
||||||
(x, xs1) => let
|
|
||||||
prval pf_x = view@x
|
|
||||||
prval pf_xs1 = view@xs1
|
|
||||||
val sgn =
|
|
||||||
compare_elt_elt<a> (x0, x)
|
|
||||||
// end of [val]
|
|
||||||
in
|
|
||||||
if sgn > 0 then let
|
|
||||||
prval () = fold@ (xs)
|
|
||||||
in
|
|
||||||
mynode_null{a}((*void*))
|
|
||||||
end else if sgn < 0 then let
|
|
||||||
val res = takeout (xs1)
|
|
||||||
prval ((*void*)) = fold@ (xs)
|
|
||||||
in
|
|
||||||
res
|
|
||||||
end else let // x0 = x
|
|
||||||
val xs1_ = xs1
|
|
||||||
val res = $UN.castvwtp0{mynode1(a)}((pf_x, pf_xs1 | xs))
|
|
||||||
val () = xs := xs1_
|
|
||||||
in
|
|
||||||
res // [x0] in [xs]
|
|
||||||
end (* end of [if] *)
|
|
||||||
end // end of [list_vt_cons]
|
|
||||||
| list_vt_nil () => mynode_null{a}((*void*))
|
|
||||||
//
|
|
||||||
end (* end of [takeout] *)
|
|
||||||
//
|
|
||||||
in
|
|
||||||
$effmask_all (takeout (set))
|
|
||||||
end // end of [linset_takeout_ngc]
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
implement
|
|
||||||
{a}(*tmp*)
|
|
||||||
linset_takeoutmax_ngc
|
|
||||||
(xs) = let
|
|
||||||
in
|
|
||||||
//
|
|
||||||
case+ xs of
|
|
||||||
| @list_vt_cons
|
|
||||||
(x, xs1) => let
|
|
||||||
prval pf_x = view@x
|
|
||||||
prval pf_xs1 = view@xs1
|
|
||||||
val xs_ = xs
|
|
||||||
val () = xs := xs1
|
|
||||||
in
|
|
||||||
$UN.castvwtp0{mynode1(a)}((pf_x, pf_xs1 | xs_))
|
|
||||||
end // end of [list_vt_cons]
|
|
||||||
| @list_vt_nil () => let
|
|
||||||
prval () = fold@ (xs)
|
|
||||||
in
|
|
||||||
mynode_null{a}((*void*))
|
|
||||||
end // end of [list_vt_nil]
|
|
||||||
//
|
|
||||||
end // end of [linset_takeoutmax_ngc]
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
implement
|
|
||||||
{a}(*tmp*)
|
|
||||||
linset_takeoutmin_ngc
|
|
||||||
(xs) = let
|
|
||||||
//
|
|
||||||
fun unsnoc
|
|
||||||
{n:pos} .<n>.
|
|
||||||
(
|
|
||||||
xs: &list_vt (a, n) >> list_vt (a, n-1)
|
|
||||||
) :<!wrt> mynode1 (a) = let
|
|
||||||
//
|
|
||||||
val+@list_vt_cons (x, xs1) = xs
|
|
||||||
//
|
|
||||||
prval pf_x = view@x and pf_xs1 = view@xs1
|
|
||||||
//
|
|
||||||
in
|
|
||||||
//
|
|
||||||
case+ xs1 of
|
|
||||||
| list_vt_cons _ =>
|
|
||||||
let val res = unsnoc(xs1) in fold@xs; res end
|
|
||||||
// end of [list_vt_cons]
|
|
||||||
| list_vt_nil () => let
|
|
||||||
val xs_ = xs
|
|
||||||
val () = xs := list_vt_nil{a}()
|
|
||||||
in
|
|
||||||
$UN.castvwtp0{mynode1(a)}((pf_x, pf_xs1 | xs_))
|
|
||||||
end // end of [list_vt_nil]
|
|
||||||
//
|
|
||||||
end // end of [unsnoc]
|
|
||||||
//
|
|
||||||
in
|
|
||||||
//
|
|
||||||
case+ xs of
|
|
||||||
| list_vt_cons _ => unsnoc (xs)
|
|
||||||
| list_vt_nil () => mynode_null{a}((*void*))
|
|
||||||
//
|
|
||||||
end // end of [linset_takeoutmin_ngc]
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
(* end of [linset_listord.dats] *)
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
(***********************************************************************)
|
|
||||||
(* *)
|
|
||||||
(* Applied Type System *)
|
|
||||||
(* *)
|
|
||||||
(***********************************************************************)
|
|
||||||
|
|
||||||
(*
|
|
||||||
** ATS/Postiats - Unleashing the Potential of Types!
|
|
||||||
** Copyright (C) 2011-2013 Hongwei Xi, ATS Trustful Software, Inc.
|
|
||||||
** All rights reserved
|
|
||||||
**
|
|
||||||
** ATS is free software; you can redistribute it and/or modify it under
|
|
||||||
** the terms of the GNU GENERAL PUBLIC LICENSE (GPL) as published by the
|
|
||||||
** Free Software Foundation; either version 3, or (at your option) any
|
|
||||||
** later version.
|
|
||||||
**
|
|
||||||
** ATS is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
||||||
** WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
** FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
** for more details.
|
|
||||||
**
|
|
||||||
** You should have received a copy of the GNU General Public License
|
|
||||||
** along with ATS; see the file COPYING. If not, please write to the
|
|
||||||
** Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
|
|
||||||
** 02110-1301, USA.
|
|
||||||
*)
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
//
|
|
||||||
// Author: Hongwei Xi
|
|
||||||
// Authoremail: hwxiATcsDOTbuDOTedu
|
|
||||||
// Time: October, 2010
|
|
||||||
//
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
#define ATS_PACKNAME "ATSLIB.libats.linset_listord"
|
|
||||||
#define ATS_STALOADFLAG 0 // no static loading at run-time
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
#include "./SHARE/linset.hats"
|
|
||||||
#include "./SHARE/linset_node.hats"
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
castfn
|
|
||||||
linset2list {a:t0p} (xs: set (INV(a))):<> List0_vt (a)
|
|
||||||
|
|
||||||
(* ****** ****** *)
|
|
||||||
|
|
||||||
(* end of [linset_listord.sats] *)
|
|
||||||
Reference in New Issue
Block a user