packages feed

language-ats-1.0.2.0: test/data/fib-thm.out

// example from the book: http://ats-lang.sourceforge.net/EXAMPLE/EFFECTIVATS/PwTP-bool-vs-prop/main.html
#include "share/atspre_staload.hats"

staload "prelude/SATS/integer.sats"

infixr (->) ->>

stadef ->> (b1: bool, b2: bool) = ~b1 || b2

dataprop fib_p(int, int) =
  | fib_p_bas0(0, 0) of ()
  | fib_p_bas1(1, 1) of ()
  | {n:nat}{ r0, r1 : int } fib_p_ind2(n + 2, r0 + r1) of (fib_p( n
                                                                , r0
                                                                ), fib_p(n + 1, r1))

stacst fib_b : (int, int) -> bool

extern
praxi fib_b_bas0() : [fib_b(0,0)] unit_p

extern
praxi fib_b_bas1() : [fib_b(1,1)] unit_p

extern
praxi fib_b_ind2 {n:nat}{ r0, r1 : int } :
  [fib_b(n,r0) && fib_b(n+1,r1) ->> fib_b(n+2,r0+r1)] unit_p

fun f_fib_p {n:nat}(n : int(n)) : [r:int] (fib_p(n, r) | int(r)) =
  let
    fun loop { i : nat | i < n }{ r0, r1 : int }( pf0 : fib_p(i, r0)
                                                , pf1 : fib_p(i+1, r1)
                                                 | i : int(i), r0 : int(r0), r1 : int(r1)) :
      [r:int] (fib_p(n, r) | int(r)) =
      if i + 1 < n then
        loop(pf1, fib_p_ind2(pf0, pf1) | i + 1, r1, r0 + r1)
      else
        (pf1 | r1)
    
    prval pf0 = fib_p_bas0()
    prval pf1 = fib_p_bas1()
  in
    if n >= 1 then
      loop(pf0, pf1 | 0, 0, 1)
    else
      (pf0 | 0)
  end

implement main0 () =
  let
    val (_ | i) = f_fib_p(40)
  in
    println!(i)
  end