التحقق من صحة المعادلات الخطية مع التعبيرات العادية؟
-
21-09-2019 - |
سؤال
كيف يمكنني التحقق من صحة المعادلات الخطية مع تعبيرات منتظمة أو هل هناك طريقة أخرى إلى جانب استخدام التعبيرات العادية. سأستخدم ^ للإشارة إلى الأسس.
2x + 3 = 8 // يجب التحقق من صحة الغرامة
3x + 2y + 4Z = 12 // يجب التحقق من صحة الغرامة
4x^2 + 2y = 22 // لا ينبغي التحقق من صحة بسبب القوة.
4xy + 3y = 45 // لا ينبغي التحقق من صحة بسبب ناتج اثنين من المجهولين.
2/x + 4y = 22 // لا ينبغي التحقق من صحة هذا بسبب المجهول في المقام
(3/4) x + 3y + 2z = 40 // يجب التحقق من صحة الغرامة.
المحلول
سأبدأ بكتابة تعريف لمعادلة خطية صالحة باستخدام backus-naur تدوين ، مع أشياء مثل:
<integer> := <digit> | <integer> <digit>
<constant> := <integer> | ...
<variable> := <letter>
<term> := <constant> | <variable> | <constant> <variable>
وهلم جرا.
هناك العديد من الطرق لتحويل ذلك إلى مدقق. مع وجود بعض الخبرة في ذلك ، كنت أستخدم YACC أو Bison لكتابة محلل من شأنه أن يولد شجرة تحليل فقط إذا كانت الإدخال معادلة خطية صالحة.
قد تجد أن التعبيرات العادية محدودة للغاية لفعل ما تحتاجه - أنا فقط لا أستخدمها بما يكفي لمعرفتها.
نصائح أخرى
الحالات التي ذكرتها سهلة:
fail if /[xyz]\s*\^/;
fail if /\/\s*[xyz]/;
fail if /([xyz]\s*){2,}/;
(هذا هو بناء جملة بيرل ، على افتراض $_
يحتوي على التعبير ، و fail
هل ما تفعله عندما تريد الاستسلام.)
هنا يمكنك استبدال xyz
مع كل ما هو تعبير صحيح لمتغير واحد.
ولكن بشكل عام ، سيتطلب ذلك تحليلًا فعليًا للتعبير ، وهو مهمة لـ LEX/YACC أو شيء من هذا القبيل ، وليس تعبيرًا منتظمًا.
على سبيل المثال ، إذا كان "XY" اسمًا متغيرًا شرعيًا ، فهذا بالطبع كل هذا ينهار.