الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Postfix

بدأه زيد الرافدين في 23 يوليو 2009 · 14 رد · 5,904 مشاهدة · في الرياضيات والخوارزميات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

قبل مدة وانا اقرا في كتاب حول تصميم المترجمات وبنائها لك واجهتني مشكلة وهي ان معظم الامثلة تدور حول PostFix وصراحة انا لفهم بناء PostFix وكيفية استعملها في تركيب الجمل الرياضية

فارجو منكم شرح بسيط حول فكرتها

شكرا

#2

يمكن كتابة التعابير باكثر من طريقة :

مثلا التعبير الحسابي 3+4 هنا مكتوب بطريقة الInfix اي ان العملية في الوسط بين المعاملين :

يمكن كتابته بطريقة الPolish notation او prefix notation :

+ ثم 3 ثم 4 بحيث العملية في الاول ثم المعاملات

و يمكن كتابته بطريقة الRrevers Polish notation او Postfix notation :

3 ثم 4 ثم + بحيث العملية في الاخر وقبلها المعاملات

توجد خوارزمية سريعة لحساب التعابير تعتمد على الPostfix لذلك تستخدم في المترجمات.

اعتقد الويكي يشرح الموضوع بالتفصيل :

http://en.wikipedia.org/wiki/Reverse_Polish_notation

بالتوفيق

الحمد لله الذي هدانا لهذا وماكنا لنهتدي لولا ان هدانا الله

#3
ibr_exn كتب:
يمكن كتابة التعابير باكثر من طريقة :

مثلا التعبير الحسابي 3+4 هنا مكتوب بطريقة الInfix اي ان العملية في الوسط بين المعاملين :

يمكن كتابته بطريقة الPolish notation او prefix notation :

+ ثم 3 ثم 4 بحيث العملية في الاول ثم المعاملات

و يمكن كتابته بطريقة الRrevers Polish notation او Postfix notation :

3 ثم 4 ثم + بحيث العملية في الاخر وقبلها المعاملات

توجد خوارزمية سريعة لحساب التعابير تعتمد على الPostfix لذلك تستخدم في المترجمات.

اعتقد الويكي يشرح الموضوع بالتفصيل :

http://en.wikipedia.org/wiki/Reverse_Polish_notation

بالتوفيق

مشكور يااخي على الرد

لقد قرات الموضوع في الويكي وفهمت المبدء لكني لم اوفق بحل الامثلة المتقدمة

اتمنى منك ان تعطي مثال اكثر تعقيدا لكي يفهم الموضوع بطريقة افضل

شكرا جزيلا

تم تعديل هذه المشاركة بواسطة زيد الرافدين في 23 يوليو 2009 في 23:49

