مهم للغاية! هذه اللغة قيد التقدم! أي شيء يمكن أن يتغير في أي لحظة دون أي إشعار! استخدم هذه اللغة على مسؤوليتك الخاصة!
ليس كوك. محول تعبير بسيط ليس Coq.
$ cargo run ./examples/peano.noq
الفكرة الرئيسية هي القدرة على تحديد قواعد التحويل للتعبيرات الجبرية الرمزية وتطبيقها بشكل تسلسلي.
يمكن تعريف بناء جملة التعبير الحالي تقريبًا كما يلي:
<expression> ::= <operator-0>
<operator-0> ::= <operator-1> ((`+` | `-`) <operator-0>)*
<operator-1> ::= <operator-2> ((`*` | `/`) <operator-1>)*
<operator-2> ::= <primary> (`^` <operator-2>)*
<primary> ::= (`(` <expression> `)`) | <application-chain> | <symbol> | <variable>
<application-chain> ::= (<symbol> | <variable>) (<fun-args>)+
<symbol> ::= [a-z0-9][_a-zA-Z0-9]*
<variable> ::= [_A-Z][_a-zA-Z0-9]*
<fun-args> ::= `(` (<expression>),* `)`
الكيانان الرئيسيان للغة هما القواعد والأشكال. تحدد القاعدة النمط (الرأس) والاستبدال المقابل له (الجسم). يحتوي تعريف القاعدة على بناء الجملة التالي:
<name:symbol> :: <head:expression> = <body:expression>
فيما يلي مثال لقاعدة تقوم بتبديل عناصر الزوج:
swap :: swap(pair(A, B)) = pair(B, A)
التشكيل هو عملية تطبيق متسلسل للقواعد على تعبير وتحويله إلى تعبير مختلف. التشكيل له بناء الجملة التالي:
<expression> {
... sequence of rule applications ...
}
على سبيل المثال، إليك كيفية تشكيل التعبير swap(pair(f(a), g(b)))
باستخدام قاعدة swap
المحددة أعلاه:
swap(pair(f(a), g(b))) {
swap | all
}
نتيجة هذا التشكيل هي pair(g(b), f(a))
.
ليس عليك تحديد قاعدة لاستخدامها في التشكيل:
swap(pair(f(a), g(b))) {
swap(pair(A, B)) = pair(B, A) | all
}