Eq-1.1.1: Language/Eq/BaseLibrary.hs
{-# LANGUAGE QuasiQuotes #-}
module Language.Eq.BaseLibrary( defaultSymbolTable ) where
import Language.Eq.Quasiquote
import Language.Eq.Types
import Language.Eq.Renderer.Ascii()
import qualified Data.Map as M
defaultSymbolTable :: M.Map String (Formula ListForm)
defaultSymbolTable = M.fromList [eqDefs|
-- derivaten( function, var, order )
derivaten( f, var, 0 ) :> f;
derivaten( f, var, 1 ) :> derivate( {f}, {var} );
derivaten( f, var, n ) :> derivate( {derivaten( f, var, n-1 )}
, {var} );
-- if( condition (boolean), then, else )
if( true, a, b ) :> a;
if( false, a, b ) :> b;
if( otherwise, a, b ) :> undefined;
-- map( a -> b, [a] )
map( f, [] ) :> [];
map( f, x :: xs ) :> {f}( x ) :: map( {f}, xs );
map( f, otherwise ) :> undefined;
-- foldl( function :: acc -> elem -> acc, accumulator, list )
foldl( f, acc, [] ) :> acc;
foldl( f, acc, x :: xs ) :> foldl( f, f( acc, x ), xs );
foldl( a, b, c ) :> undefined;
-- foldr( function :: acc -> elem -> acc , accumulator, list )
foldr( f, acc, [] ) :> acc;
foldr( f, acc, x :: xs ) :> f( foldr( f, acc, xs ), x );
foldr( a, b, c ) :> undefined;
-- zip :: ( [a], [b] ) -> [[a, b]]
zip( [], a ) :> [];
zip( b, []) :> [];
zip( x :: xs, y :: ys ) :> [x, y] :: zip( xs, ys );
-- replicate :: Int -> a -> [a]
replicate(0, a) :> [];
replicate(n, a) :> a :: replicate(n - 1, a);
-- just to provide a function englobing list appending
-- operator
cons( a, b ) :> b :: a;
-- list reversal.
reverse( lst ) :> foldl( cons, [], lst );
-- concatenate two lists.
concat( [], y ) :> y;
concat( x, [] ) :> x;
concat( x :: xs, y ) :> x :: concat( xs, y );
concat( a, b ) :> undefined;
-- Filtering function, remove un-needed stuff
filter( pred, [] ) :> [];
filter( pred, x :: xs ) :> concat( if( pred( x ), [x], [])
, filter( pred, xs ) );
filter( a, b ) :> undefined;
listFromTo( a, a ) :> [a];
listFromTo( a, b ) :> a :: listFromTo( a + 1, b );
listFromToBy( a, by, a ) :> [a];
listFromToBy( a, by, maxi ) :> a :: listFromToBy( a + by, by, maxi );
lengthIntern( acc, [] ) :> acc;
lengthIntern( acc, x :: xs ) :> lengthIntern( acc + 1, xs );
lengthIntern( a, b ) :> undefined;
-- length
length( lst ) :> lengthIntern( 0, lst );
-- well, a max function
max( a, b ) :> if( a > b, a, b );
-- well, a min function
min( a, b ) :> if( a < b, a, b );
-- provide equality when everything else is undefined :-P
eq( a, a ) :> true;
eq( a, b ) :> false;
-- generateMatrix :: ((i, j) -> a, Int, Int) -> [[a]]
generateMatrix( f, width, height ) :> matrix(
map( Lambda( lineId
, map( Lambda( col, {f}({lineId}, {col}))
, {listFromTo(0, {width} - 1)}))
, listFromTo(0, height - 1)
)
);
transpose(m) :>
generateMatrix( Lambda(line, col, {m} _ (col + 1) _ (line + 1))
, matrixHeight(m), matrixWidth(m) );
-- modintern( n<p, rest, module )
modintern( true, rest, num ) :> rest;
modintern( false, rest, num ) :> modintern( rest - num < num, rest - num, num );
-- give the value of n modulo p
modulo( n, p ) :> modintern( n < p, n, p );
-- taylor( function (as a lambda!!), derivation var, onVar, order )
taylorin( f, var, a, 0 ) :> f(a);
taylorin( f, var, a, n ) :> taylorin( f, var, a, n - 1 )
+ (derivaten(f, var, {n}))( a ) / n! * (x - a) ^ n;
-- taylor( formula, derivation var, onVar, order )
taylor( f, var, a, n ) :>
Sort( Cleanup( taylorin( Lambda( {var}, {f} )
, var, a, n )))
|]