From 4721cd226e693c1933c22d643d982d29e9b59121 Mon Sep 17 00:00:00 2001
From: Niclas Dobbertin <niclas.dobbertin@mailbox.org>
Date: Fri, 5 Jul 2024 15:18:04 +0200
Subject: added subtraction

---
 modeling/model_env.py        |   2 +-
 modeling/prod_subtraction.py | 600 +++++++++++++++++++++++++++++++++++++++++++
 modeling/productions_math.py |   4 +-
 3 files changed, 604 insertions(+), 2 deletions(-)
 create mode 100644 modeling/prod_subtraction.py

(limited to 'modeling')

diff --git a/modeling/model_env.py b/modeling/model_env.py
index ab4b219..473995e 100644
--- a/modeling/model_env.py
+++ b/modeling/model_env.py
@@ -8,7 +8,7 @@ def get_env():
 
     # Variables
     screen["Algen"] = {"text": "Algen", "position": (100, 100)}
-    screen["AlgenVar"] = {"text": "1", "position": (100, 200)}
+    screen["AlgenVar"] = {"text": "3", "position": (100, 200)}
     screen["Mineralien"] = {"text": "Mineralien", "position": (200, 100)}
     screen["MineralienVar"] = {"text": "2", "position": (200, 200)}
 
diff --git a/modeling/prod_subtraction.py b/modeling/prod_subtraction.py
new file mode 100644
index 0000000..a0ac8b7
--- /dev/null
+++ b/modeling/prod_subtraction.py
@@ -0,0 +1,600 @@
+#!/usr/bin/env python3
+
+
+def subtraction(Model):
+    prods = []
+
+    start_sub = Model.productionstring(
+        name="start_sub",
+        string="""
+        =g>
+        isa         math_goal
+        op          sub
+        arg1        =arg1
+        arg2        =arg2
+        ?retrieval>
+        state       free
+        ==>
+        =g>
+        isa         math_goal
+        +retrieval>
+        isa         math_op
+        op          sub
+        arg1        =arg1
+        arg2        =arg2
+        """,
+    )
+
+    # Can remember addition fact, addition done
+    sub_retrieve_success = Model.productionstring(
+        name="sub_retrieve_success",
+        string="""
+        =g>
+        isa         math_goal
+        op          sub
+        arg1        =arg1
+        arg2        =arg1
+        =retrieval>
+        isa         math_op
+        op          add
+        arg1        =arg1
+        arg2        =arg2
+        result      =result
+        ==>
+        =g>
+        isa         math_goal
+        op          done
+        result      =result
+        +imaginal>
+        isa             math_op
+        op              sub
+        arg1            =arg1
+        arg2            =arg2
+        result          =result
+        ~retrieval>
+        """,
+    )
+    sub_retrieve_failure = Model.productionstring(
+        name="sub_retrieve_failure",
+        string="""
+        =g>
+        isa         math_goal
+        op          sub
+        ones1        =num1
+        ones2        =num2
+        ?retrieval>
+        state       error
+        ==>
+        =g>
+        isa         math_goal
+        op          sub_ones
+        ones_carry      0
+        tens_carry      0
+        +retrieval>
+        isa         math_op
+        op          greater
+        arg1        =num1
+        arg2        =num2
+        """,
+    )
+
+    sub_ones_ok = Model.productionstring(
+        name="sub_ones_ok",
+        string="""
+        =g>
+        isa         math_goal
+        op          sub_ones
+        ones1        =num1
+        ones2        =num2
+        =retrieval>
+        isa         math_op
+        op          greater
+        arg1        =num1
+        arg2        =num2
+        result      =num1
+        ==>
+        =g>
+        isa         math_goal
+        op          sub_ones
+        +retrieval>
+        isa         math_op
+        op          add
+        result      =num1
+        arg1        =num2
+        """,
+    )
+
+    # subtrahent greater than minuent
+    sub_ones_too_large_start = Model.productionstring(
+        name="sub_ones_too_large_start",
+        string="""
+        =g>
+        isa         math_goal
+        op          sub_ones
+        ones1        =num1
+        ones2        =num2
+        =retrieval>
+        isa         math_op
+        op          greater
+        arg1        =num1
+        arg2        =num2
+        result      =num2
+        ==>
+        =g>
+        isa         math_goal
+        op          sub_ones_large
+        ones_carry  1
+        +retrieval>
+        isa         math_op
+        op          add
+        arg1        =num1
+        arg2        10
+        """,
+    )
+    sub_ones_too_large_done = Model.productionstring(
+        name="sub_ones_too_large_done",
+        string="""
+        =g>
+        isa         math_goal
+        op          sub_ones_large
+        ones1        =num1
+        ones2        =num2
+        ones_carry  1
+        =retrieval>
+        isa         math_op
+        op          add
+        arg1        =num1
+        arg2        10
+        result      =result
+        ==>
+        =g>
+        isa         math_goal
+        op          sub_ones
+        +retrieval>
+        isa         math_op
+        op          add
+        result      =result
+        arg1        =num2
+        """,
+    )
+
+    sub_ones_done = Model.productionstring(
+        name="sub_ones_done",
+        string="""
+        =g>
+        isa         math_goal
+        op          sub_ones
+        ones2        =num2
+        =retrieval>
+        isa         math_op
+        op          add
+        arg1        =num2
+        arg2        =result
+        ==>
+        =g>
+        isa         math_goal
+        op          sub_tens
+        ones_ans    =result
+        ~retrieval>
+        """,
+    )
+
+    sub_tens_with_carry = Model.productionstring(
+        name="sub_tens_with_carry",
+        string="""
+        =g>
+        isa         math_goal
+        op          sub_tens
+        tens1        =num1
+        tens2        =num2
+        ones_carry  1
+        ?retrieval>
+        state       free
+        ==>
+        =g>
+        isa         math_goal
+        op          sub_tens
+        +retrieval>
+        isa         math_op
+        op          add
+        arg1        1
+        arg2        =num2
+        """,
+    )
+    sub_tens_with_carry_done = Model.productionstring(
+        name="sub_tens_with_carry_done",
+        string="""
+        =g>
+        isa         math_goal
+        op          sub_tens
+        tens1        =num1
+        tens2        =num2
+        ones_carry  1
+        =retrieval>
+        isa         math_op
+        op          add
+        arg1        1
+        arg2        =num2
+        result      ~10
+        result      =result
+        ==>
+        =g>
+        isa         math_goal
+        op          sub_tens
+        ones_carry  0
+        tens2       =result
+        ~retrieval>
+        """,
+    )
+    sub_tens_with_carry_done_10 = Model.productionstring(
+        name="sub_tens_with_carry_done_10",
+        string="""
+        =g>
+        isa         math_goal
+        op          sub_tens
+        tens1        =num1
+        tens2        =num2
+        ones_carry  1
+        =retrieval>
+        isa         math_op
+        op          add
+        arg1        1
+        arg2        =num2
+        result      10
+        ==>
+        =g>
+        isa         math_goal
+        op          sub_tens
+        ones_carry  0
+        tens_carry  1
+        tens2       0
+        ~retrieval>
+        """,
+    )
+
+    sub_tens_no_carry = Model.productionstring(
+        name="sub_tens_no_carry",
+        string="""
+        =g>
+        isa         math_goal
+        op          sub_tens
+        tens1        =num1
+        tens2        =num2
+        ones_carry  0
+        ?retrieval>
+        state       free
+        ==>
+        =g>
+        isa         math_goal
+        op          sub_tens
+        +retrieval>
+        isa         math_op
+        op          greater
+        arg1        =num1
+        arg2        =num2
+        """,
+    )
+    sub_tens_ok = Model.productionstring(
+        name="sub_tens_ok",
+        string="""
+        =g>
+        isa         math_goal
+        op          sub_tens
+        tens1        =num1
+        tens2        =num2
+        =retrieval>
+        isa         math_op
+        op          greater
+        arg1        =num1
+        arg2        =num2
+        result      =num1
+        ==>
+        =g>
+        isa         math_goal
+        op          sub_tens
+        +retrieval>
+        isa         math_op
+        op          add
+        result      =num1
+        arg1        =num2
+        """,
+    )
+
+    # subtrahent greater than minuent
+    sub_tens_too_large_start = Model.productionstring(
+        name="sub_tens_too_large_start",
+        string="""
+        =g>
+        isa         math_goal
+        op          sub_tens
+        tens1        =num1
+        tens2        =num2
+        =retrieval>
+        isa         math_op
+        op          greater
+        arg1        =num1
+        arg2        =num2
+        result      =num2
+        ==>
+        =g>
+        isa         math_goal
+        op          sub_tens
+        tens_carry  1
+        +retrieval>
+        isa         math_op
+        op          add
+        arg1        =num1
+        arg2        10
+        """,
+    )
+    sub_tens_too_large_done = Model.productionstring(
+        name="sub_tens_too_large_done",
+        string="""
+        =g>
+        isa         math_goal
+        op          sub_tens
+        tens1        =num1
+        tens2        =num2
+        tens_carry  1
+        =retrieval>
+        isa         math_op
+        op          add
+        arg1        =num1
+        arg2        10
+        result      =result
+        ==>
+        =g>
+        isa         math_goal
+        op          sub_tens
+        +retrieval>
+        isa         math_op
+        op          add
+        result      =result
+        arg1        =num2
+        """,
+    )
+
+    sub_tens_done = Model.productionstring(
+        name="sub_tens_done",
+        string="""
+        =g>
+        isa         math_goal
+        op          sub_tens
+        tens2        =num2
+        =retrieval>
+        isa         math_op
+        op          add
+        arg1        =num2
+        arg2        =result
+        ==>
+        =g>
+        isa         math_goal
+        op          sub_hundreds
+        tens_ans    =result
+        ~retrieval>
+        """,
+    )
+
+    sub_hundreds_with_carry = Model.productionstring(
+        name="sub_hundreds_with_carry",
+        string="""
+        =g>
+        isa         math_goal
+        op          sub_hundreds
+        hundreds1        =num1
+        hundreds2        =num2
+        tens_carry  1
+        ?retrieval>
+        state       free
+        ==>
+        =g>
+        isa         math_goal
+        op          sub_hundreds
+        +retrieval>
+        isa         math_op
+        op          add
+        arg1        1
+        arg2        =num2
+        """,
+    )
+    sub_hundreds_with_carry_done = Model.productionstring(
+        name="sub_hundreds_with_carry_done",
+        string="""
+        =g>
+        isa         math_goal
+        op          sub_hundreds
+        hundreds1        =num1
+        hundreds2        =num2
+        tens_carry  1
+        =retrieval>
+        isa         math_op
+        op          add
+        arg1        1
+        arg2        =num2
+        result      ~10
+        result      =result
+        ==>
+        =g>
+        isa         math_goal
+        op          sub_hundreds
+        tens_carry  0
+        hundreds2       =result
+        ~retrieval>
+        """,
+    )
+    sub_hundreds_with_carry_done_10 = Model.productionstring(
+        name="sub_hundreds_with_carry_done_10",
+        string="""
+        =g>
+        isa         math_goal
+        op          sub_hundreds
+        hundreds1        =num1
+        hundreds2        =num2
+        tens_carry  1
+        =retrieval>
+        isa         math_op
+        op          add
+        arg1        1
+        arg2        =num2
+        result      10
+        ==>
+        =g>
+        isa         math_goal
+        op          sub_hundreds
+        tens_carry  0
+        hundreds_carry  1
+        hundreds2       0
+        ~retrieval>
+        """,
+    )
+
+    sub_hundreds_no_carry = Model.productionstring(
+        name="sub_hundreds_no_carry",
+        string="""
+        =g>
+        isa         math_goal
+        op          sub_hundreds
+        hundreds1        =num1
+        hundreds2        =num2
+        tens_carry  0
+        ?retrieval>
+        state       free
+        ==>
+        =g>
+        isa         math_goal
+        op          sub_hundreds
+        +retrieval>
+        isa         math_op
+        op          greater
+        arg1        =num1
+        arg2        =num2
+        """,
+    )
+    sub_hundreds_ok = Model.productionstring(
+        name="sub_hundreds_ok",
+        string="""
+        =g>
+        isa         math_goal
+        op          sub_hundreds
+        hundreds1        =num1
+        hundreds2        =num2
+        =retrieval>
+        isa         math_op
+        op          greater
+        arg1        =num1
+        arg2        =num2
+        result      =num1
+        ==>
+        =g>
+        isa         math_goal
+        op          sub_hundreds
+        +retrieval>
+        isa         math_op
+        op          add
+        result      =num1
+        arg1        =num2
+        """,
+    )
+
+    # subtrahent greater than minuent
+    sub_hundreds_too_large_start = Model.productionstring(
+        name="sub_hundreds_too_large_start",
+        string="""
+        =g>
+        isa         math_goal
+        op          sub_hundreds
+        hundreds1        =num1
+        hundreds2        =num2
+        =retrieval>
+        isa         math_op
+        op          greater
+        arg1        =num1
+        arg2        =num2
+        result      =num2
+        ==>
+        =g>
+        isa         math_goal
+        op          sub_hundreds
+        hundreds_carry  1
+        +retrieval>
+        isa         math_op
+        op          add
+        arg1        =num1
+        arg2        10
+        """,
+    )
+    sub_hundreds_too_large_done = Model.productionstring(
+        name="sub_hundreds_too_large_done",
+        string="""
+        =g>
+        isa         math_goal
+        op          sub_hundreds
+        hundreds1        =num1
+        hundreds2        =num2
+        hundreds_carry  1
+        =retrieval>
+        isa         math_op
+        op          add
+        arg1        =num1
+        arg2        10
+        result      =result
+        ==>
+        =g>
+        isa         math_goal
+        op          sub_hundreds
+        +retrieval>
+        isa         math_op
+        op          add
+        result      =result
+        arg1        =num2
+        """,
+    )
+
+    sub_hundreds_done = Model.productionstring(
+        name="sub_hundreds_done",
+        string="""
+        =g>
+        isa         math_goal
+        op          sub_hundreds
+        hundreds1        =num1
+        hundreds2        =num2
+        =retrieval>
+        isa         math_op
+        op          add
+        arg1        =num2
+        arg2        =result
+        ==>
+        =g>
+        isa         math_goal
+        op          sub_done
+        hundreds_ans    =result
+        ~retrieval>
+        """,
+    )
+
+    sub_done = Model.productionstring(
+        name="sub_done",
+        string="""
+        =g>
+        isa             math_goal
+        op              sub_done
+        arg1            =arg1
+        arg2            =arg2
+        result          ~None
+        result          =result
+        ==>
+        +imaginal>
+        isa             math_op
+        op              sub
+        arg1            =arg1
+        arg2            =arg2
+        result          =result
+        =g>
+        isa             math_goal
+        op              done
+        ones_carry      None
+        tens_carry      None
+        ~retrieval>
+        """,
+    )
+    return prods
diff --git a/modeling/productions_math.py b/modeling/productions_math.py
index aa06ffb..7d7a94d 100644
--- a/modeling/productions_math.py
+++ b/modeling/productions_math.py
@@ -4,6 +4,7 @@ import pyactr as actr
 
 from model_init import init
 import prod_addition
+import prod_subtraction
 import prod_comp
 import prod_multi
 import prod_numbers
@@ -54,13 +55,14 @@ def start():
         # op, arg1, arg2 = wait_input()
         Model, DM, goal, imaginal, env = init()
         # add_goal(goal, op, arg1, arg2)
-        add_proc(goal, "proc3")
+        add_proc(goal, "proc1")
         envs = model_env.get_env()
 
         general_prod(Model)
         prod_procedure.procedures(Model)
         number_prods = prod_numbers.number(Model)
         add_prods = prod_addition.addition(Model)
+        sub_prods = prod_subtraction.subtraction(Model)
         greater_prods = prod_comp.greater_than(Model)
         less_prods = prod_comp.lesser_than(Model)
         multi_prods = prod_multi.multiplication(Model)
-- 
cgit v1.2.3