اصحاب الخبرة في المصفوفات والتعابير القياسية ارجو المساعدة في حل الخوارزمية
السلام عليكم ورحمة الله وبركاته
اخواني الكرام ارجو من كل من لديه خبرة في التعامل مع المصفوفات والتعابير القياسية (regex) بلغة php ان يشارك معنا في حل هذا التمرين وان لا يبخل علينا ولو باقتراح او فكرة تساعد في حل التمرين الذي هو عبارة عن خوارزمية التوحيد (Unification Algorithm) المشهورة في لغة prolog
تعتمد الخوارزمية في حلها على اربع قواعد
1- تبديل X=t الى t=X اذا كان X متغير و t ثابت
2- اذا كان X=X تحذف المعادلة
3- مساوات كل قيمة من الدالة بما يقابلها في الطرف الاخر ’(x1 ’,x2 ’, …xn ’) = f(x1 ’ ’, x2 ’ ’, xn ’ ’) تصبح x1 =x1
x2 =x2
…………
xn = xn
4-تبديل المتغير بالدالة التي يساويها
مثال
قوس يسبقه حرف كبير تعتبر دالة
الاحرف الكبيرة تمثل المتغيرات
الاحرف الصغيرة تمثل الثوابت
وهذا نموذج الادخال والتحقق من الثوابت والدوال والمنغيرات
كود PHP:
<form method="POST" action="index.php"> <table border="1" width="40%" align="center"> <tr> <td><b> <span lang="ar-eg">fun 01</span></b></td> <td> <p align="center"> <input name="function01" type ="text" size="60" ></td> </tr> <tr> <tr> <td><b> <span lang="ar-eg">fun 02</span></b></td> <td> <p align="center"> <input name="function02" type ="text" size="60" ></td> </tr> </table> <p align="center"> <input type="submit" value="submit" name="submit" ><input type="reset" value="clear" name="B1" ></p> </form> <? $function01 = $_POST [ 'function01' ] ; $fun1 = preg_match ( "/^([A-Z])+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+|[A-Z]+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+|,[A-Z]+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+)+\)|[A-Z]+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+)+\))+\)|,[A-Z]+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+|,[A-Z]+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+)+\)|[A-Z]+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+)+\))+\))+\)$/" , $function01 ); $var1 = preg_match ( "/^[A-Z]+([0-9]+)?$/" , $function01 ); $cst1 = preg_match ( "/^([a-z]+([0-9]+)?|(\+|\-|\*|\/)[a-z]+([0-9]+)?|[0-9]+|(\+|\-|\*|\/)[0-9]+)+$/" , $function01 ); if( preg_match ( "/([A-Z])+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+|[A-Z]+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+|,[A-Z]+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+)+\)|[A-Z]+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+)+\))+\)|,[A-Z]+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+|,[A-Z]+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+)+\)|[A-Z]+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+)+\))+\))+\)$/" , $function01 )) { $a1 = explode ( "," , $function01 ); print_r ( $a1 ); } else { echo "no" ; } $function02 = $_POST [ 'function02' ] ; $fun2 = preg_match ( "/^([A-Z])+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+|[A-Z]+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+|,[A-Z]+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+)+\)|[A-Z]+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+)+\))+\)|,[A-Z]+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+|,[A-Z]+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+)+\)|[A-Z]+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+)+\))+\))+\)$/" , $function02 ); $var2 = preg_match ( "/^[A-Z]+([0-9]+)?$/" , $function02 ); $cst2 = preg_match ( "/^([a-z]+([0-9]+)?|(\+|\-|\*|\/)[a-z]+([0-9]+)?|[0-9]+|(\+|\-|\*|\/)[0-9]+)+$/" , $function02 ); if( preg_match ( "/([A-Z])+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+|[A-Z]+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+|,[A-Z]+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+)+\)|[A-Z]+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+)+\))+\)|,[A-Z]+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+|,[A-Z]+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+)+\)|[A-Z]+([0-9]?)+\(([A-Z]+([0-9]?)+|,[A-Z]+([0-9]?)+|[a-z|0-9]+|,[a-z|0-9]+)+\))+\))+\)$/" , $function02 )) { $a2 = explode ( "," , $function02 ); print_r ( $a2 ); } else { echo "no" ; }
آخر تعديل بواسطة عبد الرزاق في 24-12-2011 الساعة 02:00 PM .
24-12-2011, 01:14 PM
لنبسط المسألة
لدي مصفوفة كالاتي وارغب في تقسيمها
كود PHP:
<?php $A1 = "F(X,G(e,L),a)" ; $A1 = explode ( "," , $A1 ); print_r ( $A1 ); ?> تظهر النتيجة كالتالي Array ( [0] => F(X [1] => G(e [2] => L) [3] => a) ) وانا ارغب ان تكون النتيجة كالاتي Array ( [0] => X [1] => G(e,L) [2] => a )
فهل من دلة غير explode تفي بالغرض
25-12-2011, 09:24 AM
regular expressions تفي بالغرض
-------------------------
http://www.php.net/manual/en/function.preg-split.php
--------------------------
او يمكن استعمال preg_match بدون تقسيم فقط للبحث داخل السترينق واستخدام المصفوفه الناتجه
سلام
__________________
Bruce - مدونة شديدة التخصص في PHP وتطبيقات الويب
27-12-2011, 12:30 AM
صراحة ماني محترف ولا حتى ربع محترف
بس قلت خلني احوس لك في كود شوي يمكن نطلع بفايده
هذا كود يطلع لك نفس اللي تبيه بس ما اضن انه هو مطلوبك
ادري انه كود طويل وشكله اهبل بس مشي حالك لا تدقق ههههههههههههههه
كود PHP:
$A1 = "F(X,G(e,L),a)" ; $pattern = '@[A-Z]\(@' ; preg_match ( $pattern , $A1 , $r ); $pattern = '@\([A-Z],@' ; preg_match ( $pattern , $A1 , $r1 ); $pattern = '@[A-Z]\([a-z],[A-Z]\)@' ; preg_match ( $pattern , $A1 , $r2 ); $pattern = '@\),[a-z]\)@' ; preg_match ( $pattern , $A1 , $r3 ); $r = str_replace ( '(' , '' , $r ); $r1 = str_replace ( ',' , '' , $r1 ); $r1 = str_replace ( '(' , '' , $r1 ); $r3 = str_replace ( ')' , '' , $r3 ); $r3 = str_replace ( ',' , '' , $r3 ); $r = array_merge ( $r , $r1 , $r2 , $r3 ); print_r ( $r );
15-01-2012, 06:45 PM
هل الفورمات متكرر ومتداخل ؟ ام ثابت ؟
لو ثابت يكون الموضوع سهل جدا
لو متكرر يكون الموضوع محتاج شوية تفكير .. بمعنى انه لو من الممكن ان يكون بهذا الشكل
F(X,G(e,L),a)
او
F(X,G(e,L, Y(i,o) , O(r,p)),a)
حينها اتوقع الحل يكمن في 3 اشياء :
1- Loop
2- Regular Expression
3- String functions usage, and mainly would be
www.php.net/substr and
www.php.net/strpos
هذه محاولة سريعة مني ( فاشلة ! ) الموضوع محتاج تفكير اطول .. وهذا المثال كنت مفترض ان الفورمات لن يكون بهذا الشكل دائما بل من الممكن ان تكون هناك عدة اقواس :
كود PHP:
$A1 = "F(X,G(e,L),a)" ; echo substr ( $A1 , strpos ( $A1 , '(' )- 1 , strpos ( $A1 , ')' )+ 1 );exit; $x = 0 ; while( true ){ preg_match ( "/[A-Za-z]\([A-Za-z,\(\)]+\)/" , $A1 , $r [ $x ]); if (!empty( $r [ $x ][ 0 ][ 0 ])) $found [ $x ] = $r [ $x ][ 0 ][ 0 ]; else break; $x ++; } print_r ( $found );
19-01-2012, 01:31 AM