%// This example computes n-th fib number using the ATerm library.
%// You will need to install this library before running it.
%// The ATerm library can be found at:
%// http://www.cwi.nl/projects/MetaEnv/aterm/

%{
#include<stdio.h>

#include <aterm1.h>
#include <aterm2.h>

static AFun f_zero;
static AFun f_suc;
static AFun f_plus;
static AFun f_fib;

ATerm zero;
ATerm suc(ATerm x) { return((ATerm) ATmakeAppl1(f_suc, x)); }

%}

%GET_FUN_SYM<ATerm>(xx) (ATgetAFun(xx))
%GET_SUBTERM<ATerm>(xx,n) (ATgetArgument(xx,n))

%sym ATerm zero                         % f_zero
%sym ATerm suc(ATerm)                   % f_suc
%sym ATerm plus(ATerm, ATerm)           % f_plus
%sym ATerm fib(ATerm)                   % f_fib

%var ATerm x, y, z;

%rule plus(x, zero)     %--> return(x);
%rule plus(x, suc(y))   %--> return(suc(plus(x,y)));

%rule fib(zero)         %--> return(suc(zero));
%rule fib(suc(zero))    %--> return(suc(zero));
%rule fib(suc(suc(x)))  %--> return(plus(fib(x),fib(suc(x))));

%%

static void symbolicFib( int n ) {
  int i;
  ATerm t,res;
  t = zero;
  for(i=0; i<n; i++) t = suc(t);
	res = fib(t);
  ATprintf("fib %d == %t\n", n, res);
  fflush(stdout);
}


int main(int argc, char **argv) {
  	ATerm     bottomOfStack;
  	/*  Initialise the ATerm bits & pieces  */
  	ATinit(argc, argv, &bottomOfStack);

	f_zero = ATmakeAFun("zero", 0, ATfalse);
	f_suc  = ATmakeAFun("suc", 1, ATfalse);
	f_fib  = ATmakeAFun("fib", 1, ATfalse);
	f_plus  = ATmakeAFun("plus", 2, ATfalse);

	ATprotectAFun(f_zero);
	ATprotectAFun(f_suc);
	ATprotectAFun(f_fib);
	ATprotectAFun(f_plus);

	zero = (ATerm) ATmakeAppl0(f_zero);

	symbolicFib(2);
	symbolicFib(3);
	symbolicFib(4);
	symbolicFib(5);
	symbolicFib(8);
	symbolicFib(10);
	return(0);
}




Last modified: Mon Dec 11 17:27:39 MET 2000