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