master > master: auslagern + Entfernung von überflüssigen Methoden
This commit is contained in:
parent
ff8b7132f0
commit
038eb8a754
@ -19,7 +19,6 @@ from aussagenlogik.schema import isLongConjunction;
|
|||||||
from aussagenlogik.schema import isDisjunction;
|
from aussagenlogik.schema import isDisjunction;
|
||||||
from aussagenlogik.schema import isLongDisjunction;
|
from aussagenlogik.schema import isLongDisjunction;
|
||||||
from aussagenlogik.schema import isImplication;
|
from aussagenlogik.schema import isImplication;
|
||||||
from aussagenlogik.schema import getName;
|
|
||||||
from aussagenlogik.schema import SyntaxBaum;
|
from aussagenlogik.schema import SyntaxBaum;
|
||||||
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@ -35,10 +34,10 @@ from aussagenlogik.schema import SyntaxBaum;
|
|||||||
def rekursiv_eval(fml: SyntaxBaum, I: List[str]) -> int:
|
def rekursiv_eval(fml: SyntaxBaum, I: List[str]) -> int:
|
||||||
subfml = fml.children;
|
subfml = fml.children;
|
||||||
if isAtom(fml):
|
if isAtom(fml):
|
||||||
name = getName(fml);
|
name = fml.expr;
|
||||||
return 1 if (name in I) else 0;
|
return 1 if (name in I) else 0;
|
||||||
if isBeliebig(fml):
|
if isBeliebig(fml):
|
||||||
name = getName(fml);
|
name = fml.expr;
|
||||||
return 1 if (name in I) else 0;
|
return 1 if (name in I) else 0;
|
||||||
elif isTrueSymbol(fml):
|
elif isTrueSymbol(fml):
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -13,6 +13,8 @@ from lark import Tree;
|
|||||||
from typing import List;
|
from typing import List;
|
||||||
from typing import Union;
|
from typing import Union;
|
||||||
|
|
||||||
|
from aussagenlogik.syntaxbaum import SyntaxBaum;
|
||||||
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
# GLOBALE KONSTANTEN
|
# GLOBALE KONSTANTEN
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
@ -22,57 +24,15 @@ with open('aussagenlogik/grammar.lark', 'r') as fp:
|
|||||||
grammar = ''.join(fp.readlines());
|
grammar = ''.join(fp.readlines());
|
||||||
lexerAussagenlogik = Lark(grammar, start='expr', regex=True);
|
lexerAussagenlogik = Lark(grammar, start='expr', regex=True);
|
||||||
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
# KLASSE: Syntaxbaum
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
class SyntaxBaum(object):
|
|
||||||
expr: str;
|
|
||||||
kind: str;
|
|
||||||
children: List[SyntaxBaum];
|
|
||||||
tree: Tree;
|
|
||||||
|
|
||||||
def __init__(self, fml: Tree):
|
|
||||||
self.kind = fml.data;
|
|
||||||
if len(fml.children) == 1 and isinstance(fml.children[0], str):
|
|
||||||
self.expr = fml.children[0];
|
|
||||||
self.children = [];
|
|
||||||
self.tree = Tree(self.kind, fml.children);
|
|
||||||
else:
|
|
||||||
self.children = [ SyntaxBaum(child) for child in fml.children if isinstance(child, Tree) and child.data != 'symb' ];
|
|
||||||
self.tree = Tree(self.kind, [child.tree for child in self.children]);
|
|
||||||
signature_parts = [];
|
|
||||||
i = 0;
|
|
||||||
for teilfml in fml.children:
|
|
||||||
if isinstance(teilfml, str):
|
|
||||||
signature_parts.append(teilfml);
|
|
||||||
elif teilfml.data == 'symb':
|
|
||||||
signature_parts.append(getText(teilfml));
|
|
||||||
else:
|
|
||||||
signature_parts.append('{{{}}}'.format(i));
|
|
||||||
i += 1;
|
|
||||||
signature = ' '.join(signature_parts);
|
|
||||||
self.expr = signature.format(*self.children);
|
|
||||||
if self.kind in [ 'konj', 'konj_lang', 'disj', 'disj_lang', 'impl' ]:
|
|
||||||
self.expr = ('(' if self.expr.startswith('(') else '( ') + self.expr;
|
|
||||||
self.expr += (')' if self.expr.endswith(')') else ' )');
|
|
||||||
return;
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return self.expr;
|
|
||||||
|
|
||||||
def pretty(self):
|
|
||||||
return self.tree.pretty(indent_str='- ');
|
|
||||||
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
# METHODE: string -> Syntaxbaum
|
# METHODE: string -> Syntaxbaum
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
def stringToSyntaxbaum(u: str) -> SyntaxBaum:
|
def stringToSyntaxbaum(expr: str) -> SyntaxBaum:
|
||||||
try:
|
try:
|
||||||
return SyntaxBaum(lexerAussagenlogik.parse(u));
|
return SyntaxBaum(lexerAussagenlogik.parse(expr));
|
||||||
except:
|
except:
|
||||||
raise Exception('Ausdruck \033[1m{}\033[0m konnte nicht erkannt werden!'.format(u));
|
raise Exception('Ausdruck \033[1m{}\033[0m konnte nicht erkannt werden!'.format(expr));
|
||||||
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
# METHODEN: Erkennung von Formeltypen
|
# METHODEN: Erkennung von Formeltypen
|
||||||
@ -81,6 +41,9 @@ def stringToSyntaxbaum(u: str) -> SyntaxBaum:
|
|||||||
def isAtom(fml: SyntaxBaum) -> bool:
|
def isAtom(fml: SyntaxBaum) -> bool:
|
||||||
return fml.kind == 'atom';
|
return fml.kind == 'atom';
|
||||||
|
|
||||||
|
def isLiteral(fml: SyntaxBaum) -> bool:
|
||||||
|
return isAtom(fml) or (isNegation(fml) and isAtom(fml.child));
|
||||||
|
|
||||||
def isBeliebig(fml: SyntaxBaum) -> bool:
|
def isBeliebig(fml: SyntaxBaum) -> bool:
|
||||||
return fml.kind == 'beliebig';
|
return fml.kind == 'beliebig';
|
||||||
|
|
||||||
@ -97,33 +60,13 @@ def isConjunction(fml: SyntaxBaum) -> bool:
|
|||||||
return fml.kind == 'konj';
|
return fml.kind == 'konj';
|
||||||
|
|
||||||
def isLongConjunction(fml: SyntaxBaum) -> bool:
|
def isLongConjunction(fml: SyntaxBaum) -> bool:
|
||||||
return fml.kind == 'konj_lang';
|
return fml.kind in ['konj', 'konj_lang'];
|
||||||
|
|
||||||
def isDisjunction(fml: SyntaxBaum) -> bool:
|
def isDisjunction(fml: SyntaxBaum) -> bool:
|
||||||
return fml.kind == 'disj';
|
return fml.kind == 'disj';
|
||||||
|
|
||||||
def isLongDisjunction(fml: SyntaxBaum) -> bool:
|
def isLongDisjunction(fml: SyntaxBaum) -> bool:
|
||||||
return fml.kind == 'disj_lang';
|
return fml.kind == ['disj', 'disj_lang'];
|
||||||
|
|
||||||
def isImplication(fml: SyntaxBaum) -> bool:
|
def isImplication(fml: SyntaxBaum) -> bool:
|
||||||
return fml.kind == 'impl';
|
return fml.kind == 'impl';
|
||||||
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
# METHODEN: Formel -> Textinhalt
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
def getText(fml: Tree) -> str:
|
|
||||||
text = fml.children[0];
|
|
||||||
if isinstance(text, str):
|
|
||||||
return text;
|
|
||||||
raise Exception('Konnte Textinhalt nicht ablesen!');
|
|
||||||
|
|
||||||
def getName(fml: SyntaxBaum) -> str:
|
|
||||||
return fml.expr;
|
|
||||||
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
# METHODEN: Formel -> Textinhalt
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
def prettifyTree(fml: Union[Tree, SyntaxBaum]) -> str:
|
|
||||||
return fml.pretty();
|
|
||||||
|
69
code/aussagenlogik/syntaxbaum.py
Normal file
69
code/aussagenlogik/syntaxbaum.py
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# IMPORTS
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
from __future__ import annotations;
|
||||||
|
from lark import Tree;
|
||||||
|
from typing import Generator;
|
||||||
|
from typing import List;
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# GLOBALE KONSTANTEN
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
#
|
||||||
|
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
# KLASSE: Syntaxbaum
|
||||||
|
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
class SyntaxBaum(object):
|
||||||
|
expr: str;
|
||||||
|
kind: str;
|
||||||
|
children: List[SyntaxBaum];
|
||||||
|
tree: Tree;
|
||||||
|
|
||||||
|
def __init__(self, fml: Tree):
|
||||||
|
self.kind = fml.data;
|
||||||
|
if len(fml.children) == 1 and isinstance(fml.children[0], str):
|
||||||
|
self.expr = fml.children[0];
|
||||||
|
self.children = [];
|
||||||
|
self.tree = Tree(self.kind, fml.children);
|
||||||
|
else:
|
||||||
|
self.children = [ SyntaxBaum(child) for child in fml.children if isinstance(child, Tree) and child.data != 'symb' ];
|
||||||
|
self.tree = Tree(self.kind, [child.tree for child in self.children]);
|
||||||
|
signature_parts = [];
|
||||||
|
i = 0;
|
||||||
|
for subfml in fml.children:
|
||||||
|
if isinstance(subfml, str):
|
||||||
|
signature_parts.append(subfml);
|
||||||
|
elif subfml.data == 'symb':
|
||||||
|
symb = str(subfml.children[0]);
|
||||||
|
signature_parts.append(symb);
|
||||||
|
else:
|
||||||
|
signature_parts.append('{{{}}}'.format(i));
|
||||||
|
i += 1;
|
||||||
|
signature = ' '.join(signature_parts);
|
||||||
|
self.expr = signature.format(*self.children);
|
||||||
|
if self.kind in [ 'konj', 'konj_lang', 'disj', 'disj_lang', 'impl' ]:
|
||||||
|
lbrace = '(' if self.expr.startswith('(') else '( ';
|
||||||
|
rbrace = ')' if self.expr.endswith(')') else ' )';
|
||||||
|
self.expr = lbrace + self.expr + rbrace;
|
||||||
|
return;
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.expr;
|
||||||
|
|
||||||
|
def __iter__(self) -> Generator[SyntaxBaum, None, None]:
|
||||||
|
for child in self.children:
|
||||||
|
yield child;
|
||||||
|
|
||||||
|
@property
|
||||||
|
def child(self) -> SyntaxBaum:
|
||||||
|
return self.children[0];
|
||||||
|
|
||||||
|
def pretty(self):
|
||||||
|
return self.tree.pretty(indent_str='- ');
|
@ -15,9 +15,8 @@ from typing import List;
|
|||||||
|
|
||||||
sys.path.insert(0, os.getcwd());
|
sys.path.insert(0, os.getcwd());
|
||||||
|
|
||||||
from aussagenlogik.schema import prettifyTree;
|
|
||||||
from aussagenlogik.schema import stringToSyntaxbaum;
|
from aussagenlogik.schema import stringToSyntaxbaum;
|
||||||
from aussagenlogik.schema import SyntaxBaum;
|
from aussagenlogik.syntaxbaum import SyntaxBaum;
|
||||||
from aussagenlogik.rekursion import rekursiv_eval;
|
from aussagenlogik.rekursion import rekursiv_eval;
|
||||||
from aussagenlogik.rekursion import rekursiv_atoms;
|
from aussagenlogik.rekursion import rekursiv_atoms;
|
||||||
from aussagenlogik.rekursion import rekursiv_depth;
|
from aussagenlogik.rekursion import rekursiv_depth;
|
||||||
@ -69,7 +68,7 @@ def display_results(expr: str, fml: SyntaxBaum, I: List[str], results: dict):
|
|||||||
F := \033[92;1m{F}\033[0m:
|
F := \033[92;1m{F}\033[0m:
|
||||||
'''.format(F=fml)
|
'''.format(F=fml)
|
||||||
));
|
));
|
||||||
print(prettifyTree(fml));
|
print(fml.pretty());
|
||||||
print(dedent(
|
print(dedent(
|
||||||
'''
|
'''
|
||||||
Für I = [{I}] und F wie oben gilt
|
Für I = [{I}] und F wie oben gilt
|
||||||
|
Loading…
x
Reference in New Issue
Block a user