diff --git a/app_functions.py b/app_functions.py index e3dc61519ced013ade555a846f932accc040d54d..6894b7677e52334e927dc7b9b570b764d22370ee 100644 --- a/app_functions.py +++ b/app_functions.py @@ -5,8 +5,9 @@ from image_maker import* f=new_var(freshVar()) x=new_var(freshVar()) y=new_var(freshVar()) -# z=new_var(freshVar()) -# w=new_var(freshVar()) +z=new_var(freshVar()) +w=new_var(freshVar()) +succs= new_abs(z,new_abs(f,new_abs(x,new_app(new_app(z,f), new_app(f,x))))) boolean={True: new_abs(x,new_abs(y,x)), False: new_abs(x,new_abs(y,y))} #definition des entiers de church @@ -34,6 +35,17 @@ def dec_to_lambda_relative_integers(number): return pair(boolean[True],dec_to_church(number)) return pair(boolean[False], dec_to_church(number)) +def succ(n): + return beta_reduction_totale(new_abs(f,new_abs(x,new_app(new_app(n,f), new_app(f,x))))) -#print(to_string(getSecondFromPair(pair(boolean[True],dec_to_church(1))))) -print(to_string(pair(x,y))) +def adder(n,m): + return beta_reduction_totale(new_app(new_app(m,succs),n)) + +def power(n,m):# retourne n puiss m + return beta_reduction_totale(new_app(m,n)) + +def multiplication(n,m): + return beta_reduction_totale(new_abs(f,new_abs(x,new_app(m,new_app(n,f))))) + +def is_zero(n): + return beta_reduction_totale(new_app(new_app(n,new_abs(x,boolean[False])),boolean[True])) diff --git a/image_maker.py b/image_maker.py index a17bf2635f4323a5d918c86f3664b25486d096f0..c57e5807c916986cd5960910dc76192767eb23b8 100644 --- a/image_maker.py +++ b/image_maker.py @@ -128,5 +128,8 @@ def createImage(terme): else: raise Exception("Unsupported term type") -def saveImage(image,name): - image.image.save( name+".png", "PNG") \ No newline at end of file +def saveImage(image,name,path): + if path == None: + image.image.save(name+'.png', 'PNG') + else: + image.image.save(path+'/'+name+'.png', 'PNG') \ No newline at end of file diff --git a/logic.py b/logic.py index f8ce1e95d047c7b71d63b98cc519cec0f8094584..ea5c1b544b24884e1ac5231e891bd2590990eb2c 100644 --- a/logic.py +++ b/logic.py @@ -193,15 +193,21 @@ def beta_reduction(t): import image_maker image_counter = 0 -def captureImage(terme): +def captureImage(terme, path): global image_counter - image_maker.saveImage(image_maker.createImage(terme),str(image_counter)) + if path == None: + image_maker.saveImage(image_maker.createImage(terme),str(image_counter),None) + else: + image_maker.saveImage(image_maker.createImage(terme),str(image_counter),path) image_counter += 1 -def beta_reduction_totale(terme): - captureImage(terme) +def beta_reduction_totale(terme, path): + if path == None: + captureImage(terme, None) + else: + captureImage(terme,path) if beta_reduction(terme) != None: - return beta_reduction_totale(beta_reduction(terme)) + return beta_reduction_totale(beta_reduction(terme), path) return (terme) numbers_to_letters = { @@ -214,8 +220,19 @@ numbers_to_letters = { 6:'r', 7:'t', 8:'u', + 9:'p', + 10:'d', + 11:'a', + 12:'k', + 13:'m', + 14:'n', + 15:'v', + 16:'f', + 17:'รง' + } + def to_string_var(terme): assert (isVariable(terme)), 'The argument is not a variable' return (numbers_to_letters[terme[1]]) @@ -420,20 +437,20 @@ def cleanReductions(l): else: return l -def beta_reduction_interactive_totale(terme): +def beta_reduction_interactive_totale(terme,path): if beta_reduction((terme)) != None: print(to_string(terme)) at = (annotate_beta_reduction((terme))) - captureImage(at) + captureImage(at,path) choix=int(input("voulez-vous faire la reduction tapez sur 1 pour oui tapez sur 2 pour non ")) if choix==1: - return beta_reduction_interactive_totale(beta_reduction_interactive(terme,at)) + return beta_reduction_interactive_totale(beta_reduction_interactive(terme,at),path) else: terme = cleanReductions(terme) - captureImage((terme)) + captureImage((terme),path) print("C'est fini, le terme obtenu est : "+to_string(terme)) else: - captureImage(terme) + captureImage(terme,path) return (terme) diff --git a/main.py b/main.py index 87945f45fdf1c4f08dee9b8a9c58f6f0a4a84407..7fcba913fc618b9483728c728e7986db0e7c9bd0 100644 --- a/main.py +++ b/main.py @@ -1,15 +1,36 @@ import logic import parsing import image_maker +import app_functions +import os + +def delete_images(path): + for file in os.listdir(path): + file_path = os.path.join(path, file) + try: + if os.path.isfile(file_path): + os.unlink(file_path) + except Exception as e: + print(e) + +def run_beta_reduction_totale(terme,path): + terme = parsing.parseTerm(terme) + os.makedirs(path, exist_ok=True) + if len(os.listdir(path)) > 0: + delete_images(path) + logic.beta_reduction_totale(terme,path) + +def run_beta_reduction_interactive_totale(terme,path): + terme = parsing.parseTerm(terme) + os.makedirs(path, exist_ok=True) + if len(os.listdir(path)) > 0: + delete_images(path) + logic.beta_reduction_interactive_totale(terme,path) + +def run_show_numbers(path): + os.makedirs(path, exist_ok=True) + terme = int(input('Enter a number: ')) + t = app_functions.dec_to_lambda_relative_integers(terme) + print('Voici le terme:',logic.to_string(t)) + logic.captureImage(t,path) -def run(): - # x = image_maker.createImage(parsing.parseTerm(input("Enter a term: "))) - # image_maker.saveImage(x, "terme") - # x.show() - logic.beta_reduction_interactive_totale(parsing.parseTerm(input("Enter a term: "))) - # x = logic.new_var('x') - # y = logic.new_var('y') - # print(logic.to_string(logic.new_app(y,logic.new_app(x,logic.new_app(x,x))))) - - -run() \ No newline at end of file diff --git a/menu.py b/menu.py new file mode 100644 index 0000000000000000000000000000000000000000..f305e7aee7772089863a09c0a29eb22f6c4d7a29 --- /dev/null +++ b/menu.py @@ -0,0 +1,106 @@ +import main +import logic +import parsing +import image_maker +import app_functions +import os +import time +import pyfiglet +clear = lambda: os.system('cls') + +welcome_banner = pyfiglet.figlet_format('LambdaCalculus Interpreter') +good_bye_banner = pyfiglet.figlet_format('Goodbye!') + +main_menu_options = { + 1: 'Beta-Reduction', + 2: 'Interactive Beta-Reduction', + 3: 'Arithmetic Operations', + 4: 'Show Numbers', + 5: 'Exit', +} + +arithmetic_operatins_options = { + 1: 'Addition', + 2: 'Subtraction', + 3: 'Multiplication', + 4: 'Back', +} + +def print_menu(options): + for key, value in options.items(): + print(key,'--',value) + +def run_main_menu(): + print(welcome_banner) + print_menu(main_menu_options) + choice = int(input('Enter your choice: ')) + while choice not in main_menu_options: + choice = int(input('Invalid choice. Enter your choice: ')) + if choice == 1: + clear() + terme1 = input('Enter a term: ') + main.run_beta_reduction_totale(terme1,'beta_reduction_totale') + clear() + print('Done!') + time.sleep(1) + logic.image_counter = 0 + clear() + run_main_menu() + elif choice == 2: + clear() + terme2 = input('Enter a term: ') + main.run_beta_reduction_interactive_totale(terme2,'beta_reduction_interactive_totale') + clear() + print('Done!') + logic.image_counter = 0 + time.sleep(1) + clear() + run_main_menu() + elif choice == 3: + clear() + run_arithmetic_operations_menu() + elif choice == 4: + clear() + main.run_show_numbers('show_numbers') + logic.image_counter = 0 + time.sleep(3) + clear() + run_main_menu() + elif choice == 5: + clear() + print(good_bye_banner) + else: + print('Invalid choice') + run_main_menu() + +def run_arithmetic_operations_menu(): + print_menu(arithmetic_operatins_options) + choice = int(input('Enter your choice: ')) + while choice not in arithmetic_operatins_options: + choice = int(input('Invalid choice. Enter your choice: ')) + if choice == 1: + clear() + print('addition COMING SOON...') + time.sleep(1) + clear() + run_arithmetic_operations_menu() + elif choice == 2: + clear() + print('subtraction COMING SOON...') + time.sleep(1) + clear() + run_arithmetic_operations_menu() + elif choice == 3: + clear() + print('multiplication COMING SOON...') + time.sleep(1) + clear() + run_arithmetic_operations_menu() + elif choice == 4: + clear() + run_main_menu() + +run_main_menu() + + + diff --git a/parsing.py b/parsing.py index 8a2478314015e9f7d52bb7a3d66f870b0f72b5b3..e9b7229ec9c59de8296a6eb47b2bffc1a777e2d1 100644 --- a/parsing.py +++ b/parsing.py @@ -196,7 +196,6 @@ def extract_terms(text): def buildApp(terme): assert (checkType(terme) == APP) liste_de_termes = extract_terms(terme) - print(liste_de_termes) if terme[0]!='(': n = len(liste_de_termes) if n == 0: diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..15d8f8a1572e76f0cce62963292c9cad6031a0fd --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +os +time +pyfiglet \ No newline at end of file