j-js commited on
Commit
1457c41
·
verified ·
1 Parent(s): cfcb5d6

Update explainers/explainer_algebra.py

Browse files
Files changed (1) hide show
  1. explainers/explainer_algebra.py +199 -15
explainers/explainer_algebra.py CHANGED
@@ -1,15 +1,199 @@
1
- from explainer_percent import explain_percent
2
- from explainer_ratio import explain_ratio
3
- from explainer_algebra import explain_algebra
4
-
5
-
6
- def route_explainer(text: str):
7
- for fn in (
8
- explain_percent,
9
- explain_ratio,
10
- explain_algebra,
11
- ):
12
- result = fn(text)
13
- if result is not None and getattr(result, "understood", False):
14
- return result
15
- return None
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import re
2
+ from .explainer_types import ExplainerResult, ExplainerScaffold
3
+
4
+
5
+ _ALGEBRA_PATTERNS = [
6
+ r"=",
7
+ r"\bsolve\b",
8
+ r"\bequation\b",
9
+ r"\bexpression\b",
10
+ r"\bvalue of\b",
11
+ r"\bwhat is x\b",
12
+ r"\bwhat is y\b",
13
+ r"\bvariable\b",
14
+ ]
15
+
16
+
17
+ def _looks_like_algebra_question(text: str) -> bool:
18
+ low = (text or "").lower()
19
+
20
+ if re.search(r"\b[xyzab]\b", low) and "=" in low:
21
+ return True
22
+ if any(re.search(p, low) for p in _ALGEBRA_PATTERNS):
23
+ return True
24
+ return False
25
+
26
+
27
+ def _infer_algebra_subtype(text: str) -> str:
28
+ low = (text or "").lower()
29
+
30
+ if any(k in low for k in ["system", "simultaneous", "x and y", "two equations"]):
31
+ return "system"
32
+ if any(k in low for k in ["inequality", "<", ">", "at least", "at most", "no more than"]):
33
+ return "inequality"
34
+ if any(k in low for k in ["quadratic", "squared", "^2", "x2", "root", "factor"]):
35
+ return "quadratic"
36
+ if any(k in low for k in ["expression", "value of 2x", "value of x +", "in terms of"]):
37
+ return "expression_evaluation"
38
+ if "=" in low:
39
+ return "linear_equation"
40
+ return "generic_algebra"
41
+
42
+
43
+ def explain_algebra_question(text: str):
44
+ if not _looks_like_algebra_question(text):
45
+ return None
46
+
47
+ subtype = _infer_algebra_subtype(text)
48
+
49
+ result = ExplainerResult(
50
+ understood=True,
51
+ topic="algebra",
52
+ summary="This is an algebra problem. The main goal is to translate the wording into a clean symbolic relationship and isolate the requested quantity step by step."
53
+ )
54
+
55
+ scaffold = ExplainerScaffold(
56
+ concept="Algebra represents unknown quantities symbolically, then uses valid transformations to isolate or compare them.",
57
+ ask="Identify the unknown, identify the governing relationship, and check whether the question wants the variable itself or an expression built from it.",
58
+ target="Set up the simplest correct equation or relation before manipulating it.",
59
+ answer_hidden=True,
60
+ )
61
+
62
+ teaching_points = [
63
+ "Most algebra errors happen before the solving starts: either the variable is misdefined, or the equation is set up incorrectly.",
64
+ "A clean equation makes the solving steps much easier.",
65
+ "You should always check whether the question asks for x itself or for something derived from x."
66
+ ]
67
+
68
+ if subtype == "linear_equation":
69
+ scaffold.setup_actions = [
70
+ "Identify the unknown and write the equation cleanly.",
71
+ "Simplify each side if needed.",
72
+ "Undo operations in a logical order to isolate the variable."
73
+ ]
74
+ scaffold.intermediate_steps = [
75
+ "Combine like terms first when possible.",
76
+ "Move variable terms and constant terms carefully.",
77
+ "Check whether the final result should be the variable or a substituted expression."
78
+ ]
79
+ scaffold.first_move = "Rewrite the relationship as one clean equation if it is not already in that form."
80
+ scaffold.next_hint = "Simplify both sides before isolating the variable."
81
+ scaffold.variables_to_define = [
82
+ "Let the unknown quantity be x if the question has not already named it."
83
+ ]
84
+ scaffold.equations_to_form = [
85
+ "Build one equation from the stated relationship."
86
+ ]
87
+ scaffold.common_traps = [
88
+ "Moving terms across the equals sign incorrectly.",
89
+ "Trying to isolate the variable before simplifying.",
90
+ "Finding x and forgetting the question asks for something like 2x or x + 3."
91
+ ]
92
+
93
+ elif subtype == "system":
94
+ scaffold.setup_actions = [
95
+ "Identify the separate equations and unknowns.",
96
+ "Decide whether substitution or elimination is the cleaner method.",
97
+ "Reduce the system to one variable before solving completely."
98
+ ]
99
+ scaffold.intermediate_steps = [
100
+ "Make one variable easy to substitute, or align coefficients for elimination.",
101
+ "After finding one variable, substitute back carefully.",
102
+ "Check whether the question asks for one variable, both variables, or a combination of them."
103
+ ]
104
+ scaffold.first_move = "Choose one variable to eliminate or substitute."
105
+ scaffold.next_hint = "Turn the system into a single-variable equation before solving."
106
+ scaffold.equations_to_form = [
107
+ "Use the two given equations together to reduce to one unknown."
108
+ ]
109
+ scaffold.common_traps = [
110
+ "Mixing substitution and elimination without a clear plan.",
111
+ "Arithmetic mistakes when substituting back.",
112
+ "Stopping after finding one variable when the question asks for something else."
113
+ ]
114
+
115
+ elif subtype == "inequality":
116
+ scaffold.setup_actions = [
117
+ "Translate the condition into an inequality.",
118
+ "Manipulate it like an equation, but track the inequality direction carefully.",
119
+ "Reverse the sign only if multiplying or dividing by a negative number."
120
+ ]
121
+ scaffold.intermediate_steps = [
122
+ "Simplify both sides first if possible.",
123
+ "Isolate the variable systematically.",
124
+ "Interpret the final solution set in the form the question wants."
125
+ ]
126
+ scaffold.first_move = "Set up the inequality carefully from the wording."
127
+ scaffold.next_hint = "Solve it step by step, watching for any operation that would reverse the sign."
128
+ scaffold.common_traps = [
129
+ "Forgetting to reverse the inequality when dividing or multiplying by a negative.",
130
+ "Treating phrase-based conditions like at least or no more than incorrectly.",
131
+ "Reporting a single number when the solution is actually a range."
132
+ ]
133
+
134
+ elif subtype == "quadratic":
135
+ scaffold.setup_actions = [
136
+ "Rewrite the equation so one side is zero if needed.",
137
+ "Look for factoring, structure, or another simplifying method.",
138
+ "Treat each factor or case carefully once the equation is structured properly."
139
+ ]
140
+ scaffold.intermediate_steps = [
141
+ "Factor if the form allows it.",
142
+ "Otherwise identify another clean solving route.",
143
+ "Check whether all resulting values are allowed in the original context."
144
+ ]
145
+ scaffold.first_move = "Put the expression into a standard structured form before solving."
146
+ scaffold.next_hint = "Then look for a factorable pattern or another clean route."
147
+ scaffold.common_traps = [
148
+ "Trying to factor before the expression is fully simplified.",
149
+ "Dropping one valid case.",
150
+ "Giving roots when the question asks for a derived expression instead."
151
+ ]
152
+
153
+ elif subtype == "expression_evaluation":
154
+ scaffold.setup_actions = [
155
+ "Find the variable or relationship first.",
156
+ "Only then substitute into the requested expression.",
157
+ "Simplify the final expression carefully."
158
+ ]
159
+ scaffold.intermediate_steps = [
160
+ "Do not stop when you find the variable unless that is exactly what the question asks.",
161
+ "Preserve parentheses during substitution.",
162
+ "Check whether there is a shortcut using the given relationship directly."
163
+ ]
164
+ scaffold.first_move = "Work out whether you need to solve for the variable first or can rewrite the target expression directly."
165
+ scaffold.next_hint = "Once the relationship is clear, substitute only into the exact expression the question asks for."
166
+ scaffold.common_traps = [
167
+ "Stopping at x when the question asks for something built from x.",
168
+ "Substituting incorrectly into expressions with multiple terms.",
169
+ "Ignoring an easier algebraic simplification path."
170
+ ]
171
+
172
+ else:
173
+ scaffold.setup_actions = [
174
+ "Define the unknown clearly.",
175
+ "Translate the wording into a symbolic relationship.",
176
+ "Manipulate the relationship only after the setup is clean."
177
+ ]
178
+ scaffold.intermediate_steps = [
179
+ "Simplify before isolating.",
180
+ "Keep track of what the question actually asks for.",
181
+ "Check the final quantity against the prompt."
182
+ ]
183
+ scaffold.first_move = "Start by translating the words into one clean symbolic statement."
184
+ scaffold.next_hint = "Then simplify the structure before solving."
185
+ scaffold.common_traps = [
186
+ "Poor variable definition.",
187
+ "Messy setup before solving.",
188
+ "Answering the wrong final quantity."
189
+ ]
190
+
191
+ result.teaching_points = teaching_points
192
+ result.scaffold = scaffold
193
+ result.meta = {
194
+ "intent": "explain_question",
195
+ "bridge_ready": True,
196
+ "hint_style": "step_ready",
197
+ "subtype": subtype,
198
+ }
199
+ return result