diff options
Diffstat (limited to 'modeling/productions_math.py')
-rw-r--r-- | modeling/productions_math.py | 288 |
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() |