summaryrefslogtreecommitdiff
path: root/modeling/productions_math.py
diff options
context:
space:
mode:
Diffstat (limited to 'modeling/productions_math.py')
-rw-r--r--modeling/productions_math.py288
1 files changed, 130 insertions, 158 deletions
diff --git a/modeling/productions_math.py b/modeling/productions_math.py
index 93c7762..8a2ebc2 100644
--- a/modeling/productions_math.py
+++ b/modeling/productions_math.py
@@ -2,52 +2,7 @@
import pyactr as actr
import prod_addition
-
-Model = actr.ACTRModel()
-
-DM = Model.decmem
-goal = Model.goal
-imaginal = Model.set_goal(name="imaginal", delay=0)
-
-actr.chunktype("number", ("number", "next", "ones", "tens", "hundreds"))
-actr.chunktype("math_goal", ("op", "task"))
-actr.chunktype(
- "math_op",
- (
- "op",
- "arg1",
- "arg2",
- "result",
- "hundreds1",
- "tens1",
- "ones1",
- "hundreds2",
- "tens2",
- "ones2",
- "hundreds_ans",
- "tens_ans",
- "ones_ans",
- "carry_ones",
- "carry_tens",
- ),
-)
-
-goal.add(actr.makechunk("", "math_goal", op="add", task="calc"))
-imaginal.add(
- actr.makechunk(
- "",
- "math_op",
- op="add",
- arg1=249,
- arg2=159,
- ones1=9,
- tens1=4,
- hundreds1=2,
- ones2=9,
- tens2=5,
- hundreds2=1,
- )
-)
+import prod_comp
# https://stackoverflow.com/a/39644726
@@ -55,48 +10,99 @@ def get_digit(number, n):
return number // 10**n % 10
-# Add numbers 0-999 to decmem
-for i in range(0, 1000):
- DM.add(
- actr.makechunk(
- f"number{str(i)}",
- "number",
- number=i,
- next=i + 1,
- ones=get_digit(i, 0),
- tens=get_digit(i, 1),
- hundreds=get_digit(i, 2),
- )
+def init():
+ Model = actr.ACTRModel()
+
+ DM = Model.decmem
+ goal = Model.goal
+ imaginal = Model.set_goal(name="imaginal", delay=0)
+
+ actr.chunktype("number", ("number", "next", "ones", "tens", "hundreds"))
+ actr.chunktype("math_goal", ("op", "task"))
+ actr.chunktype(
+ "math_op",
+ (
+ "op",
+ "arg1",
+ "arg2",
+ "result",
+ "hundreds1",
+ "tens1",
+ "ones1",
+ "hundreds2",
+ "tens2",
+ "ones2",
+ "hundreds_ans",
+ "tens_ans",
+ "ones_ans",
+ "carry_ones",
+ "carry_tens",
+ ),
)
-# Add comparison relations to single digit numbers
-for i in range(0, 11):
- for j in range(0, 11):
+
+ # Add numbers 0-999 to decmem
+ for i in range(0, 1000):
DM.add(
actr.makechunk(
- f"greater{i}{j}",
- "math_op",
- op="greater",
- arg1=i,
- arg2=j,
- result=max(i, j),
+ f"number{str(i)}",
+ "number",
+ number=i,
+ next=i + 1,
+ ones=get_digit(i, 0),
+ tens=get_digit(i, 1),
+ hundreds=get_digit(i, 2),
)
)
- DM.add(
- actr.makechunk(
- f"lesser{i}{j}",
- "math_op",
- op="lesser",
- arg1=i,
- arg2=j,
- result=min(i, j),
+
+ # Add comparison relations to single digit numbers
+ for i in range(0, 11):
+ for j in range(0, 11):
+ DM.add(
+ actr.makechunk(
+ f"greater{i}{j}",
+ "math_op",
+ op="greater",
+ arg1=i,
+ arg2=j,
+ result=max(i, j),
+ )
)
- )
- DM.add(
- actr.makechunk(
- f"plus{i}{j}", "math_op", op="add", arg1=i, arg2=j, result=i + j
+ DM.add(
+ actr.makechunk(
+ f"lesser{i}{j}",
+ "math_op",
+ op="lesser",
+ arg1=i,
+ arg2=j,
+ result=min(i, j),
+ )
+ )
+ DM.add(
+ actr.makechunk(
+ f"plus{i}{j}", "math_op", op="add", arg1=i, arg2=j, result=i + j
+ )
)
+ return Model, DM, goal, imaginal
+
+def add_goal(goal, imaginal, op, arg1, arg2):
+
+ goal.add(actr.makechunk("", "math_goal", op=op, task="calc"))
+ imaginal.add(
+ actr.makechunk(
+ "",
+ "math_op",
+ op=op,
+ arg1=arg1,
+ arg2=arg2,
+ ones1=get_digit(arg1, 0),
+ tens1=get_digit(arg1, 1),
+ hundreds1=get_digit(arg1, 2),
+ ones2=get_digit(arg2, 0),
+ tens2=get_digit(arg2, 1),
+ hundreds2=get_digit(arg2, 2),
)
+ )
def unwind_prod():
@@ -131,82 +137,48 @@ def unwind_prod():
)
-def greater_than_prod():
- # TODO: if two numbers are equal, extra effort to determine greater one?
- prod_start = Model.productionstring(
- name="greater_start",
- string="""
- =g>
- isa math_goal
- task calc
- =imaginal>
- isa math_op
- op greater
- hundreds1 =hun1
- hundreds2 =hun1
- tens1 =tens1
- tens2 =tens1
- ones1 =ones1
- ones2 ~=ones1
- ones2 =ones2
- ==>
- +retrieval>
- isa math_op
- op greater
- arg1 =ones1
- arg2 =ones2
- """,
- )
- print(prod_start)
-
- Model.productionstring(
- name="greater_end",
- string="""
- =g>
- isa math_goal
- =imaginal>
- op greater
- =retrieval>
- isa math_op
- op greater
- result =ans
- ==>
- =imaginal>
- isa math_op
- result =ans
- ~g>
- """,
- )
-
-
-
-# print(DM)
-
-# unwind_prod()
-add_prods = prod_addition.addition(Model)
-# greater_than_prod()
-
-for prod in add_prods:
- print(prod)
- print("\n")
-
-# Model.goal.add(actr.makechunk("goal", "math_op", op="greater", arg1=5, arg2=9))
-print("goal: ", goal)
-print("imaginal: ", imaginal)
-x = Model.simulation()
-x.run()
-print("goal: ", goal)
-print("imaginal: ", imaginal)
-# imaginal.show("hundreds_ans")
-# imaginal.show("tens_ans")
-# imaginal.show("ones_ans")
-result_ones = str(getattr(imaginal._data.copy().pop(), "ones_ans"))
-result_tens = str(getattr(imaginal._data.copy().pop(), "tens_ans"))
-result_huns = str(getattr(imaginal._data.copy().pop(), "hundreds_ans"))
-
-result_num = result_huns + result_tens + result_ones
-print(result_num)
-# print(list(DM))
-numbers = [x for x in list(DM) if x.typename != "number" and x.typename != "math_op"]
-numbers = [x for x in list(DM) if x.typename != "number" and x.typename == "math_op"]
-# print(numbers)
+def wait_input():
+ op = input("op\n")
+ arg1 = input("arg1\n")
+ arg2 = input("arg2\n")
+ return op, int(arg1), int(arg2)
+
+
+def start():
+ while(True):
+ op, arg1, arg2 = wait_input()
+ Model, DM, goal, imaginal = init()
+ add_goal(goal, imaginal, op, arg1, arg2)
+
+ # unwind_prod()
+ add_prods = prod_addition.addition(Model)
+ greater_prods = prod_comp.greater_than(Model)
+
+ for prod in add_prods:
+ print(prod)
+ print("\n")
+
+ # Model.goal.add(actr.makechunk("goal", "math_op", op="greater", arg1=5, arg2=9))
+ print("goal: ", goal)
+ print("imaginal: ", imaginal)
+ x = Model.simulation()
+ x.run()
+ print("goal: ", goal)
+ print("imaginal: ", imaginal)
+ # imaginal.show("hundreds_ans")
+ # imaginal.show("tens_ans")
+ # imaginal.show("ones_ans")
+ result_ones = str(getattr(imaginal._data.copy().pop(), "ones_ans"))
+ result_tens = str(getattr(imaginal._data.copy().pop(), "tens_ans"))
+ result_huns = str(getattr(imaginal._data.copy().pop(), "hundreds_ans"))
+
+ result_num = result_huns + result_tens + result_ones
+ print(result_num)
+ # print(list(DM))
+ numbers = [x for x in list(DM) if x.typename != "number" and x.typename != "math_op"]
+ numbers = [x for x in list(DM) if x.typename != "number" and x.typename == "math_op"]
+ # print(numbers)
+
+
+if __name__ == "__main__":
+ start()