packages feed

WeberLogic-0.1.2: README.md

WeberLogic
=========

Logic interpreter and parsing library

## Install ##

```sh
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. 

1. `WeberLogic.Parser`
2. `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.
      
    ```haskell
    > 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`

    ```haskell
    > import WeberLogic.Parser
    > Predicate 'A' [(Variable 'x', Name 'a')]
    ```

* Functions
    * `parseExp`

    ```haskell
    > import WeberLogic.Parser
    > a = parseExp "Axa"
    > b = parseExp "~Axa"
    > c = parseExp "Axa&B"
    ```

    * `parseArg`

    ```haskell
    > 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. 

```haskell
> 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)))
```