initial
This commit is contained in:
commit
270e217040
219
Classes.cs
Normal file
219
Classes.cs
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace LogiksProject
|
||||||
|
{
|
||||||
|
//alternatywa, konjunkcja, równaważność, implikacja, negacja, lewy nawias, prawy nawias, zmienna, jakieś cudo
|
||||||
|
|
||||||
|
enum Signs { Alterantive, Conjuction, Equality, Implication, Negation, LeftBracket, RightBracket, Var, Unknown };
|
||||||
|
//enum Brackets { LeftBracket, RightBracket};
|
||||||
|
|
||||||
|
|
||||||
|
class LogicVar //Najprostsza klasa dla przechowywania zmiennych
|
||||||
|
{
|
||||||
|
public char Name { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
class LogicRelation //(NIE UŻYWANE)
|
||||||
|
{ //Prawdopodobnie można użyć przy wprowadzaniu nawiasów
|
||||||
|
LogicVar v1;
|
||||||
|
LogicVar v2;
|
||||||
|
|
||||||
|
Signs rel;
|
||||||
|
|
||||||
|
public void SetVarOne(LogicVar v1)
|
||||||
|
{
|
||||||
|
this.v1 = v1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetVars(LogicVar v1, LogicVar v2)
|
||||||
|
{
|
||||||
|
this.v1 = v1;
|
||||||
|
this.v2 = v2;
|
||||||
|
}
|
||||||
|
|
||||||
|
LogicRelation(LogicVar l, Signs s)
|
||||||
|
{
|
||||||
|
v1 = l;
|
||||||
|
rel = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
LogicRelation(LogicVar l1, LogicVar l2, Signs s)
|
||||||
|
{
|
||||||
|
v1 = l1;
|
||||||
|
v2 = l2;
|
||||||
|
rel = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
class LogicString // Najważniejsza klasa, która przyjmuje ciąq danych
|
||||||
|
{ // i przetwarza dla sprawdzenia, czy wpisana formuła
|
||||||
|
string input; // jest poprawna logicznie. W danym przypadku nie są uwzględniane nawiasy,
|
||||||
|
// więc można przyjąć, że konjunkcja i alternatywa mają różne priorytety
|
||||||
|
//LogicRelation rel;
|
||||||
|
LogicVar[] vars; // <- Tablica zmiennych logicznych
|
||||||
|
int[] StringRelVar; // <- tablica przechowująca informację o ciągu znaków (1 dla zmiennej, 0 dla funkcji, 2 - koniec ciągu), używana przy sprawdzaniu
|
||||||
|
Signs [] sTab; // <- tablica zmiennych i funkcji logicznych, używana przy sprawdzaniu
|
||||||
|
//Brackets [] bTab; // <- (NIE UŻYWANE) tablica nawiasów
|
||||||
|
|
||||||
|
public void GetInputString() // <- metoda GetInputString pryzjmuje wejście do zmienney typu string
|
||||||
|
{
|
||||||
|
Console.WriteLine("Please, input your string and press enter(with no spaces)");
|
||||||
|
input = Console.ReadLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AnalizeString() // <- metoda AnalizeString "przetwarza" dane z wejścia i "tłumaczy" je na zmienne i funkcje logiczne, które są później zapisywane w LogicVar[] vars, int[] StringRelVar i Signs[] sTab
|
||||||
|
{
|
||||||
|
sTab = new Signs [100]; // toporny sposób na tworzenie nowej tablicy
|
||||||
|
vars = new LogicVar[100]; // to samo
|
||||||
|
for (int j = 0; j < 100; j++) // cuda na kiju, ze aż wstyd
|
||||||
|
{
|
||||||
|
vars[j] = new LogicVar();
|
||||||
|
}
|
||||||
|
StringRelVar = new int[100];
|
||||||
|
//bTab = new Brackets [100];
|
||||||
|
for(int i = 0; i < input.Length; i++) // "chodzenie" po stringu input i "tłumaczenie" zmiennych i funkcji
|
||||||
|
{
|
||||||
|
if(input[i] == '=') // '=' równoważność
|
||||||
|
{
|
||||||
|
//Console.WriteLine("equality");
|
||||||
|
sTab[i] = Signs.Equality;
|
||||||
|
StringRelVar[i] = 0; // funkcja logiczna rozpoznawana jako "0"
|
||||||
|
}
|
||||||
|
else if(input[i] == '>') // '>' implikacja
|
||||||
|
{
|
||||||
|
//Console.WriteLine("implication");
|
||||||
|
sTab[i] = Signs.Implication;
|
||||||
|
StringRelVar[i] = 0;
|
||||||
|
}
|
||||||
|
else if(input[i] == '|') // '|' alternatywa
|
||||||
|
{
|
||||||
|
//Console.WriteLine("alternative");
|
||||||
|
sTab[i] = Signs.Alterantive;
|
||||||
|
StringRelVar[i] = 0;
|
||||||
|
}
|
||||||
|
else if(input[i] == '&') // '&' koniunkcja
|
||||||
|
{
|
||||||
|
//Console.WriteLine("conjuction");
|
||||||
|
sTab[i] = Signs.Conjuction;
|
||||||
|
StringRelVar[i] = 0;
|
||||||
|
}
|
||||||
|
else if(input[i] == '!') // '!' negacja
|
||||||
|
{
|
||||||
|
//Console.WriteLine("negation");
|
||||||
|
sTab[i] = Signs.Negation;
|
||||||
|
StringRelVar[i] = 0;
|
||||||
|
}
|
||||||
|
/*else if(input[i] == '(') // nawiasy
|
||||||
|
{
|
||||||
|
//Console.WriteLine("left bracket");
|
||||||
|
sTab[i] = Signs.LeftBracket;
|
||||||
|
StringRelVar[i] = 0;
|
||||||
|
}
|
||||||
|
else if(input[i] == ')')
|
||||||
|
{
|
||||||
|
//Console.WriteLine("right bracket");
|
||||||
|
sTab[i] = Signs.RightBracket;
|
||||||
|
StringRelVar[i] = 0;
|
||||||
|
}*/
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Console.WriteLine($"there is a variable called {input[i]}");
|
||||||
|
vars[i].Name = input[i]; // (zbędne bez używania nawiasów) "rozpoznawanie" zmiennych i wpisywanie do tablicy,
|
||||||
|
sTab[i] = Signs.Var;
|
||||||
|
//Console.WriteLine($"there is a variable called {vars[i].Name}");
|
||||||
|
//vars[i].SetName(input[i]);
|
||||||
|
StringRelVar[i] = 1; // Zmienna oznaczana jako "1"
|
||||||
|
}
|
||||||
|
if(input[i] == ' ')
|
||||||
|
{
|
||||||
|
Console.WriteLine("You can't put spaces");
|
||||||
|
}
|
||||||
|
if(i == input.Length - 1)
|
||||||
|
{
|
||||||
|
StringRelVar[i+1] = 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool ErrSearch() // metoda ErrSearch sprawdza czy formuła jest poprawna
|
||||||
|
{
|
||||||
|
int count = 0; // używane przy "chodzeniu" po StringRelVar
|
||||||
|
int zeroCount = 0; // używane przy podliczaniu funkcji logicznych, występujacych pod rząd
|
||||||
|
int oneCount = 0; // to samo przy podliczaniu zmiennych logicznych
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
while(StringRelVar[count] != 2)
|
||||||
|
{
|
||||||
|
//Console.Write(StringRelVar[count]);
|
||||||
|
if(StringRelVar[count] == 1)
|
||||||
|
{
|
||||||
|
if (oneCount == 1) // nie można umieszczać obok siebie zmienne logiczne
|
||||||
|
{
|
||||||
|
Console.WriteLine("formula nie jest poprawna");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (oneCount == 0)
|
||||||
|
{
|
||||||
|
zeroCount = 0;
|
||||||
|
oneCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
if(StringRelVar[count] == 0)
|
||||||
|
{
|
||||||
|
if (zeroCount > 0)
|
||||||
|
{
|
||||||
|
if (sTab[count] == Signs.Negation)
|
||||||
|
{
|
||||||
|
if ((sTab[count + 1] != Signs.Var)&&(sTab[count+1] != Signs.Negation)) //tylko negacja może się powtarzać wielokrotnie, przy tym negacja nie może się znajdować przed funkcją logiczną
|
||||||
|
{
|
||||||
|
Console.WriteLine("formula nie jest porpawna");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("formula nie jest poprawna");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (zeroCount == 0)
|
||||||
|
{
|
||||||
|
oneCount = 0;
|
||||||
|
zeroCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
Console.WriteLine("formula jest poprawna");
|
||||||
|
return true;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ShowVerRel() //zestaw zer i jedynek z dwójką na końcu, dokładnie jak historia z wejściówkami na logice
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
while(StringRelVar[count] != 2)
|
||||||
|
{
|
||||||
|
Console.Write(StringRelVar[count]);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} //koniec
|
31
Program.cs
Normal file
31
Program.cs
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace LogiksProject
|
||||||
|
{
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
LogicString s1 = new LogicString();
|
||||||
|
|
||||||
|
// program przyjmuje ciąg znaków(bez spacji)
|
||||||
|
// = równoważnośc
|
||||||
|
// > implikacja
|
||||||
|
// | alternatywa
|
||||||
|
// & koniunkja
|
||||||
|
// ! negacja
|
||||||
|
// pozostałe znaki, w tym spacja są traktowane jako "odmiany kaligraficzne" zmiennych logicznych
|
||||||
|
|
||||||
|
s1.GetInputString();
|
||||||
|
s1.AnalizeString();
|
||||||
|
s1.ErrSearch();
|
||||||
|
|
||||||
|
|
||||||
|
Console.ReadLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
69
program.py
Normal file
69
program.py
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
import sys
|
||||||
|
#TODO: dodać parentices
|
||||||
|
class AbstractInterpreter:
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
def isValid(formula:str)->bool:
|
||||||
|
raise NotImplementedError
|
||||||
|
class SimpleInterpreter(AbstractInterpreter):
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
def isValid(self,formula)->bool:
|
||||||
|
print("is valid?")
|
||||||
|
variables = {}
|
||||||
|
f=[]
|
||||||
|
def isBlacklisted(char):
|
||||||
|
return char in ['\n', '\t', ' ']
|
||||||
|
def isSign(char):
|
||||||
|
logic_signs = ['=', '>', '&', '|', '!', '(', ')']
|
||||||
|
return char in logic_signs
|
||||||
|
def isVariable(char):
|
||||||
|
return not isSign(char)
|
||||||
|
def isNegation(char):
|
||||||
|
return char == '!'
|
||||||
|
#print(vars(formula))
|
||||||
|
for i,char in enumerate(formula.s):
|
||||||
|
if isBlacklisted(char): return False
|
||||||
|
print(char)
|
||||||
|
prev = formula.s[i-1] if i>0 else None #None, gdy jesteśmy na pierwszym znaku
|
||||||
|
if isSign(char):
|
||||||
|
if (not isNegation(char)):
|
||||||
|
if isSign(prev) and not isNegation(prev): # tylko negacje mogą się powtarzać po innym znaku
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
if isVariable(prev): # obrona przed a!>b
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
#if current char is a variable
|
||||||
|
if isVariable(prev) and prev is not None: #Obrona abc>d
|
||||||
|
print("previous is also a variable");
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
class Formula:
|
||||||
|
def __init__(self, formula_string:str, interpreter:AbstractInterpreter):
|
||||||
|
self.s = formula_string
|
||||||
|
self.__i = interpreter
|
||||||
|
if not self.isValid(self.__i):
|
||||||
|
assert "formula in invalid!"
|
||||||
|
else:
|
||||||
|
print("given formula is valid")
|
||||||
|
def isValid(self, interpreter)->bool:
|
||||||
|
|
||||||
|
return interpreter.isValid(self)
|
||||||
|
|
||||||
|
|
||||||
|
i = SimpleInterpreter()
|
||||||
|
print(sys.argv)
|
||||||
|
if sys.argv[1] == '-f':
|
||||||
|
#open from file
|
||||||
|
print("opening from file")
|
||||||
|
g = open(sys.argv[1], 'r')
|
||||||
|
u = g.readlines()
|
||||||
|
for l in u:
|
||||||
|
Formula(l,i)
|
||||||
|
else:
|
||||||
|
Formula( sys.argv[1],i)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user