add files
This commit is contained in:
parent
5525722b7d
commit
1d039ab183
158
logic.hs
Normal file
158
logic.hs
Normal file
@ -0,0 +1,158 @@
|
||||
module Logic where
|
||||
import Data.List
|
||||
{-====================================================
|
||||
=================== Aussagenlogik ====================
|
||||
====================================================-}
|
||||
dict2func :: (Eq a) => [(a,b)] -> (a -> b)
|
||||
dict2func d = \x -> (head [b |(a,b)<-d, a==x ])
|
||||
|
||||
type Binary = [Int]
|
||||
|
||||
toBin :: Int -> Binary
|
||||
toBin 0 = [0]
|
||||
toBin 1 = [1]
|
||||
toBin n
|
||||
| n `mod` 2 == 0 = toBin (n `div` 2) ++ [0]
|
||||
| otherwise = toBin (n `div` 2) ++ [1]
|
||||
|
||||
bloatBin :: Int -> Binary -> Binary
|
||||
bloatBin n x
|
||||
| n==(length x) = x
|
||||
| otherwise = [0| i<-[1..n-(length x)]] ++ x
|
||||
|
||||
type Belegung = Char -> Bool
|
||||
data Formel = TAUTO
|
||||
| ABSURD
|
||||
| Atom Char
|
||||
| NOT Formel
|
||||
| Formel `OR` Formel
|
||||
| Formel `AND` Formel
|
||||
| Formel `THEN` Formel
|
||||
| Formel `EQUY` Formel
|
||||
| Formel `XOR` Formel
|
||||
|
||||
instance Show Formel where
|
||||
show TAUTO = "T"
|
||||
show ABSURD = "_|_"
|
||||
show (Atom a) = [a]
|
||||
show (NOT f) = "(-"++(show f)++")"
|
||||
show (a `AND` b) = "("++(show a)++"^"++(show b)++")"
|
||||
show (a `OR` b) = "("++(show a)++"v"++(show b)++")"
|
||||
show (a `THEN` b) = "("++(show a)++"=>"++(show b)++")"
|
||||
show (a `EQUY` b) = "("++(show a)++"<=>"++(show b)++")"
|
||||
show (a `XOR` b) = "("++(show a)++"<x>"++(show b)++")"
|
||||
|
||||
noArrows :: Formel -> Formel
|
||||
noArrows TAUTO = TAUTO
|
||||
noArrows ABSURD = ABSURD
|
||||
noArrows (Atom a) = Atom a
|
||||
noArrows (NOT a) = NOT $ noArrows a
|
||||
noArrows (a `AND` b) = (noArrows a) `AND` (noArrows b)
|
||||
noArrows (a `OR` b) = (noArrows a) `OR` (noArrows b)
|
||||
noArrows (a `THEN` b) = (NOT $ noArrows a) `OR` noArrows b
|
||||
noArrows (a `EQUY` b) = (noArrows $ a `THEN` b) `AND` (noArrows $ b `THEN` a)
|
||||
|
||||
nnf :: Formel -> Formel
|
||||
nnf TAUTO = TAUTO
|
||||
nnf ABSURD = ABSURD
|
||||
nnf (Atom a) = Atom a --literal pos
|
||||
nnf (NOT (Atom a)) = NOT (Atom a) --literal neg
|
||||
nnf (NOT TAUTO) = ABSURD
|
||||
nnf (NOT ABSURD) = TAUTO
|
||||
nnf (NOT (NOT f)) = nnf f --double neg
|
||||
nnf (a `AND` b) = (nnf a) `AND` (nnf b)
|
||||
nnf (a `OR` b) = (nnf a) `OR` (nnf b)
|
||||
nnf (NOT (a `OR` b)) = (nnf $ NOT a) `AND` (nnf $ NOT b) --deMorgan 1
|
||||
nnf (NOT (a `AND` b)) = (nnf $ NOT a) `OR` (nnf $ NOT b) --deMorgan 2
|
||||
nnf (a `THEN` b) = nnf $ noArrows $ a `THEN` b --remove arrows
|
||||
nnf (a `EQUY` b) = nnf $ noArrows $ a `EQUY` b --remove arrows
|
||||
nnf (NOT (a `THEN` b)) = nnf $ NOT $ noArrows $ a `THEN` b --remove arrows
|
||||
nnf (NOT (a `EQUY` b)) = nnf $ NOT $ noArrows $ a `EQUY` b --remove arrows
|
||||
|
||||
evalform :: Formel -> Belegung -> Bool
|
||||
evalform TAUTO _ = True
|
||||
evalform ABSURD _ = False
|
||||
evalform (Atom a) f = f a
|
||||
evalform (NOT a) f = not (evalform a f)
|
||||
evalform (a `AND` b) f = (evalform a f) && (evalform b f)
|
||||
evalform (a `OR` b) f = (evalform a f) || (evalform b f)
|
||||
evalform (a `THEN` b) f = evalform (noArrows $ a `THEN` b) f
|
||||
evalform (a `EQUY` b) f = evalform (noArrows $ a `EQUY` b) f
|
||||
|
||||
formLen :: Formel -> Int
|
||||
formLen ABSURD = 1
|
||||
formLen TAUTO = 1
|
||||
formLen (Atom c) = 1
|
||||
formLen (NOT a) = 1 + (formLen a)
|
||||
formLen (a `AND` b) = (formLen a) + 1 + (formLen b)
|
||||
formLen (a `OR` b) = (formLen a) + 1 + (formLen b)
|
||||
formLen (a `THEN` b) = formLen $ noArrows $ a `THEN` b
|
||||
formLen (a `EQUY` b) = formLen $ noArrows $ a `EQUY` b
|
||||
|
||||
atoms :: Formel -> [Char]
|
||||
atoms ABSURD = []
|
||||
atoms TAUTO = []
|
||||
atoms (Atom c) = [c]
|
||||
atoms (NOT a) = atoms a
|
||||
atoms (a `AND` b) = (atoms a) `union` (atoms b)
|
||||
atoms (a `OR` b) = (atoms a) `union` (atoms b)
|
||||
atoms (a `THEN` b) = (atoms a) `union` (atoms b)
|
||||
atoms (a `EQUY` b) = (atoms a) `union` (atoms b)
|
||||
atoms (a `XOR` b) = (atoms a) `union` (atoms b)
|
||||
|
||||
allAlpha :: Int -> [Binary]
|
||||
allAlpha n = let f = (bloatBin n).toBin in [ f x |x<-[0..(2^n)-1] ]
|
||||
|
||||
numAtoms :: Formel -> Int
|
||||
numAtoms = length.atoms
|
||||
|
||||
--------------------------------------------------------------
|
||||
|
||||
{-
|
||||
instance Eq Formel where
|
||||
TAUTO == TAUTO = True
|
||||
ABSURD == ABSURD = True
|
||||
(Atom a) == (Atom b) = a==b
|
||||
(a `OR` b) == (b `OR` a) = True
|
||||
(a `AND` b) == (b `AND` a) = True
|
||||
-}
|
||||
|
||||
|
||||
--todo
|
||||
str2form :: String -> Formel
|
||||
str2form s
|
||||
| (head s)=='-' = NOT $ str2form $ tail s
|
||||
| (head s) `elem` "ABCDEFGHIJKLMNOPQRSTUVWXYZ" = Atom $ head s
|
||||
| otherwise = Atom 'A'
|
||||
|
||||
|
||||
|
||||
{-
|
||||
|
||||
A B C | AvB | BvC
|
||||
-------------------------
|
||||
0 0 0 |
|
||||
0 0 1 |
|
||||
|
||||
-}
|
||||
|
||||
truthTable :: Formel -> IO()
|
||||
truthTable f = do
|
||||
let n = length $ atoms f
|
||||
let r = 2^n
|
||||
print $ "---"++(atoms f)++"---"
|
||||
sequence_ [print x | x <-allAlpha n]
|
||||
print "------"
|
||||
|
||||
showInfo :: Formel -> IO()
|
||||
showInfo f = do
|
||||
print $ "Formula:"++(show f)
|
||||
print $ "NNF: "++(show $ nnf f)
|
||||
print $ "Length: "++(show $ formLen f)
|
||||
print $ "Atoms: "++(atoms f)
|
||||
truthTable f
|
||||
|
||||
--https://www.google.de/search?q=ukraine+nazis&tbm=isch&ei=Sb1wVdjyMMK8swHGxoPgDQ
|
||||
|
||||
|
||||
|
11
makefile
Normal file
11
makefile
Normal file
@ -0,0 +1,11 @@
|
||||
|
||||
COMP = ghc
|
||||
|
||||
default:
|
||||
$(COMP) test.hs logic.hs
|
||||
|
||||
run:
|
||||
./test
|
||||
|
||||
|
||||
|
15
test.hs
Normal file
15
test.hs
Normal file
@ -0,0 +1,15 @@
|
||||
import Logic
|
||||
|
||||
main = do
|
||||
--let alpha = dict2func [('A',True),('B',False),('C',True)]
|
||||
let alpha = dict2func $ zip ['A','B','C'] [True,False,True]
|
||||
|
||||
a = Atom 'A'
|
||||
b = Atom 'B'
|
||||
c = Atom 'C'
|
||||
--f = (NOT (NOT ((NOT a) `THEN` (b `EQUY`(NOT a)))))
|
||||
f = NOT $ NOT $ NOT a `THEN` (b `EQUY` NOT a)
|
||||
showInfo f
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user