/* cs342 homework 7 Dan J. Fraser (1219229) Grammar: question ::= "How much is" number_expression "?" number_expression ::= number number_expression ::= "the sum of" sum_number_list number_expression ::= "the product of" product_number_list sum_number_list ::= number_expression "and" number_expression sum_number_list ::= number_expression "," sum_number_list sum_number_list ::= number_expression "," "and" number_expression product_number_list ::= number_expression "and" number_expression product_number_list ::= number_expression "," product_number_list product_number_list ::= number_expression "," "and" number_expression */ parse("How":"much":"is":Tokens,question(ParseTree)) :- append(B,"?":nil,Tokens), not B = nil, number_expression(B,ParseTree). number_expression(B,number(Y)) :- evaluate_number(B,Y). number_expression(B:nil,number(Y)) :- evaluate_number(B,Y). number_expression("the":"sum":"of":SumExpr,ParseTree) :- sum_number_list(SumExpr,ParseTree). number_expression("the":"product":"of":ProductExpr,ParseTree) :- product_number_list(ProductExpr,ParseTree). sum_number_list(SumExpr,sum(T1,T2)) :- append(T0,",":List,SumExpr), not T0 = nil, number_expression(T0,T1), sum_number_list(List,T2). sum_number_list("and":SumExpr,T1) :- number_expression(SumExpr,T1). sum_number_list(SumExpr,sum(T1,T2)) :- append(T0,"and":List,SumExpr), not T0 = nil, number_expression(T0,T1), number_expression(List,T2). product_number_list(ProductExpr,product(T1,T2)) :- append(T0,",":List,ProductExpr), not T0 = nil, number_expression(T0,T1), product_number_list(List,T2). product_number_list("and":ProductExpr,T1) :- number_expression(ProductExpr,T1). product_number_list(ProductExpr,product(T1,T2)) :- append(T0,"and":List,ProductExpr), not T0 = nil, number_expression(T0,T1), number_expression(List,T2).