#4
a+(b+c)=   abc++	
(a+b)+c	 =   ab+c+a-b*c 
a-b*c =   abc*-
(a/b)*(c/d) =   ab/cd/*	
a/(b+c*d-e)	= abcd*+e-/	
a-b*c+d/e  = 	  abc*-de/+

الفكرة ببساطة

1. ان تجعل العملية اخر شيء وقبلها المعاملات تضعهم برتيبهم كما هم

2. ان تنتبه لاولويات العمليات يعني تبدأ بالاقواس ، الضرب والقسمة قبل الجمع والطرح وهكذا

3. الاقواس تلغى.

مثلا : لاحظ التعبير الثالث : ستبدا تكتب التعبيرالذي يحتوي عملية الضرب لان لها اولوية على عملية الطرح

bc ثم *

الان اعتبر ان ال ذي كتبته من قبل كله عدد وبالتالي اصبح معك عملية طرح عددين لذا ستضع اشارة الطرح في الاخير وتضع المعاملات كما هي بالترتيب فنبدا بالمعامل الاول

a

ثم الناتج من عملية الضرب السابقة - ستضعه كله كما هو اعتبره كله عدد وضعه في مكانه بالترتيب

ثم اشارة الطرح

ارجو ان يكون المثال واضح

جرب اعمل كم تعبير معقد وحاول حله ودعنا نرى حلك

بالتوفيق

تم تعديل هذه المشاركة بواسطة ibr_exn في 24 يوليو 2009 في 00:13

الحمد لله الذي هدانا لهذا وماكنا لنهتدي لولا ان هدانا الله

#5


معلومات قيمة أخي إبراهيم.. و لكن دعوني أعقب ببعض المعلومات المتواضعة كرغبةٍ في إثراء الموضوع..

الترميز البَعدي Postfix Notation أو الترميز البولندي المعكوس Reverse Polish Notation (RPN) هو ترميز مستمد من التعديلات التي أحدثها عالم المنطق الرياضياتي بوشنسكي Bochenski في طريقة الترميز المنطقي البولندية، ثم أدخل عليها عالم المنطق الرياضياتي البولندي لوكاشيفتش Luckasiewicz بعض التحسينات القليلة و لكن الجوهرية ليصوغ بها نسقه المنطقي المميز حتى أصبح يُعرف هذا النوع من الترميز لدى المناطقة بترميز لوكاشيفتش، و الذي يختلف عن الترميز البيني Infix Notation المستخدم في الأنساق المنطقية الأخرى مثل نسق الفيلسوف و عالم المنطق الرياضياتي برتراند راسل Russell.
ثم شهد هذا الصنف من الترميز تطويراً آخر في خمسينات القرن العشرين من قبل الفيلسوف و عالم الرياضيات الأسترالي هامبلين Hamblin، ليجد له العديد من التطبيقات في علوم الحاسب؛ حيث يقلل من الوصول لذاكرة الآلة Memory Access كما يقدم طرقاً أفضل لحساب التعبيرات الرياضياتية عن طريق الـ Stack فيما يسمى Stack-Oriented Programming..

و طريقة الترميز هذه تستغني عن الأقواس و تكتفي بترتيب الرموز و الذي يفي بالغرض. و لتوضيح مفهوم الترميز البعدي Postfix يجب أن نطرح الترميز البيني Infix المعتاد، و نذكر كلاهما بالتقابل..

أولاً: عمليات حسابية بسيطة

mimetex.cgi?%5Cbegin%7Barray%7D%7Bl%7D





mimetex.cgi?%5Cbegin%7Barray%7D%7Bl%7D



لاحظ أنه في الترميز البَعدي تظل قاعدة الأولوية Priority في تنفيذ العمليات سارية؛ حيث يتم تنفيذ الضرب (*) أولاً على العددين السابقين و هما (6 8) ثم تنفيذ الطرح (-) بين ناتج الضرب و العدد (5) تبعاً للترتيب..

ثانياً: عمليات منطقية بسيطة

mimetex.cgi?%5Cbegin%7Barray%7D%7Bl%7D




mimetex.cgi?%5Cbegin%7Barray%7D%7Bl%7D



و المثالان المنطقيان أعلاه متكافئان منطقياً و يمثلان التعريف الأول في نسق لوكاشيفتش المنطقي، و يمكن كتابة هذا التعريف بترميز مشابه يسمى الترميز القَبلي Prefix Notation و هو ترميز شائع بدرجة كبيرة في المنطق الرياضياتي و نظرية الفئات المسلماتية Axiomatic Set Theory، و ذلك كالتالي:

mimetex.cgi?Prefix:%5C,%5C,%5C,%5C,%20%5



و يقابله في نسق راسل البيني المعتاد:

mimetex.cgi?Infix:%5C,%5C,%5C,%5C,p%20%5



كان هذا من حيث الأصول في المنطق الرياضياتي و فلسفة الرياضيات.. فمن هنا بدأت الحكاية (حتى و إن كره الأكثرون).. إما عن التطبيقات الحوسبية و غيرها من التطبيقات، فأهل مكة هم بشعابها أدرى و أعرف..


تم تعديل هذه المشاركة بواسطة YDVIPER في 24 يوليو 2009 في 00:36

[bg=#000000]

La filosofia e scritta in questo grandissimo libro che continuamente ci sta aperto innanzi a gli occhi (io dico l’universo), ma non si pu o intender se prima non s’impara a intender la lingua e conoscere i caratteri ne’ quali e scritto. Egli e scritto in lingua matematica e i caratteri sono triangoli, cerchi, ed altre figure geometriche senza i quali mezi e impossibile a intenderne umanamente parola; senza questi e un aggirarsi vanamente per un oscuro laberinto.

Galileo

لقد كُتبت الفلسفة في هذا الكتاب العظيم الذي يوجد دائماً أمام أعيننا (و أعني به الكون)، و لكن لا يمكن لأحدٍ أن يفهمه ما لم يتعلم في البدء حروفَ اللغة التي كُتب بها. لقد كُتب بلغة الرياضيات، و الحروف هي مثلثاتٌ و دوائر و أشكالٌ هندسية أخرى؛ بدون هذه اللغة يكون من المستحيل على البشر أن يفهموا و لو كلمة، بدون هذه اللغة نُمسي كمن يتخبطُ بلا هدى في متاهةٍ مظلمة.

جاليليو

[/bg]

Yasser

#6

اخ YDVIPER شكرا على التوضيح المفيد اشكرك كثير الشكر :lol:

اخ ابراهيم شكرا جزيلا على شرحك المفصل للموضوع

لقد استعطت حل جميع الامثلة ووصلت الى جميع نتائجك وسوف اطرح بعض المعادلات وحلها التي كتبتها من بنات افكاري

(a+B)/(c*d)+e=ab+cd*e+/

((a*B)/c)*d=ab*c/d*

a/b+c*d-e =ab/cd*+e-

اتمنى ان تكون حلولي صحيحة :blush:

وشكرا جزيلا على تفاعلكم مع سؤالي

تحياتي

تم تعديل هذه المشاركة بواسطة زيد الرافدين في 24 يوليو 2009 في 01:19

#7

اهلا بالغائب ،كيفك د. ياسر

كعادتي ما زلت فاشل في التنسيق ،

لك جزيل الشكر على مشاركتك

اخي زيد تأكد من الاولى

تم تعديل هذه المشاركة بواسطة ibr_exn في 24 يوليو 2009 في 01:35

الحمد لله الذي هدانا لهذا وماكنا لنهتدي لولا ان هدانا الله

#8

عفواً أخي إبراهيم أنا الضيف و أنتم أهل الدار.. -_-

[bg=#000000]

La filosofia e scritta in questo grandissimo libro che continuamente ci sta aperto innanzi a gli occhi (io dico l’universo), ma non si pu o intender se prima non s’impara a intender la lingua e conoscere i caratteri ne’ quali e scritto. Egli e scritto in lingua matematica e i caratteri sono triangoli, cerchi, ed altre figure geometriche senza i quali mezi e impossibile a intenderne umanamente parola; senza questi e un aggirarsi vanamente per un oscuro laberinto.

Galileo

لقد كُتبت الفلسفة في هذا الكتاب العظيم الذي يوجد دائماً أمام أعيننا (و أعني به الكون)، و لكن لا يمكن لأحدٍ أن يفهمه ما لم يتعلم في البدء حروفَ اللغة التي كُتب بها. لقد كُتب بلغة الرياضيات، و الحروف هي مثلثاتٌ و دوائر و أشكالٌ هندسية أخرى؛ بدون هذه اللغة يكون من المستحيل على البشر أن يفهموا و لو كلمة، بدون هذه اللغة نُمسي كمن يتخبطُ بلا هدى في متاهةٍ مظلمة.

جاليليو

[/bg]

Yasser

#9
(a+B)/(c*d)+e=ab+cd*/e+

