#!vsl

// $Id: math,v 1.1.1.1 1995/05/01 15:48:50 zeller Exp $
// a few math demos

// $Log: math,v $
# Revision 1.1.1.1  1995/05/01  15:48:50  zeller
# DDD 0.9 distribution
#
// Revision 9.3  1993/06/25  12:01:47  zeller
// Fix: Kommentare Log-Datei angepasst
//
// Revision 9.2  1993/05/22  20:22:40  zeller
// %Q% added by apply-q-flag.sh 1.5
//
// Revision 9.1  1991/07/08  06:01:53  zeller
// Installierte Version
// 
// Revision 8.1  1991/07/06  15:04:55  zeller
// Installierte Version
// 
// Revision 4.1  1991/05/25  12:52:41  zeller
// Neue Version mit folgenden Eigenschaften:
// Let- und Where-Konstrukten;
// Lokalen und globalen Funktionen, Overloading;
// Erweiterten Fehlermeldungen.
// 
// Revision 3.1  1991/02/27  02:11:11  zeller
// Umstellung auf neue Syntax (fast ganz wieder die alte)
// 
// Revision 1.5  1991/02/10  18:25:23  zeller
// Letzte Definition muss global sein, um nicht geloescht zu werden
// 
// Revision 1.4  1991/02/04  20:20:45  zeller
// digit(), num() jetzt in std.vsl
// 
// Revision 1.3  1991/01/23  19:21:03  zeller
// Umstellung auf Pattern-Matching
// 
// Revision 1.2  1991/01/23  18:18:54  zeller
// fak() mit Matching auf Konstanten neu definiert
// 
// Revision 1.1  1991/01/23  18:12:09  zeller
// Initial revision
// 

#include <std.vsl>

start = 0;
end = 12;

// factorial
fak(0) = 1;
fak(1) = 1;
fak(a) = a * fak(a-1);

// list of factorials
faks(end) = 0;
faks(a) = 
  num(a) & "! = " & num(fak(a))
| faks(a + 1);
faks() = faks(start);

// powers
power(a, 0) = 1;
power(a, 1) = a;
power(a, b) = a * power(a, b-1);

// list of powers
powers(end, b) = 0;
powers(a, b) = 
  num(a) & "^" & num(b) & " = " & num(power(a, b))
| powers(a + 1, b);
powers(b) = powers(start, b);

math_main() = 
	" " & faks() & " " & powers(2) & " " & powers(3) & " " & powers(4);
math_main(...) -> math_main();
