#!/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 buffer empty ==> =g> isa math_goal op sub_retrieve +retrieval> isa math_op op add result =arg1 arg2 =arg2 """, ) # Can remember addition fact, addition done # TODO: save all sub-facts as addition facts? sub_retrieve_success = Model.productionstring( name="sub_retrieve_success", string=""" =g> isa math_goal op sub_retrieve arg1 =arg1 arg2 =arg2 =retrieval> isa math_op op add arg1 =result arg2 =arg2 result =arg1 ==> =g> isa math_goal op done result =result +imaginal> isa math_op op add arg1 =result arg2 =arg2 result =arg1 ~retrieval> """, ) sub_retrieve_failure = Model.productionstring( name="sub_retrieve_failure", string=""" =g> isa math_goal op sub_retrieve 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> buffer empty 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> buffer empty 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> buffer empty 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> buffer empty 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