ارجو ان يكون صحيح هذه المرة

كما يقدم طرقاً أفضل لحساب التعبيرات الرياضياتية عن طريق الـ Stack فيما يسمى Stack-Oriented Programming..

كلامك صحيح YDVIPER 100% فتحليل الجمل الرياضية في جميع المترجمات يعتمد في اغلب الاحيان Stack-Oriented Programming

و Posfix

انا جديد في علم بناء المترجمات وقد رايته بالامر غير هين ( حتى مع خبرتي الطويلة البرمجة ) الامر الصعب بالموضوع هو قلة المصادر مقارنة بباقي المواضيع وكذلك ان طريقة البرمجة التي تستخدم والاهداف المرجوة من كتابة البرنامج تختلف عن الاهداف المتعارف عليها من قبل المبرمجين العرب

تم تعديل هذه المشاركة بواسطة زيد الرافدين في 24 يوليو 2009 في 02:09

#10

ممتاز زيد حلك صحيح.

لتدرس المترجمات تحتاج ان تكون متمكن من موضوع ال Computation Theory و خصوصا ال PDA =Push Down Automata كتاب لينز Linz يعتبر مرجع ممتاز لهذا الموضوع.

بالتوفيق

الحمد لله الذي هدانا لهذا وماكنا لنهتدي لولا ان هدانا الله

