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