WeberLogic
Logic interpreter and parsing library
Install
cabal update
cabal install WeberLogic
Interpreter
$ ./WeberLogic
Enter Command
> truthTable: a&b+c->~a&b
'a' 'b' 'c' | (((a&b)+c)->(~a&b))
True True True | False
True True False | False
True False True | False
True False False | True
False True True | True
False True False | True
False False True | False
False False False | True
Enter Command
> toNand: a&b->c
(((((a|b)|(a|b))|((a|b)|(a|b)))|(((a|b)|(a|b))|((a|b)|(a|b))))|(c|c))
Enter Command
> toNor: a&b->c
(((((a/a)/(b/b))/((a/a)/(b/b)))/c)/((((a/a)/(b/b))/((a/a)/(b/b)))/c))
Library
The library contains two modules.
WeberLogic.Parser
WeberLogic.Actions
WeberLogic.Parser
The WeberLogic.Parser
provides functions which read stings and return
an abstract syntax tree (AST). The AST in implement with a data type
called LogicExp
and Letter
.
-
Data Types
LogicExp
- A recursively defined data type which implements as
abstract syntax tree. It provides the following type constructors
which function as nodes in the AST: Not
, And
, Or
, Implies
,
Iff
, Nand
, and Nor
. The Predicate
type constructor
functions as the AST leaves.
> import WeberLogic.Parser
> Predicate 'A' [(Variable 'x', Name 'a')]
> Not (Predicate 'A' [(Variable 'x', Name 'a')])
> And (Predicate 'A' [(Variable 'x', Name 'a')]) (Predicate 'B' [])
Letter
- This Data Constructor provies two Type constructors
Variable
and Name
. They are used in the construction of
Predicate
which requires a list of type Letter
> import WeberLogic.Parser
> Predicate 'A' [(Variable 'x', Name 'a')]
-
Functions
> import WeberLogic.Parser
> a = parseExp "Axa"
> b = parseExp "~Axa"
> c = parseExp "Axa&B"
> import WeberLogic.Parser
> a = parseExp "|- Axa"
> b = parseExp "~Axa, B |- Cax"
> c = parseExp "Axa&B, B, C |- Ax->By"
WeberLogic.Actions
The WeberLogic.Actions
modules provides functions which manipulate the
LogicExp
AST.
> import WeberLogic.Parser
> import WeberLogic.Actions
> mapM_ putStrLn $ truthTableStr $ readExp "A&B"
'a' 'b' | (a&~b)
True True | False
True False | True
False True | False
False False | False
> toNand $ readExp "A&~B"
((a|(b|b))|(a|(b|b)))
> toNor $ readExp "A&~B"
((a/a)/((b/b)/(b/b)))