#11

هذه بعض المحاضرات المبسطة عن الموضوع، و الأولى تحتوي على مثال تفاعلي بـ Java Script

Postfix Notation

Infix, Postfix and Prefix

[bg=#000000]

La filosofia e scritta in questo grandissimo libro che continuamente ci sta aperto innanzi a gli occhi (io dico l’universo), ma non si pu o intender se prima non s’impara a intender la lingua e conoscere i caratteri ne’ quali e scritto. Egli e scritto in lingua matematica e i caratteri sono triangoli, cerchi, ed altre figure geometriche senza i quali mezi e impossibile a intenderne umanamente parola; senza questi e un aggirarsi vanamente per un oscuro laberinto.

Galileo

لقد كُتبت الفلسفة في هذا الكتاب العظيم الذي يوجد دائماً أمام أعيننا (و أعني به الكون)، و لكن لا يمكن لأحدٍ أن يفهمه ما لم يتعلم في البدء حروفَ اللغة التي كُتب بها. لقد كُتب بلغة الرياضيات، و الحروف هي مثلثاتٌ و دوائر و أشكالٌ هندسية أخرى؛ بدون هذه اللغة يكون من المستحيل على البشر أن يفهموا و لو كلمة، بدون هذه اللغة نُمسي كمن يتخبطُ بلا هدى في متاهةٍ مظلمة.

جاليليو

[/bg]

Yasser

#12
اقتباس
ممتاز زيد حلك صحيح.

لتدرس المترجمات تحتاج ان تكون متمكن من موضوع ال Computation Theory و خصوصا ال PDA =Push Down Automata كتاب لينز Linz يعتبر مرجع ممتاز لهذا الموضوع.

شكرا جزيلا لك لمتابعة حلولي وتصحيحها لقد كنت خير استاذ لي .. وسوف اقرا الموضوع التي نصحتني به

اقتباس
هذه بعض المحاضرات المبسطة عن الموضوع، و الأولى تحتوي على مثال تفاعلي بـ Java Script

Postfix Notation

Infix, Postfix and Prefix

شكرا على المحاضرات القيمة فقد افادتني كثيرا لاني بالفعل كنت اواجه مشكلة في ماذا اسوف يحدث للارقام في stack بعد تنفيذ العمليات الحاسبية عليها واين تخزن النتيجة ... ولقد جاءت محاضراتك بالحل :lol:

في نهاية ادعو الله ان يوفقكم بحياتكم وان شاء الله نبقى على تواصل

مع تقديري

زيد

تم تعديل هذه المشاركة بواسطة زيد الرافدين في 24 يوليو 2009 في 14:55

#13

السلام عليكــم ورحمـة الله وبركاتــه ،،

لدي سؤال جديد حول الموضوع

اذا اردنا تحويل العملية الرياضية التالية الى Postfix

23-65

فانها ستصبح

2365-

لكن السؤال هو كيف سنعرف اذا اردنا تحويلها عكسيا مرة اخرى انها تعني

236 - 5

ام

23 -65

ام

2 - 365

وتكثر الاحتمالات ...

شكرا

#14

اعتقد انه يجب فصل الاعداد برمز خاص كالفارزه مثلا ، او خزن كل عدد في متغير مستقل مثلا العدد الاول A والثاني B وهكذا.

وفي الاخير وكما يقول المثل : "المبرمج ما رح يغلب" =" المبرمج دائما يجد نوع من الحل".

تم تعديل هذه المشاركة بواسطة ibr_exn في 11 أغسطس 2009 في 18:47

الحمد لله الذي هدانا لهذا وماكنا لنهتدي لولا ان هدانا الله

#15
ibr_exn كتب:
اعتقد انه يجب فصل الاعداد برمز خاص كالفارزه مثلا ، او خزن كل عدد في متغير مستقل مثلا العدد الاول A والثاني B وهكذا.

وفي الاخير وكما يقول المثل : "المبرمج ما رح يغلب" =" المبرمج دائما يجد نوع من الحل".

وهو كذلك :happy:

مواضيع مشابهة