<jupyter_start><jupyter_text>**Introduzione**

La logica è nata dalla necessità di formalizzare il linguaggio parlato. 
In passato, quando si andava a porre un quesito o ad esporre una situazione, si incappava sempre nel solito problema: la difficoltà nell'esprimere un'idea nel modo più oggettivo possibile.
Per esprimere i formalismi più basilari furono introdotti i sillogismi.
Nel momento in cui entrò in gioco la matematica però, si riscontrarono importanti innovazioni anche dal punto di vista linguistico.
Un linguaggio unico però, che mettesse tutti d'accordo, ancora non esisteva.
Fu Boole, il primo a formalizzare e a studiare la logica da un punto di vista algebrico tra il 1847 e il 1850.
Suoi gli enunciati che spiegano la prassi per la trascrizione delle formule e la riproduzione dei connettivi.
La logica matematica quindi, inizialmente si focalizzò sull'aspetto sintattico della lingua, ossia sul modo in cui si descrivono le cose.
Boole in particolare introdusse algebre costituite da due estremi: 0 e 1. Lo "0" va interpretato come falso e l' "1" come vero.
In questo modo abbiamo un formalismo e possiamo parlare di più oggetti e la logica inizia ad avere un suo ruolo attivo nella matematica.
La Logica proposizionale si occupa invece di studiare la verità e la falsità delle affermazioni, che possono essere formulate con l'ausilio della matematica. 
In ambito logico, si definisce "proposizione" qualsiasi affermazione di cui si possa determinare un valore di verità (vero o falso), senza che ciò comporti ambiguità.
In seguito Lukasiewicz, a partire dalla Logica a due valori introdusse un nuovo concetto, in virtù del quale un costrutto deve fornirmi un valore di verità diverso da 0 e 1. 
Introdusse inoltre il "non lo so"; vale a dire il terzo valore compreso tra 0 e 1; quello tra bianco assoluto e nero assoluto a cui fanno riferimento tutte le gradazioni di grigio, ossia infiniti valori.
La logica fuzzy è invece una branca della matematica in cui si può attribuire a ciascuna proposizione un grado di verità diverso da 0 e 1 e compreso tra di loro. È una logica polivalente, ossia un'estensione della logica booleana. 
È legata alla "Teoria degli insiemi sfocati con grado di verità o valore di appartenenza" con cui si analizza quanto è vera una proprietà che può essere, oltre che vera (= a valore 1) o falsa (= a valore 0) come nella logica classica, anche parzialmente vera e parzialmente falsa.
 
 **Connettivi Logici in Python**<jupyter_code>def Congiunzione(var1,var2):
  return var1 and var2

def Disgiunzione(var1,var2):
  return var1 or var2

def ImplicazioneSemplice(ipotesi,tesi):
  return (not ipotesi or tesi)

def oppure(var1,var2):
  return (not var1 and var2) or (var1 and not var2)


def stampa_tabella(formula):
  valori_possibili = (False, True)

  for A in valori_possibili:
    for B in valori_possibili:
      print(f'{formula(A,B)}')
stampa_tabella(oppure)<jupyter_output>False
True
True
False<jupyter_text>**Tabella di verità**

Si è preferito utilizzare questo codice dal momento che è quello risulta essere più chiaro ad un programmatore evitando interpretazioni errate.
Più in dettaglio è stata utilizzata la funzione AND.
Va previsato inoltre che l' utilizzo di due cicli for risulti particolarmente dispendioso per python dove non vengono dichiarate le variabili a differenza degli altri linguaggi, ad esempio C.<jupyter_code>valori_possibili = (False, True)

for A in valori_possibili:
  for B in valori_possibili:
    print(f'{A} AND {B} = {A and B}')<jupyter_output>False AND False = False
False AND True = False
True AND False = False
True AND True = True<jupyter_text>**Funzioni di verità delle seguenti formule :**

**A or (not A)**

**not A -> B**<jupyter_code>#Funzione 1
def uno(var1): 
  return var1 or (not var1)

#Funzione 2
def due(var1, var2):
  return (not (not var1) or var2)
def stampa_tabella(formula):
  valori = (0,1)
 
  print('\nTabella di verita\':')
  if formula == 'uno':
    for A in valori:
      print(f'{A} | {eval(formula+"(A)")}')

  else:               
    for A in valori:
      for B in valori:
        print(f' {A} | {B} | {eval(formula+"(A,B)")}')
print('Stampa Funzione')


risposta = 's'#per terminare il while
while risposta == 's':
  #input utente
  operazione = input('Quale delle due operazioni vuoi effettuare ? "uno" "due"')
    
  #concateno le stringhe per richiamare delle funzioni
  stampa_tabella(operazione)
  risposta = input('\nUn\'altra Operazione? Si(s), no(n)')
  print('\n\nGrazie per avermi utilizzato!')<jupyter_output>Stampa Funzione
Quale delle due operazioni vuoi effettuare ? "uno" "due"uno

Tabella di verita':
0 | True
1 | 1

Un'altra Operazione? Si(s), no(n)s


Grazie per avermi utilizzato!
Quale delle due operazioni vuoi effettuare ? "uno" "due"due

Tabella di verita':
 0 | 0 | 0
 0 | 1 | 1
 1 | 0 | True
 1 | 1 | True

Un'altra Operazione? Si(s), no(n)no


Grazie per avermi utilizzato!
{'fraction_non_alphanumeric': 0.06924315619967794, 'fraction_numerical': 0.011674718196457327, 'mean_word_length': 4.308760683760684, 'pattern_counts': {'":': 0, '<': 10, '<?xml version=': 0, '>': 11, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '18054', 'license': 'MIT', 'n_tokens_mistral': 1778, 'n_tokens_neox': 1742, 'n_words': 689, 'path': 'Tesina_Logica_Fuzzy.ipynb', 'repo_name': 'Darkdev88/corso_fuzzy_2021', 'size': '4968'}