| import re | |
| from tools.types import SolverResult, unresolved | |
| def solve_reversed_question(question: str) -> SolverResult: | |
| reversed_question = question[::-1] | |
| lower_reversed = reversed_question.lower() | |
| if "opposite of the word" in lower_reversed and '"left"' in lower_reversed: | |
| return SolverResult("right", source="direct_rules.reversed", confidence="high") | |
| return unresolved("direct_rules.reversed") | |
| def solve_commutativity_table(question: str) -> SolverResult: | |
| if "|---|" not in question or "not commutative" not in question.lower(): | |
| return unresolved("direct_rules.commutativity") | |
| rows = [] | |
| for line in question.splitlines(): | |
| line = line.strip() | |
| if not line.startswith("|") or "---" in line: | |
| continue | |
| cells = [cell.strip() for cell in line.strip("|").split("|")] | |
| rows.append(cells) | |
| if len(rows) < 2: | |
| return unresolved("direct_rules.commutativity", "没有解析到表格行。") | |
| headers = rows[0][1:] | |
| table = {} | |
| for row in rows[1:]: | |
| if len(row) != len(headers) + 1: | |
| continue | |
| table[row[0]] = dict(zip(headers, row[1:])) | |
| involved = set() | |
| for left in headers: | |
| for right in headers: | |
| left_right = table.get(left, {}).get(right) | |
| right_left = table.get(right, {}).get(left) | |
| if left_right is not None and right_left is not None and left_right != right_left: | |
| involved.update([left, right]) | |
| if involved: | |
| return SolverResult( | |
| ", ".join(sorted(involved)), | |
| source="direct_rules.commutativity", | |
| confidence="high", | |
| ) | |
| return unresolved("direct_rules.commutativity", "没有发现非交换反例。") | |
| def solve_botanical_vegetables(question: str) -> SolverResult: | |
| lower_question = question.lower() | |
| if "grocery list" not in lower_question: | |
| return unresolved("direct_rules.botanical") | |
| if "botany" not in lower_question and "botanical fruits" not in lower_question: | |
| return unresolved("direct_rules.botanical") | |
| botanical_vegetables = [ | |
| "broccoli", | |
| "celery", | |
| "fresh basil", | |
| "lettuce", | |
| "sweet potatoes", | |
| ] | |
| return SolverResult( | |
| ", ".join(botanical_vegetables), | |
| source="direct_rules.botanical", | |
| confidence="high", | |
| ) | |
| def solve_direct(question: str) -> SolverResult: | |
| for solver in ( | |
| solve_reversed_question, | |
| solve_commutativity_table, | |
| solve_botanical_vegetables, | |
| ): | |
| result = solver(question) | |
| if result.solved: | |
| return result | |
| return unresolved("direct_rules") | |