%// 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