#!/usr/bin/env python3 import pyactr as actr import prod_addition import prod_comp # https://stackoverflow.com/a/39644726 def get_digit(number, n): return number // 10**n % 10 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 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), ) ) # 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"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(): # Model.productionstring( # name="init_math_op", # string=""" # =g> # isa math_op # task None # arg1 =num1 # arg2 =num2 # ==> # +retrieval> # isa number # number =num1 # =g> # task unwind_left # """, # ) Model.productionstring( name="terminate_op", string=""" =g> isa math_goal task finished_op =imaginal> isa math_op result =answer ==> ~g>""", ) 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) less_prods = prod_comp.less_than(Model) for prod in add_prods: print(prod) print("\n") 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()