تصور کنید دانشآموزی در یک اپلیکیشن موبایل، عددی را از یک طرف تساوی به طرف دیگر میکشاند و سیستم نه تنها این حرکت را میپذیرد، بلکه هر گام غیرمنطقی را در لحظه مسدود میکند. این دقیقاً همان چیزی است که wyrm-math را از ماشینحسابهای سنتی متمایز میکند. این موتور که در ۹ ژوئیه ۲۰۲۶ منتشر شده، بهطور خاص برای رابطهای کاربری تعاملی طراحی شده است که در آنها معادلات از طریق کشیدن و راندن (Dragging) عبارتها حل میشوند. هدف اصلی آن این است که تنها حرکتهای ریاضی قانونی امکانپذیر باشند و عملیاتهای غیرقانونی بهطور ساختاری غیرممکن شوند.
بر خلاف ابزارهای رایج که بر پایه «اعتبارسنجی مرحله نهایی» (Late-stage validation) کار میکنند (جایی که کاربر جواب را وارد میکند و سیستم صحت آن را بررسی میکند)، این موتور بر پایه تبدیلهای گامبهگام کار میکند. طبق مستندات پروژه در گیتهاب (GitHub)، در wyrm-math معادلات هرگز بهمعنای سنتی «اعتبارسنجی» نمیشوند؛ بلکه از طریق قوانین بازنویسی (Rewrite Rules) تکامل مییابند تا حقیقت ریاضی آنها در هر لحظه حفظ شود.
همانطور که در تحلیلهای قبلی ما دربارهی ابزارهای آموزش دیجیتال اشاره کردیم، چالش اصلی همواره توهم مدلهای بصری در نمایش گامهای جبری بوده است. در این سیستم، موتور فقط اجازه جابجایی رقم را نمیدهد، بلکه هر حرکت قانونی موجود در آن وضعیت خاص را محاسبه کرده و به رابط کاربری (UI) اطلاع میدهد. این مکانیسم از «توهم» گامهای جبری نادرست که در ویرایشگرهای صرفاً بصری رایج است، جلوگیری میکند.
بر اساس مستندات فنی این پروژه، wyrm-math با زبان تایپاسکریپت (TypeScript) و بدون هیچ وابستگی خارجی (Zero-dependency) توسعه یافته است. این معماری به آن اجازه میدهد بدون نیاز به DOM در محیطهای مختلف از Node.js، مرورگرها، Workerها یا Webviewهای بومی اجرا شود. این رویکرد در مدیریت رابطهای کاربری پویا، یادآور معماری پروژه y است که پیوندی میان عاملهای هوشمند و UIهای تغییرپذیر برقرار میکند. معماری این سیستم بر چهار ستون اصلی استوار است:
- حساب دقیق (Exact Arithmetic): برای جلوگیری از خطاهای اعشاری (Floating-point errors)، سیستم از اعداد گویا روی bigint استفاده میکند و هرگونه عدد اعشاری را بهطور کامل رد میکند. به همین دلیل مقادیر مانند $\sqrt{2}$ بهجای تقریبهایی مثل ۱.۴۱۴۲، بهعنوان نقاط تعریفنشده مدیریت میشوند.
- صحت شرطی (Conditional Soundness): هرگاه قانونی ریسک ایجاد کند (مثلاً تقسیم بر یک متغیر $b$)، سیستم بهطور خودکار «فرضهای» (Assumptions) قابل مشاهدهای مانند $b \neq 0$ ایجاد میکند که همراه با معادله جابهجا میشوند. این فرضها در سیستم بهعنوان اشیاء درجه اول (First-class objects) شناخته میشوند.
- درخت نحو غیرقابل تغییر (Immutable AST): ساختار درختهای عبارت از گرههای Sum و Product با شناسههای (ID) پایدار استفاده میکند. در این AST، گرههای اختصاصی برای تفریق یا تقسیم وجود ندارد. برای مثال، عبارت $a - b$ بهعنوان
Sum(a, Neg(b))و تقسیمها بهعنوان یکFractionبا لیستهای صورت و مخرج نمایش داده میشوند. - محدودیت عدم دسترسی به DOM: برای اطمینان از قابلیت انتقال (Portability)، در فایل
tsconfig.jsonهیچ کتابخانه DOMی تعریف نشده است و یک تست خاص به نامboundary.test.tsتمام سورسها را اسکن میکند تا از بهکارگیری متغیرهای جهانی (Globals) مرورگر جلوگیری کند.
این موتور حدود ۲۵ قانون داخلی را ارائه میدهد که معادلات خطی، عبارتهای مشابه، توزیع، کسرها، قوانین توان و نابرابریها را پوشش میدهد. این قوانین نسبت به علامتها حساس هستند و جابجایی جهت رابطهها (Relation-flipping) را مدیریت میکنند. برای مثال، در حل معادله $x^2 = 9$، سیستم بهجای ارائه یک جواب واحد، درخت استنتاج را به دو شاخه زنده و همتراز تقسیم میکند: $x = 3$ و $x = -3$.
قضاوت و مدیریت وضعیت
مدیریت وضعیت در این سیستم با ترکیب { assumptions, equation } تعریف میشود. انواع فرضها در این موتور عبارتند از:
- محدودیتها (Restrictions): حرکتهایی که ممکن است باعث از دست رفتن برخی جوابها شوند.
- گسترشها (Extensions): حرکتهایی که ممکن است جوابهای جدیدی اضافه کنند و معادله اصلی را بهعنوان یک تعهد (Obligation) حمل میکنند که توسط
checkSolutionتسویه میشود. - فرضهای پینشده (Pinned): برای بررسی سناریوهای «چه میشد اگر» (What-if).
تاریخچه استنتاج بهصورت یک درخت فقط-افزودنی (Append-only) ذخیره میشود. عملیات Undo صرفاً یک اشارهگر (Pointer) را جابهجا میکند، در حالی که شاخههای رها شده همچنان زنده میمانند و تقسیمبندیهای موردی (Case splits) به شاخههای قابل پیمایش تبدیل میشوند.
تاییدیه و چیدمان
هر قانون از طریق تستهای ویژگی (Property tests) با استفاده از vitest و fast-check بازبینی شده است تا اطمینان حاصل شود که مجموعه جوابها تحت فرضهای داده شده حفظ میشوند. همچنین، موتور شامل یک سیستم هندسهی چیدمان است که درختها را به جعبهها و نمادهای (Glyphs) دارای شناسه متصل میکند که از جداول متری استاتیک خوانده میشوند. این کار نیاز به اندازهگیریهای گرانقیمت فونت در هنگام رندرینگ را حذف میکند.
از آنجایی که هندسهی زیر-درختها (Subtree geometry) تا حد انتقال و مقیاس مستقل از متن است، رندرر میتواند گرهها را در طول یک بازنویسی تطبیق داده و آنها را بهصورت صلب (Rigid) جابهجا کند. این مکانیسم اصلی است که انیمیشنهای مبتنی بر شناسه (ID-keyed) را ممکن میسازد.
برای برنامهنویسان، این تغییر به معنای انتقال پیچیدگی «بررسی صحت عمل» از لایهی UI به لایهی موتور است. شما دیگر لازم نیست منطقی بنویسید تا بفهمید حرکت کاربر درست بود یا خیر؛ بلکه کافی است تابع enumerateMoves(judgment) را فراخوانی کنید تا تمام گزینههای قانونی به همراه لنگرهای ژست (Gesture anchors) شامل نقاط برداشتن (handle) و نقاط رها کردن (dropTarget) بازگردانده شوند.
این تغییر، تجربه توسعهدهنده را از ساخت یک «ماشینحساب» به ساخت یک «محیط محدودشده» تبدیل میکند. با اجبار به ساختار صحیح، ابزارهایی که بر پایه wyrm-math ساخته میشوند میتوانند تضمین کنند که هر وضعیتی که کاربر به آن میرسد، از نظر ریاضی معتبر است.
گام بعدی شما
- اگر در حال ساخت ابزارهای آموزشی هستید، بررسی کنید که چگونه چرخهی حیات «فرضها» میتواند برای آموزش مفاهیمی مثل «مقادیر استثنا» (Excluded values) و «جوابهای زائد» (Extraneous solutions) به دانشآموزان ارائه شود.
- مستندات GitHub پروژه را برای پیادهسازی رابطهای کاربری مبتنی بر ژست (Gesture-based) مطالعه کنید.
- ساختار AST این موتور را با کتابخانههای مشابه مقایسه کنید تا تفاوت در مدیریت گرههای تفریق و تقسیم را درک کنید.
اما تأثیر این رویکرد بر یادگیری ماشین و مدلهای استدلالی بسیار عمیقتر است — به تحلیل ما دربارهی مدلهای استدلالی (Reasoning Models) مراجعه کنید.




گفتگو