You are on page 1of 41

‫مدخل إلى ‪Visual Prolog‬‬

‫تـــــــــــم اضافه الكتاب من قبل‬


‫احمد اياد احمد‬
‫طالب في كليه التربيه –قسم علوم الحاسبات‬
‫المرحله الثالثه‬
‫‪-1‬مقدمة‪3..............................................:‬‬
‫‪VISUAL‬‬ ‫‪ 1-1‬الختلف بين برنامج منطقي مكتوب بلغة ‪ PROLOG‬المعيارية و برنامج منطقي مكتوب بلغة‬
‫‪3...........................................................................................................................PROLOG‬‬
‫‪ VISUAL PROLOG 1-2‬هل هو مفسر ‪ INTERPRETER‬أم مترجم ‪3....................................COMPILER‬‬

‫‪ -2‬استخدام ‪ Visual Prolog‬كمفسر لكتابة برامج‬


‫منطقية بسيطة‪3.......................................‬‬
‫‪ 2-1‬أقسام برنامج ‪3..........................................................................................VISUAL PROLOG‬‬
‫‪ 2-2‬خطوات كتابة البرنامج‪3..................................................................................................‬‬
‫‪ 2-3‬ملحظات حول البرنامج‪5................................................................................................‬‬
‫‪ 2-3-1‬طططط ططططط ططططططط ‪5 .................................................................‬‬
‫‪ 2-3-2‬طططط ططططط طططططططططط ‪6 ........................................................‬‬
‫‪ 2-3-3‬طططط ططططططط ط ططططططط ‪6 ........................................................‬‬
‫‪ 2-3-4‬طططط ططططططط طط ططططط ‪6 ...........................................................‬‬
‫‪ 2-4‬مقاطع إضافية‪6.............................................................................................................‬‬
‫‪ 4-2-1‬طططط ططططططط ‪6 ............................................................................facts‬‬
‫‪ 4-2-2‬طططط ططططططط ‪6 ......................................................................constants‬‬
‫‪ 4-2-3‬ططططططط طططططط طططططططط ‪6 ..........................................global‬‬

‫‪ -3‬أنماط المعطيات في ‪6............Visual Prolog‬‬


‫‪ 3-1‬النماط الساسية في ‪6............................................................................... VISUAL PROLOG‬‬
‫‪ 3-2‬القوائم ‪7...............................................................................................................LISTS‬‬
‫‪ 3-2-1‬ططططط ططططط‪7 .......................................................................................‬‬
‫‪ 3-2-2‬ططط طططططططط ططط ططططططط‪8 ...................................................‬‬
‫‪ 1 - 3-2-2‬طططططط ططططط ططططط ططط ططططط‪8 ....................................‬‬
‫‪ 2 - 3-2-2‬طططططط ططططط طططط ططططط‪8 .................................................‬‬
‫‪ 3 - 3-2-2‬طططططط ططططط طططط ططططط طططط طط ططططط‪8 ............‬‬
‫‪ 3-2-2-4‬طططططط ططططط طططططط ططط ططططط طططط ططططط‬
‫طططططط طط ططططط‪9 .......................................................................................‬‬
‫‪ 5 - 3-2-2‬طططططط ططططط طططططط ططط ططططط طططط ططططط‬
‫ططططط طط ططططط‪9 ..........................................................................................‬‬
‫‪ 6 - 3-2-2‬طططططط‪9 ................................................................................................‬‬

‫‪-4‬العمليات الحسابية و عمليات المقارنة في‬


‫‪10..........................................Visual Prolog‬‬
‫‪ 4-1‬التعابير الحسابية‪10........................................................................................................‬‬
‫‪ 4-2‬العمليات الحسابية‪10.......................................................................................................‬‬
‫‪ 4-3‬التوابع والسناديات الحسابية‪11........................................................................................‬‬
‫‪ 4-4‬معاملت المقارنة‪11.......................................................................................................‬‬

‫م‪ .‬أحمد زين‪2001-‬‬


‫مدخل إلى ‪Visual Prolog‬‬

‫‪ 4-4-1‬ططططط‪12 .....................................................................................................‬‬
‫‪ 4-4-2‬طططططط ططططططط ط ططططط ططططططط ط طططططط‪12 ........‬‬

‫‪ -5‬البرمجة غرضية التوجه في ‪12...Visual Prolog‬‬


‫‪ 5-1‬تعريف الصف ‪12................................................................................CLASS DECLARATIONS‬‬
‫‪ 5-2‬بناء الصف‪13...............................................................................................................‬‬
‫‪ 5-3‬تعريف الغراض‪13......................................................................................................‬‬
‫‪ 5-4‬تدمير الغراض‪13........................................................................................................‬‬
‫‪ 5-5‬ملحظات هامة‪13.........................................................................................................‬‬

‫‪ -6‬عمليات القراءة و الكتابة و التعامل مع‬


‫الملفات في ‪13.........................Visual Prolog‬‬
‫‪ -7‬متفرقات‪15.........................................‬‬
‫‪-8‬بناء واجهات بيانية باستخدام خبير التطبيقات‬
‫‪Application Expert‬خطوة بخطوة‪16..................‬‬
‫‪ 8-1‬بناء تطبيق بسيط يقوم بطبع رسالة داخل صندوق حوار‪16.........................................................‬‬
‫‪ 8-2‬إنشاء أشرطة قوائم و نوافذ و صناديق حوار وعمليات الرسم‪21..................................................‬‬
‫‪ 8-2-1‬ططططط طططط ططططط طططط ‪22 .........................................................‬‬
‫‪ 8-2-2‬ططططط طططط طططططط ططططط‪24 ....................................................‬‬
‫‪ 8-2-3‬ططططط ططططط ططططط‪24 ....................................................................‬‬
‫‪ 8-2-4‬ططططط ططططط ططططط ططط طططط ططططططط‬
‫ططططططططط‪25 ...................................................................................................‬‬
‫‪ 8-2-5‬ططططط ططططط طططط طططط‪25 ..........................................................‬‬
‫‪ 8-2-6‬ططططط ططططططط ططططط ططططط ططططططط ‪. test | new window‬‬
‫‪28‬‬
‫‪ 8-2-7‬ططططط ططططططط ططططط ططططط ططططططط ‪ draw | ellipse‬ط‬
‫طططط ططططططط ‪30 ....................................................................................close‬‬
‫‪ 8-2-8‬ططططططط ططط ططططططط‪35 ..............................................................‬‬
‫‪ 8-2-9‬ططططط طططططططط ‪40 ..........................................................................‬‬
‫‪ 8-2-10‬ططططططط ططط ططططططط‪41 ............................................................‬‬

‫‪ -9‬المراجع‪41...........................................‬‬

‫م‪ .‬أحمد زين‪2001-‬‬


‫مدخل إلى ‪Visual Prolog‬‬

‫مدخل إلى ‪Visual Prolog‬‬


‫‪Version 5.2‬‬

‫‪-1‬مقدمة‪:‬‬

‫‪ 1-1‬ةةةةةةةة ةة ة ةةةةة ة ةةةة ة ةةة ةة ةةة ة ‪ Prolog‬ةةةةةةةة ة ة‬


‫ةةةةةة ةةةةة ةةةةة ةةةة ‪Visual Prolog‬‬
‫تتميز لغة البرمجة بلغة ‪ visual prolog‬عن لغة ‪ Prolog‬المعيارية بأنه يجب أن نعرف‬
‫أنماط الغراض التي تطبق عليها السناديات‪ .‬إن تعريف النماط يسمح لمترجم ‪Visual‬‬
‫‪ Prolog‬بترجمة البرنامج المكتوب بهذه اللغة إلى لغة اللة بحيث نحصل على سرعة‬
‫تنفيذ عالية مشابهة للسرعات التي نحصل عليها عند كتابة برنامجنا بلغات البرمجة‬
‫الخرى)‪ ++c‬أو ‪ c‬أو ‪.(Pascal‬‬

‫‪ Visual Prolog 1-2‬ةة ةة ةةةة ‪ INTERPRETER‬ةة ةةةةة ‪COMPILER‬‬


‫يمكن لـ ‪Visual Prolog‬أن يعمل كمفسر وفي هذه الحالة يقوم بتنفيذ البرنامج سطرا ً‬
‫سطرا ً كما يمكنه العمل كمترجم وفي هذه الحالة يقوم ‪ Visual Prolog‬بترجمة‬
‫لخرى )‪ ++C‬أو ‪C‬‬ ‫البرنامج المنطقي إلى لغة اللة كما هو الحال في لغات البرمجة ا ٌ‬
‫أو ‪.(Pascal‬‬

‫‪ -2‬استخدام ‪ Visual Prolog‬كمفسر لكتابة برامج منطقية بسيطة‬

‫‪ 2-1‬ةةةةة ةةةةةة ‪Visual Prolog‬‬


‫يتألف برنامج ‪ Visual Prolog‬من أربعة مقاطع رئيسية‪:‬‬
‫‪ -1‬مقطع تعريف النماط ‪the domains section‬‬
‫‪ -2‬مقطع تعريف السناديات ‪the predicates section‬‬
‫‪ -3‬مقطع القواعد ‪ The clauses section‬يعتبر هذا المقطع الجزء الساسي من‬
‫البرنامج‬
‫‪ -4‬مقطع التساؤل أو الهدف ‪ The goal section‬هنا نضع الهدف أو التساؤل‬
‫الساسي الذي سيقوم ‪ Prolog‬بحله‪.‬‬

‫‪ 2-2‬ةةةةة ةةةةة ةةةةةةةة‬


‫لنفرض أننا نريد كتابة برنامج منطقي لوصل قائمتين‪ ،‬باستخدام لغة ‪ Prolog‬المعيارية‬
‫يمكن كتابة هذا البرنامج على الشكل التالي‪:‬‬
‫‪append([],Y,Y).‬‬
‫‪append([X|X1],Y,[X|Z1]):-append(X1,Y,Z1).‬‬
‫باستخدام ‪ Visual Prolog‬يصبح البرنامج له الشكل التالي‪:‬‬
‫‪DOMAINS‬‬
‫*‪numberList = number‬‬
‫‪number = integer‬‬

‫‪PREDICATES‬‬
‫)‪append(numberList, numberList,numberList‬‬

‫‪CLAUSES‬‬
‫‪append([],Y,Y).‬‬
‫‪append([X|X1],Y,[X|Z1]):-append(X1,Y,Z1).‬‬

‫‪GOAL‬‬
‫‪append([1,2], [ 3,4, 5,6],Z).‬‬

‫م‪ .‬أحمد زين‪2001-‬‬


‫مدخل إلى ‪Visual Prolog‬‬

‫لكتابة البرنامج السابق نتبع الخطوات التالية‪:‬‬


‫‪ .1‬نقوم بتشغيل برنامج ‪.Visual Prolog‬‬

‫‪ .2‬نفتح نافذة لكتابة البرنامج عن طريق القائمة ‪ file | new‬فنحصل على ما يلي‪:‬‬

‫‪ .3‬نكتب البرنامج السابق داخل النافذة السابقة و نحفظه باسم ‪:member.pro‬‬

‫م‪ .‬أحمد زين‪2001-‬‬


‫مدخل إلى ‪Visual Prolog‬‬

‫‪ .4‬لتنفيذ التساؤل‪:‬‬
‫‪append([1,2], [ 3,4, 5,6],Z).‬‬
‫نقوم باستدعاء القائمة ‪Project | Test Goal‬‬
‫فنحصل على النافذة التالية‪:‬‬

‫نلحظ أنه تم الجابة على التساؤل بـأنه لدينا حل وحيد هو ‪. [Z=[1,2,3,4,5,6‬‬


‫تمرين‬
‫قم بتعديل التساؤل السابق و لحظ الجابات التي يعطيها البرنامج في كل مرة‪.‬‬

‫‪ 2-3‬ةةةةةةة ةةة ةةةةةةةة‬


‫نلحظ أن البرنامج السابق مؤلف من المقاطع التالية‪:‬‬

‫‪ 2-3-1‬مقطع تعريف النماط‬


‫‪DOMAINS‬‬
‫*‪numberList = number‬‬
‫‪number = integer‬‬
‫في هذا المقطع نقوم بتعريف النمط ‪ namelist‬وهو عبارة عن قائمة من العناصر من‬
‫النمط ‪ .name‬حيث العنصر ‪ name‬معرف في السطر التالي على أنه من النمط‬

‫م‪ .‬أحمد زين‪2001-‬‬


‫مدخل إلى ‪Visual Prolog‬‬

‫‪ .symbol‬بنفس الطريقة يمكننا أن نعرف قائمة من العداد الطبيعية أو الحقيقية أو‬


‫المحارف‬

‫‪ 2-3-2‬مقطع تعريف السناديات‬


‫‪PREDICATES‬‬
‫)‪append(numberList, numberList,numberList‬‬
‫في هذا المقطع نعرف السنادية ‪ member‬التي تطبق على ثلثة أغراض من النمط‬
‫‪ ، numberList‬في حال كون السنادية يمكنها أن تولد عدة حلول فيجب علينا تعريف‬
‫ذلك بشكل صريح و إعطائها الخاصة ‪.nondeterm‬‬

‫‪ 2-3-3‬مقطع القواعد و الحقائق‬


‫‪CLAUSES‬‬
‫‪append([],Y,Y).‬‬
‫‪append([X|X1],Y,[X|Z1]):-append(X1,Y,Z1).‬‬

‫‪ 2-3-4‬مقطع التساؤل أو الهدف‬


‫‪GOAL‬‬
‫‪append([1,2], [ 3,4, 5,6],Z).‬‬

‫‪ 2-4‬ةةةةة ةةةةةة‬
‫تعرفنا على المقاطع الساسية لبرنامج مكتوب بلغة ‪ ،Visual Prolog‬سنشير هنا إلى‬
‫مقاطع أخرى إضافية و هي‪:‬‬

‫‪ 4-2-1‬مقطع الحقائق ‪facts‬‬


‫يمكننا القول بأن برنامج ‪ Visual Prolog‬هو مجموعة من الحقائق و القواعد‪ ،‬في بعض‬
‫الحيان أثناء تنفيذ البرنامج يمكن أن نحتاج لتعديل بعض الحقائق التي يعمل عليها‬
‫البرنامج‪ .‬لكي يمكننا القيام بذلك‪ ،‬هذه الحقائق يجب أن ُتعرف على أنها جزء من‬
‫قاعدة البيانات الديناميكية و هذا يتم في مقطع الحقائق ‪.facts‬‬
‫يمكننا إضافة حقائق جديدة خلل زمن التنفيذ عن طريق السناديات ‪assert, asserta,‬‬
‫‪ ،assertz, consult‬أما إذا أردنا حذف حقائق فيمكننا ذلك عن طريق السناديات المعيارية‬
‫‪retract , retractall‬‬

‫‪ 4-2-2‬مقطع الثوابت ‪constants‬‬


‫يمكننا في هذا المقطع تعريف ثوابت رمزية و ذلك كما في المثال التالي‪:‬‬
‫‪CONSTANTS‬‬
‫‪false = 0‬‬
‫‪true = 1‬‬
‫‪pi = 3.14‬‬

‫‪ 4-2-3‬المقاطع العامة المتنوعة ‪global‬‬


‫في البرمجة بلغة ‪ visual prolog‬يمكننا أن نعرف أنماط معطيات عامة أو إسناديات‬
‫عامة أو حقائق عامة و ذلك ضمن المقاطع‪global domains, global predicates, global :‬‬
‫‪.facts‬‬

‫‪ -3‬أنماط المعطيات في ‪Visual Prolog‬‬

‫‪ 3-1‬ةةةةةةة ةةةةةةةة ةة ‪Visual Prolog‬‬


‫لدينا النماط الساسية التالية‪:‬‬

‫م‪ .‬أحمد زين‪2001-‬‬


‫مدخل إلى ‪Visual Prolog‬‬

‫‪char, real, string, symbol, short, ushort, long,ulong, integer, unsigned, byte, sbyte,‬‬
‫‪word, dword.‬‬
‫الجدول التالي يوصف هذه النماط‪.‬‬
‫الوصف‬ ‫النمط‬
‫النمط المحرفي حيث نرمز للمحرف ‪ d‬بـ '‪.'d‬‬ ‫‪Char‬‬
‫مكافئ للنمط ‪ double‬في لغة ‪.c‬‬ ‫‪Real‬‬
‫سلسلة من المحارف منتهية بالمحرف ‪ null‬كما‬ ‫‪String‬‬
‫في لغة ‪c‬‬
‫مؤشر لمدخل في جدول رموز يحوي سلسل من‬ ‫‪Symbol‬‬
‫المحارف‬
‫من ‪ -32768‬حتى ‪32767‬‬ ‫‪Short‬‬
‫من ‪ 0‬إلى ‪65535‬‬ ‫‪Ushort‬‬
‫من ‪ - 2147483648‬إلى ‪2147483647‬‬ ‫‪Long‬‬
‫من ‪ 0‬حتى ‪4294967295‬‬ ‫‪Ulong‬‬
‫قيمة صحيحة تنتمي لمجال يختلف باختلف‬ ‫‪Integer‬‬
‫الحاسب المستخدم‬
‫قيمة طبيعية تنتمي لمجال يختلف باختلف‬ ‫‪Unsigned‬‬
‫الحاسب المستخدم‬
‫من ‪255-0‬‬ ‫‪Byte‬‬
‫من ‪ 128-‬حتى ‪128‬‬ ‫‪Sbyte‬‬
‫من ‪ 0‬حتى ‪65535‬‬ ‫‪Word‬‬
‫من ‪ 0‬حتى ‪4294967295‬‬ ‫‪Dword‬‬

‫للمزيد من المعلومات حول نمط من النماط اطلب القائمة ‪help\contents‬‬

‫‪ 3-2‬ةةةةةةة ‪Lists‬‬

‫‪ 3-2-1‬تعريف قائمة‬
‫يمكننا تعريف قائمة في ‪ Visual Prolog‬على الشكل التالي‪:‬‬
‫‪DOMAINS‬‬
‫*‪charList = char‬‬
‫هذا يعرف لنا نمط المعطيات ‪ charList‬الذي يمثل قائمة من العداد من النمط ‪.char‬‬
‫التعبير ‪ * char‬يعني قائمة من المحارف ‪ ،char‬بنفس الطريقة يمكننا تعريف قائمة من‬
‫العداد الطبيعية أو الحقيقية أو الرموز‪.‬‬
‫إن عناصر السلسلة يمكن أن يكونوا من أي نمط )يمكن أن تكون قوائم على سبيل‬
‫المثال( ولكن كل عناصر القائمة يجب أن يكونوا من نفس النمط‪.‬‬
‫إذا أردنا تعريف قائمة تحوي عناصر من أنماط مختلفة فيمكننا القيام بذلك على النحو‬
‫التالي ‪:‬‬
‫*‪valueList = value‬‬
‫)‪value = b(byte); c(char); s(string);r(real‬‬

‫أما التعريف التالي فهو خاطئ‪:‬‬


‫*‪valueList = value‬‬
‫‪value=byte;char;string;real‬‬ ‫‪*/‬هذا التعريف خاطىء*‪/‬‬

‫تمرين‪:‬‬
‫القائمة التالية هي قائمة غير صحيحة في ‪:Visual Prolog‬‬
‫]‪[ ["foo", "zoo"], "doo" ,100,33‬‬

‫م‪ .‬أحمد زين‪2001-‬‬


Visual Prolog ‫مدخل إلى‬

.‫أعد تمثيل هذه القائمة بشكل صحيح‬

‫ بعض العمليات على القوائم‬3-2-2

‫ برنامج منطقي لحساب طول قائمة‬1- 3-2-2


DOMAINS
list = element*
element=integer

PREDICATES
listLength(list,integer)

CLAUSES
listLength ([], 0).
listLength ([_|R],L):- listLength (R,LR),L = LR + 1.

GOAL
listLength ([9,9,12,3,4,8], L).
:‫خرج البرنامج هو التالي‬
L=6
Solution 1

‫ برنامج منطقي لعكس قائمة‬2- 3-2-2


DOMAINS
numberList = number*
number = integer

PREDICATES
reverse(numberList, numberList,numberList)
reverse(numberList,numberList)

CLAUSES
reverse(X,Y):-reverse(X,[],Y).
reverse([X|X1],Acc,Y):-reverse(X1,[X|Acc],Y).
reverse([],Y,Y).

GOAL
reverse([1,2,3,4,5],Z).

‫ برنامج منطقي لحذف تواتر عنصر من قائمة‬3- 3-2-2


DOMAINS
namelist = name*
name = symbol

PREDICATES
nondeterm del(name, namelist,namelist)

CLAUSES
del(_,[],[]).

2001-‫ أحمد زين‬.‫م‬


‫مدخل إلى ‪Visual Prolog‬‬

‫‪del(X,[X|Y],R):-del(X,Y,R).‬‬
‫‪del(X,[Y|Z],[Y|R]):-X<>Y,del(X,Z,R).‬‬

‫‪GOAL‬‬
‫‪del(green, [red,green, green,bleu] ,Z).‬‬

‫‪ 3-2-2-4‬برنامج منطقي لمعرفة كون قائمة تشكل الجزء الخير من‬


‫قائمة‬
‫‪DOMAINS‬‬
‫*‪namelist = name‬‬
‫‪name = symbol‬‬

‫‪PREDICATES‬‬
‫)‪nondeterm suffix(namelist, namelist‬‬

‫‪CLAUSES‬‬
‫‪suffix(X,X).‬‬
‫‪suffix(X,[_|Z]):-suffix(X,Z).‬‬

‫‪GOAL‬‬
‫‪suffix([ali,samir], [ ali,zaid, samir,ahmad]).‬‬

‫‪ 5- 3-2-2‬برنامج منطقي لمعرفة كون قائمة تشكل الجزء الول من‬


‫قائمة‬
‫‪DOMAINS‬‬
‫*‪namelist = name‬‬
‫‪name = symbol‬‬

‫‪PREDICATES‬‬
‫)‪prefix(namelist, namelist‬‬

‫‪CLAUSES‬‬
‫‪prefix([],_).‬‬
‫‪prefix([X|A],[X|B]):-prefix(A,B).‬‬

‫‪GOAL‬‬
‫‪prefix([ali,samir], [ali, samir , ahmad,maher]).‬‬

‫‪ 6- 3-2-2‬تمارين‬
‫‪ -1‬باستخدام السناديتين ‪ suffix‬و ‪ prefix‬السابقين اكتب برنامج منطقي لختبار كون‬
‫قائمة هي جزء من قائمة سواء في بداية القائمة أو في نهايتها أو في وسطها‪.‬‬
‫‪ -2‬اكتب برنامج منطقي لفرز قائمة باستخدام خوارزمية الفرز السريع ‪.quicksort‬‬
‫‪-3‬اكتب برنامج منطقي لفرز قائمة باستخدام خوارزمية الفرز الفقاعي ‪.BubbleSort‬‬
‫‪-4‬اكتب برنامج منطقي لحساب تواتر عنصر في قائمة‬
‫‪ -5‬العمليات على الرقام الطبيعية‪:‬‬
‫فيما يلي سنقوم بتمثيل العدد ‪ 0‬بـ ‪0‬‬
‫العدد ‪ 1‬بـ ‪(s(0‬‬

‫م‪ .‬أحمد زين‪2001-‬‬


‫مدخل إلى ‪Visual Prolog‬‬

‫العدد ‪ 2‬بـ ‪((s(s(0‬‬


‫العدد ‪ 3‬بـ ‪(((s(s(s(0‬‬
‫وهكذا )‪ s n (0‬تمثل العدد ‪ n (n‬تطبيق للتابع ‪ ( s‬التابع ‪ s‬هو التابع ‪ successor‬و تطبيقه‬
‫يعني العدد التالي‪.‬‬
‫الن سنقوم بكتابة برنامج منطقي لجمع عددين طبيعيين ممثلين بهذه الطريقة‪:‬‬
‫‪domains‬‬
‫;‪EXP = zero‬‬
‫)‪s(EXP‬‬

‫‪predicates‬‬
‫;)‪sum(EXP X,EXP Y,EXP Z‬‬

‫‪clauses‬‬
‫‪sum(X,zero,X).‬‬
‫‪sum(X,s(Y),s(Z)):-sum(X,Y,Z).‬‬

‫‪goal‬‬
‫‪sum(s(s(s(zero))),s(zero),Z).‬‬
‫المطلوب كتابة إسناديات الضرب والمقارنة و الرفع إلى قوة و باقي العمليات‬
‫المعروفة على العداد الطبيعية مستخدما ً بالطبع نفس التمثيل‪.‬‬

‫‪-4‬العمليات الحسابية و عمليات المقارنة في ‪Visual Prolog‬‬

‫إن العمليات الحسابية و عمليات المقارنة في ‪Visual Prolog‬تماثل تلك الموجودة في‬
‫لغات البرمجة الخرى كـ ‪ ،...++c, c‬وفي ما يلي عرضا ً لهذه العمليات‪.‬‬

‫‪ 4-1‬ةةةةةةةة ةةةةةةةة‬

‫التعبير الحسابي يتألف من عمليات و معاملت و أقواس‪ ،‬مثال على ذلك ‪:‬‬

‫)‪X +Y+ 1 / (Z1+Z2‬‬

‫‪ 4-2‬ةةةةةةةة ةةةةةةةة‬

‫في ‪ Visual Prolog‬لدينا العمليات الحسابية الربع )الجمع‪ ،‬الطرح‪ ،‬الضرب التقسيم(‬
‫المعاملت يمكن أن تكون من أنماط صحيحة أو حقيقية و يختلف نمط النتيجة حسب‬
‫المعاملت و الجدول التالي يوضح ذلك‪:‬‬

‫النتيجة‬ ‫المعامل‬ ‫العملية‬ ‫المعامل الول‬


‫الثاني‬
‫عدد صحيح‬ ‫عدد صحيح‬ ‫* ‪+, -,‬‬ ‫عدد صحيح‬
‫عدد حقيقي‬ ‫عدد صحيح‬ ‫* ‪+, -,‬‬ ‫عدد حقيقي‬
‫عدد حقيقي‬ ‫عدد حقيقي‬ ‫* ‪+, -,‬‬ ‫عدد صحيح‬
‫عدد حقيقي‬ ‫عدد حقيقي‬ ‫* ‪+, -,‬‬ ‫عدد حقيقي‬

‫م‪ .‬أحمد زين‪2001-‬‬


‫مدخل إلى ‪Visual Prolog‬‬

‫عدد حقيقي‬ ‫صحيح أو‬ ‫‪/‬‬ ‫صحيح أو حقيقي‬


‫حقيقي‬
‫عدد صحيح‬ ‫عدد صحيح‬ ‫‪Div‬‬ ‫عدد صحيح‬
‫عدد صحيح‬ ‫عدد صحيح‬ ‫‪Mod‬‬ ‫عدد صحيح‬

‫أما أولوية التنفيذ فهي معرفة بالجدول التالي‪:‬‬

‫الولوية‬ ‫العملية‬
‫‪1‬‬ ‫‪+-‬‬
‫‪2‬‬ ‫‪* / mod div‬‬
‫‪3‬‬ ‫‪- + (unary‬‬

‫‪ 4-3‬ةةةةةةة ةةةةةةةةةةة ةةةةةةةة‬


‫الوصف‬ ‫السم‬
‫يعيد باقي قسمة ‪ X‬على ‪Y‬‬ ‫‪X mod Y‬‬

‫حاصل قسمة ‪ X‬على ‪Y‬‬ ‫‪X div Y‬‬


‫القيمة المطلقة‬ ‫‪(Abs(X‬‬
‫التوابع المثلية) ‪ X‬يجب أن تكون مقدرة‬ ‫‪(cos(X‬‬
‫بالراديان(‬ ‫‪(sin(X‬‬
‫‪(tan(X‬‬
‫‪(arctan(X‬‬
‫التابع السي‬ ‫‪(exp(X‬‬
‫اللوغاريتم بالنسبة للساس ‪e‬‬ ‫‪(ln(X‬‬
‫اللوغاريتم العشري‬ ‫‪(log(X‬‬
‫الجذر التربيعي‪.‬‬ ‫‪(sqrt(X‬‬
‫إسناد قيمة عشوائية حقيقية لـ ‪ X‬بحيث‪0 :‬‬ ‫‪(Random(X‬‬
‫>= ‪X < 1‬‬
‫إسناد قيمة عشوائية طبيعية لـ ‪ Y‬بحيث‪0 :‬‬ ‫‪(Random(X, Y‬‬
‫>= ‪Y < X‬‬
‫تابع التقريب‬ ‫‪(Round(X‬‬
‫تابع الجزء الصحيح‬ ‫‪(trunc(X‬‬
‫التحويل من نمط رقمي لنمط رقمي بشكل‬ ‫‪(Val(domain,X‬‬
‫صريح‬

‫‪ 4-4‬ةةةةةةة ةةةةةةةة‬

‫م‪ .‬أحمد زين‪2001-‬‬


‫مدخل إلى ‪Visual Prolog‬‬

‫‪ 4-4-1‬مقدمة‬
‫اللغة ‪ Visual Prolog‬تسمح بمقارنة التعابير الحسابية و المحارف و سلسل المحارف و‬
‫الرموز‪ ،‬لحظ التعبير التالي‪:‬‬
‫‪X <Y-12‬‬

‫هذا التعبير في ‪ Visual Prolog‬مكافئ إلى أن قيمة ‪ X‬أصغر من قيمة ‪ Y‬مطروحا ً منها‬
‫القيمة ‪.12‬‬
‫الجدول التالي يعرض معاملت المقارنة الموجودة في ‪Visual Prolog‬‬

‫العلقة‬ ‫الرمز‬
‫أصغر من‬ ‫>‬
‫أصغر أو يساوي‬ ‫>=‬
‫يساوي‬ ‫=‬
‫أكبر من‬ ‫<‬
‫أكبر أو يسوي‬ ‫<=‬
‫ل يساوي‬ ‫>< ‪or‬‬
‫<>‬

‫يجب توخي الحذر عند استخدام السنادية = لمقارنة قيم حقيقية‪ ،‬لنأخذ التعبير التالي‬
‫‪100 = 5 * 100/5‬‬

‫يمكنك ملحظة أن التعبير السابق سوف يخفق)لماذا(‪.‬‬

‫اقترح طريقة لمقارنة عددين حقيقيين‪.‬‬

‫‪ 4-4-2‬مقارنة المحارف و سلسل المحارف و الرموز‬


‫مقارنة محرفين‬ ‫‪‬‬
‫لمقارنة محرفين )مثل ً '‪ ( 'd'<'e‬يقوم ‪ Visual Prolog‬بتحويلها إلى الشكل ‪101>100‬‬
‫حيث ‪ 100‬هو التمثيل الـ ‪ ASCII‬لـ ‪ d‬و ‪ 101‬هو التمثيل الـ ‪ ASCII‬لـ ‪. e‬‬
‫مقارنة سلسلتين من المحارف‬ ‫‪‬‬
‫لمقارنة سلسلتين من المحارف نكتب مثل ً "‪"ali" > "alia‬‬
‫مقارنة الرموز ‪symbols‬‬ ‫‪‬‬
‫ل يمكن مقارنة رمزين بشكل مباشر بل يجب وضعهما في البداية في متحولت أو‬
‫كتابتها على شكل سلسل من المحارف و من ثم مقارنتها‬

‫‪ -5‬البرمجة غرضية التوجه في ‪Visual Prolog‬‬


‫باستخدام ‪ Visual Prolog‬يمكنك استخدام أسلوب البرمجة غرضية التوجه ‪ .‬إن إنشاء‬
‫صف في ‪ Visual Prolog‬يتطلب شيئين الول تعريف الصف الذي يعبر عن واجهة‬
‫الصف التي يمكن أن ُترى من الخارج‪ .‬و الثاني بناء الصف و الذي يحوي على القواعد‬
‫المنطقية لتعريف وظائف الصف‪ .‬نلحظ أن هنالك فصل ً بين واجهة الصف و بناء‬
‫الصف‪.‬‬

‫‪ 5-1‬ةةةةة ةةةة ‪Class declarations‬‬


‫نعرف الصف على الشكل التالي‪:‬‬
‫] ‪CLASS class-name [: parentclass-list‬‬
‫‪PREDICATES‬‬
‫‪predicatedeclaration-list‬‬

‫م‪ .‬أحمد زين‪2001-‬‬


‫مدخل إلى ‪Visual Prolog‬‬

‫‪FACTS‬‬
‫‪factdeclaration-list‬‬
‫‪ENDCLASS‬‬

‫نلحظ أن الخيار ‪ parentclass-list‬يحدد الصفوف التي نشتق منها الصف ‪.class-name‬‬

‫‪ 5-2‬ةةةة ةةةة‬
‫يتم بناء الصف على الشكل التالي‪:‬‬
‫] ‪IMPLEMENT class-name [: parentclass-list‬‬
‫‪PREDICATES‬‬
‫‪predicatedeclaration-list‬‬
‫‪FACTS‬‬
‫‪factdeclaration-list‬‬
‫‪CLAUSES‬‬
‫‪Clause-list‬‬
‫‪ENDCLASS‬‬

‫‪ 5-3‬ةةةةة ةةةةةةة‬
‫بعد تعريف الصف و بنائه يمكننا أن ٌنعّرف أغراض جديدة باستخدام التابع ‪ new‬الذي‬
‫يعيد مرجعا ً إلى الصف يمكن استخدامه فيما بعد للقيام بعمليات على الغرض‪.‬‬

‫‪ 5-4‬ةةةةة ةةةةةةة‬
‫في ‪ Visual Prolog‬الغراض يجب أن تدمر بشكل صريح )عكس ما يتم في لغة ‪(Java‬‬
‫و ذلك عن طريق طلب التابع ‪ ،delete‬و ذلك كما في المثال التالي حيث سنقوم‬
‫بتعريف الغرض ‪ M‬ثم سنستدعى السنادية ‪ sumElement‬و من ثم سنقوم بتدمير‬
‫الغرض‪:‬‬
‫‪M = matrix::new,‬‬
‫‪M:sumElement(Result),‬‬
‫‪M:delete.‬‬
‫إن تدمير غرض سينتج عنه حذف كل الحقائق الموافقة لهذا الغرض من قاعدة‬
‫البيانات‪.‬‬

‫‪ 5-5‬ةةةةةةة ةةةة‬
‫في ‪ Visual Prolog‬يمكننا اشتقاق صف من صف كما أنه يمكننا استخدام مفهوم‬
‫السناديات الفتراضية حيث يمكنك تعريف إسنادية في الصف الب و من ثم إعادة‬
‫تعريفه في أي صف مشتق من هذا الصف كما أنه يمكننا تعريف إسناديات و حقائق و‬
‫إعطائها االخاصة ‪ ،static‬فإذا كان لدينا حقيقة ‪ fact‬تملك الخاصة ‪ static‬فهذا يعني أنه ل‬
‫يتم توليد هذه الحقيقة من أجل كل غرض بل هنالك نسخة واحدة للصف تشترك بها‬
‫جميع أغراض هذا الصف‪ .‬هذه الخاصية مفيدة على سبيل المثال لعد أغراض صف‪.‬‬
‫من ناحية أخرى إن ‪ Visual Prolog‬هو الذي يقوم بعملية حجر الذاكرة عند تعريف‬
‫غرض ما و لكن في بعض الحيان قد نحتاج لتعريف الكيفية التي يبنى بها هذا الغرض‬
‫أو الكيفية التي يتم فيها حذفه‪ .‬يمكن للمبرمج أن يقوم بذلك عن طريق تعريف‬
‫إسناديات لبناء و هدم الغراض هذه السناديات نسميها إسناديات البناء و الهدم )‬
‫‪. (constructors and destructors‬‬
‫يمكننا تعريف باني عن طريق تعريف السنادية ‪ new‬أما الهادم فيتم تعريفه عن طريق‬
‫تعريف السنادية ‪ .delete‬يمكن للبن الوصول إلى الباني للب عن طريق التعليمة‬
‫التالية ‪.baseclass::new‬‬

‫‪ -6‬عمليات القراءة و الكتابة و التعامل مع الملفات في ‪Visual Prolog‬‬

‫م‪ .‬أحمد زين‪2001-‬‬


Visual Prolog ‫مدخل إلى‬

:‫يتم تعريف ملف كما يلي‬


DOMAINS
file = myfile
‫ بشكل‬.‫ تسمح بالكتابة في ملف أو على الشاشة‬write ‫التعليمة‬Visual Prolog ‫في‬
‫افتراضي عندما نكتب تكون الكتابة موجهة إلى الشاشة عندما نريد الكتابة في ملف‬
:‫نقوم بفتح الملف للكتابة و من ثم توجيه الكتابة إلى هذا الملف‬
openwrite(f1,"file1"),
writedevice(f1)
:‫لغلق ملف نستخدم التعليمة‬
closefile(f1)
(writedevice(screen ‫لعادة توجيه الكتابة إلى الشاشة نستخدم التعليمة‬
:‫ كتابة قائمة في ملف‬:1 ‫مثال‬ •
DOMAINS
file = myfile
integerList=integer*
PREDICATES
writeListToFile(integerList)
CLAUSES
writeListToFile([]).
writeListToFile([H|T]):-write(H),nl,writeListToFile(T).
GOAL
openwrite(myfile,"hi.txt"),
writedevice(myfile),
writeListToFile([22,40,80,90,200,200]),
closefile(myfile),
writedevice(screen),
write("the list [22,40,80,90,200,200] was saved to the file hi.txt"),nl.

‫ قراءة قائمة من العداد الطبيعية)عن طريق لوحة المفاتيح( و من‬:2 ‫مثال‬ •


:‫ثم حساب طول هذه القائمة‬
DOMAINS
list = integer*
PREDICATES
read_list(list)
length_of(list,integer)
CLAUSES
read_list([H|T]):-
write("> "),
readint(H),!,
read_list(T).
read_list([]).
length_of([], 0).
length_of([_|T],L):-
length_of(T,TailLength),
L = TailLength + 1.
GOAL
write(" Enter the a of integer ended by a char:"),nl,
read_list(TheList),nl,
length_of(TheList,TheLength).
:‫فيما يلي عرضا ً لتعليمات القراءة و الكتابة و التعامل مع الملفات‬

2001-‫ أحمد زين‬.‫م‬


‫مدخل إلى ‪Visual Prolog‬‬

‫الوصف‬ ‫السنادية‬
‫للكتابة في ملف أو على الشاشة‪،‬‬ ‫‪Write(Param1, Param2,‬‬
‫متحولت الدخل هي عبارة عن‬ ‫‪(Param3, ..., ParamN‬‬
‫ثوابت أو من أنماط بسيطة‬
‫النتقال إلى سطر جديد‬ ‫‪Nl‬‬
‫الكتابة المنمطة‬ ‫‪Writef(FormatString, Arg1, Arg2,‬‬
‫‪(Arg3, ...,ArgN‬‬
‫قراءة سطر‪ ،‬المتحول ‪ line‬يجب‬ ‫‪(Readln(Line‬‬
‫أن يكون من نمط ‪string‬‬
‫قراءة متحول من نمط ‪integer‬‬ ‫‪(Readint(X‬‬
‫قراءة متحول من نمط ‪real‬‬ ‫‪(Readreal(X‬‬
‫قراءة متحول من نمط ‪char‬‬ ‫‪(Readchar(CharParam‬‬
‫قراءة حد‬ ‫‪(Readterm(DomainName, Term‬‬
‫فتح ملف للقراءة‬ ‫‪Openread(SymbolicFileName,‬‬
‫‪(OSFileName‬‬
‫فتح ملف للكتابة‬ ‫‪Openwrite(SymbolicFileName,‬‬
‫‪(OSFileName‬‬
‫فتح ملف للقيام بالكتابة إلى نهايته‬ ‫‪Openappend(SymbolicFileName,‬‬
‫‪(OSFileName‬‬
‫فتح ملف للقراءة و الكتابة‬ ‫‪Openmodify(SymbolicFileName,‬‬
‫‪(OSFileName‬‬
‫تحديد نمط ملف‪:‬‬ ‫‪Filemode(SymbolicFileName,‬‬
‫نمط نصي في حال كون‬ ‫‪(FileMode‬‬
‫‪FileMode=1‬‬
‫نمط ثنائي في حال كون‬
‫‪FileMode=0‬‬
‫إغلق ملف‬ ‫‪(Closefile(SymbolicFileName‬‬
‫تحديد جهاز القراءة الحالي‬ ‫‪Readdevice(SymbolicFileName‬‬
‫تحديد جهاز الكتابة الحالي‬ ‫‪(Writedevice(SymbolicFileName‬‬
‫فحص فيما إذا كان موقع القراءة‬ ‫‪(Eof(SymbolicFileName‬‬
‫أو الكتابة في نهاية الملف أم ل‬

‫تمرين‪:‬‬
‫ً‬ ‫ً‬
‫اكتب برنامجا منطقيا يقوم بقراءة ملف نصي و من ثم يقوم بحساب تواتر كل كلمة‬
‫في هذا الملف و من ثم يقوم بطباعة النتيجة في ملف‪.‬‬

‫‪ -7‬متفرقات‬
‫الوصول إلى وظائف نظام التشغيل‪:‬‬ ‫‪‬‬

‫يمكننا تنفيذ الوظائف التي يؤمنها نظام التشغيل عن طريق السنادية ‪:‬‬
‫‪("system("command‬‬
‫مثال لعادة تسمية ملف باستخدام السنادية ‪ system‬نكتب ما يلي‪:‬‬
‫‪system("ren oldname.txt newname.txt").‬‬

‫للوصول إلى قيمة الساعة الداخلية نستخدم ‪:‬‬ ‫‪‬‬


‫‪(time(Hours, Minutes, Seconds,Hundredths‬‬
‫‪(date(Year, Month, Day, WeekDay‬‬
‫إيقاف تنفيذ البرنامج لمدة ما)‪:(centiseconds‬‬ ‫‪‬‬
‫)‪sleep(CSecs‬‬

‫م‪ .‬أحمد زين‪2001-‬‬


‫مدخل إلى ‪Visual Prolog‬‬

‫تعريف مؤقت و اختبار انتهاؤه‪:‬‬ ‫‪‬‬


‫‪(marktime(CSecs,Ticket‬‬
‫)‪timeout(Ticket‬‬

‫توليد الصوات‪:‬‬ ‫‪‬‬


‫)‪sound(Duration,Frequency‬‬

‫‪-8‬بناء واجهات بيانية باستخدام خبير التطبيقات ‪Application Expert‬خطوة‬


‫بخطوة‬

‫‪ 8-1‬ةةةة ةةةةة ةةةة ةةةة ةةةة ةةةةة ةةةة ةةةةة ةةةة‬


‫هناك تقليد في كتب تعليم لغات البرمجة‪ ،‬و هو البدء ببرنامج بسيط يقوم بطبع رسالة‬
‫على الشاشة للقيام بذلك اتبع الخطوات التالية‪:‬‬
‫بعد تشغيل ‪ Visual Prolog‬قم بإنشاء مشروع جديد عن طريق عنصر قائمة‬ ‫•‬
‫‪: project | new project‬‬

‫أعط المشروع السم ‪ hello‬وحدد الدليل الذي سيتم فيه تخزين ملفات المشروع و‬
‫ليكن '‪ 'c:\hello‬في المكان ‪.Base Directory‬‬
‫اضغط على الخيار ‪ VPI Options‬في صندوق الحوار السابق فيظهر صندوق‬ ‫•‬
‫الحوار التالي‪:‬‬

‫م‪ .‬أحمد زين‪2001-‬‬


‫مدخل إلى ‪Visual Prolog‬‬

‫من خلل هذا الصندوق يمكنك تحديد خواص التطبيق الذي ستقوم ببنائه‪ ،‬في هذا‬
‫المثال البسيط سنحافظ على الخيارات الفتراضية‪.‬‬
‫الن اضغط على الزر ‪ Create‬فتظهر النافذة التالية‪:‬‬ ‫•‬

‫هذه النافذة نسميها بنافذة المشروع فعن طريق هذه النافذة يمكننا استعراض‬
‫الملفات التي يتألف منها المشروع في حالتنا هذه الملفان ‪ hello.pro‬و ‪VPITools.pro‬‬
‫يمكننا رؤية محتويات الملف ‪ hello.pro‬عن طريق الضغط على هذا الملف مرتين‬
‫متتاليتين‪.‬‬
‫ً‬
‫لقد حصلت الن على بنية عامة تساعدك على بناء تطبيقك الخاص بدل من بناء كل‬
‫شيء من الصفر فيكفي أن تقوم بإجراء التعديلت المناسبة لتحصل على التطبيق‬
‫الخاص بك‪ ،‬الن قم بتنفيذ البرنامج عن طريق عنصر القائمة ‪ Project | Run‬فتحصل‬
‫على مايلي‪:‬‬

‫م‪ .‬أحمد زين‪2001-‬‬


‫مدخل إلى ‪Visual Prolog‬‬

‫يمكنك استعراض القوائم و عناصر القوائم و لكنك تلحظ غياب الوظائف عن معظم‬
‫هذه العناصر‪.‬‬
‫الن قم بإنهاء تنفيذ البرنامج‪.‬‬
‫إضافة قائمة جديدة‪:‬‬ ‫•‬
‫سنرى الن كيفية إضافة عنصر قائمة جديد‪ ،‬في نافذة المشروع قم بالضغط على‬
‫الزر ‪ menu‬كما يلي‪:‬‬

‫الن قم بالضغط مرتين متتاليتين على ‪ Task Menu‬فتظهر أمامك النافذة التالية‪:‬‬

‫م‪ .‬أحمد زين‪2001-‬‬


‫مدخل إلى ‪Visual Prolog‬‬

‫عّلم العنصر &‪ Edit‬ومن ثم اضغط على الزر ‪ New‬فتظهر نافذة ستسمح لك بإدخال‬
‫اسم القائمة و الثابت المستخدم لتعريف القائمة هذا الثابت سيتم استخدامه في‬
‫البرنامج‪ ،‬أعط القائمة السم ‪ test‬أما الثابت فيتم تحديده بشكل أوتوماتيكي "‪:"id_test‬‬

‫الن قم بالضغط على الزر ‪ ok‬لتثبيت خيارك و من ثم اضغط على الزر ‪ submenu‬و‬
‫من ثم الزر ‪ new‬لنشاء عنصر قائمة ضمن القائمة ‪ test‬أعط العنصر السم ‪say hello‬‬
‫أما الثابت فيتم اختياره بشكل تلقائي من قبل البرنامج "‪."id_test_say_hello‬‬

‫يمكنك الن أخذ فكرة أولية عن شكل شريط القوائم للبرنامج عن طريق الضغط على‬
‫الزر ‪. test‬‬
‫الن سنقوم بإضافة تعليمات للبرنامج بحيث يتم إظهار صندوق حوار يحتوي‬ ‫•‬
‫الجملة ‪ Hello word‬عند اختيار عنصر القائمة ‪ say hello‬و ذلك عن طريق خبير‬
‫النوافذ و صناديق الحوار‪ ،‬للقيام بذلك اتبع الخطوات التالية‪:‬‬

‫م‪ .‬أحمد زين‪2001-‬‬


‫مدخل إلى ‪Visual Prolog‬‬

‫من نافذة المشروع اضغط على الزر ‪ Window‬و من ثم الزر ‪: code expert‬‬

‫عند ذلك سيظهر صندوق الحوار التالي‪:‬‬

‫صندوق الحوار هذا نسميه خبير النوافذ و صناديق الحوار‪ ،‬ما نريد أن نفعله هو‬
‫إضافة تعليمات خاصة بحادثة اختيار المستثمر لعنصر القائمة ‪ ،say hello‬لذا قم باختيار‬
‫العنصر ‪ Menu‬في قائمة نمط الحوادث "‪ "Event Type‬و العنصر ‪ id_test_say_hello‬في‬
‫قائمة الحوادث "‪ "Event or Item‬و من ثم اضغط على الزر ‪ Add Clause‬و من ثم الزر‬
‫‪ Edit Clause‬فيظهر أمامك نافذة تحرير البرنامج حيث تم إضافة قاعدة جديدة‬
‫للبرنامج‪ ،‬هذه القاعدة يتم تنفيذها عند الضغط على عنصر القائمة ‪ say hello‬و هي‬
‫القاعدة التالية‪:‬‬
‫‪%BEGIN Task Window, id_test_say_hello‬‬
‫‪task_win_eh(_Win,e_Menu(id_test_say_hello,_ShiftCtlAlt),0):-!,‬‬

‫م‪ .‬أحمد زين‪2001-‬‬


‫مدخل إلى ‪Visual Prolog‬‬

‫‪!.‬‬
‫‪%END Task Window, id_test_say_hello‬‬
‫سنقوم بتعديل هذه القاعدة لظهار صندوق حوار يحوي الجملة ‪ Hello word‬و ذلك على‬
‫النحو التالي‪:‬‬
‫اضغط بالزر اليميني للفأرة بعد إشارة القطع الولى ! و اختر عنصر القائمة | ‪Insert‬‬
‫‪ : Predicate Call | Window, Dialog or Toolbar‬فيظهر أمامك صندوق حوار قم بتحديد‬
‫القيم على النحو التالي‪:‬‬

‫الن حدد الخيارات كما في الشكل ثم اضغط على الزر ‪.Ok‬‬


‫ستلحظ أن القاعدة السابقة قد تغيرت و أصبحت على الشكل التالي‪:‬‬
‫‪%BEGIN Task Window, id_test_say_hello‬‬
‫‪task_win_eh(_Win,e_Menu(id_test_say_hello,_ShiftCtlAlt),0):-!,‬‬
‫‪Title="Title",‬‬
‫‪dlg_Note(Title,"Hello word"),‬‬
‫‪!.‬‬
‫‪%END Task Window, id_test_say_hello‬‬
‫حيث تم إضافة السنادية ‪("dlg_Note(Title,"Hello word‬التي تتولى عملية إظهار‬
‫صندوق الحوار كما سنرى عند التنفيذ‪.‬‬
‫هذا كل شيء قم الن بتنفيذ البرنامج فتلحظ أنه عند اختيارك للعنصر ‪test | say hello‬‬
‫ظهور صندوق الحوار التالي‪:‬‬

‫‪ 8-2‬ةةةةة ةةةةة ةةةةة ة ةةةةة ة ةةةةةة ةةةة ةةةةةةة ةةةةة‬


‫الن سنقوم ببناء تطبيق لتوضح كيفية بناء أشرطة قوائم و نوافذ و صناديق حوار في‬
‫‪ Visual Prolog‬و ذلك كما يلي‪ :‬سنقوم في البداية بتوليد تطبيق افتراضي عن طريق‬
‫خبير التطبيقات كما في المثال السابق و من ثم سنقوم بتعديل هذا التطبيق‬
‫الفتراضي بحيث نضيف عنصر قائمة جديد ‪ ،test‬عند اختيار هذا العنصر سيتم فتح نافذة‬
‫جديدة بشريط قوائم جديد يحوي عنصر القائمة ‪ Ellipse‬عند اختيار هذا العنصر من قبل‬
‫المستثمر سيتم إظهار صندوق حوار يسمح للمستثمر بإدخال النقطتين )‪x1,y1),‬‬
‫‪ ((x2,y2‬لرسم قطع ناقص جديد في النافذة‪ ،‬للقيام بما سبق اتبع الخطوات التالية‪:‬‬

‫م‪ .‬أحمد زين‪2001-‬‬


‫مدخل إلى ‪Visual Prolog‬‬

‫قم ببناء تطبيق جديد عن طريق عنصر القائمة ‪ Project | New Project‬و حافظ على‬
‫الباراميترات الفتراضية التي يعرضها خبير التطبيقات‪ ،‬أعط التطبيق السم‬
‫‪.dialogExample‬‬

‫‪ 8-2-1‬إنشاء شريط قوائم جديد‬


‫في نافذة المشروع اضغط على الزر ‪ menu‬على اليمين و على الزر ‪new‬‬ ‫•‬
‫على اليسار‪.‬‬

‫أعط شريط القوائم السم ‪newMenuBar‬‬ ‫•‬

‫أنشئ قائمة جديدة في شريط القوائم السابق عن طريق الزر ‪new‬‬ ‫•‬

‫م‪ .‬أحمد زين‪2001-‬‬


‫مدخل إلى ‪Visual Prolog‬‬

‫أعط القائمة الجديدة السم ‪ draw‬ومن ثم اضغط على الزر ‪:ok‬‬ ‫•‬

‫أنشئ عنصر داخل القائمة ‪ draw‬عن طريق الضغط على الزر ‪ submenu‬و‬ ‫•‬

‫من ثم الزر ‪new‬‬


‫أعط القائمة الجديدة السم ‪:ellipse‬‬ ‫•‬

‫م‪ .‬أحمد زين‪2001-‬‬


‫مدخل إلى ‪Visual Prolog‬‬

‫بنفس الطريقة أضف عنصر قائمة آخر و أعطه السم ‪ ، close‬عنصر القائمة‬ ‫•‬
‫هذا سنستخدمه لغلق النافذة‪.‬‬
‫تلحظ الن أنه أصبح لديك شريطي مهام الول هو ‪ newMenuBar‬و الثاني هو ‪task‬‬
‫‪ menu‬كما في الشكل التالي‪:‬‬

‫‪ 8-2-2‬إنشاء وحدة برمجية جديدة‬


‫الن قم بإنشاء وحدة جديدة و أعطها السم ‪ newModule‬و ذلك بالضغط على الزر‬
‫‪ module‬على اليسار و ‪ new‬على اليمين في نافذة المشروع‪.‬‬

‫‪ 8-2-3‬إنشاء نافذة جديدة‬


‫قم بإنشاء نافذة جديدة وأعطها السم ‪ newWindow‬عن طريق الضغط على‬ ‫•‬
‫الزر ‪ window‬و الزر ‪ new‬في نافذة المشروع‪:‬‬

‫م‪ .‬أحمد زين‪2001-‬‬


‫مدخل إلى ‪Visual Prolog‬‬

‫حدد شريط القوائم ‪ newMenuBar‬كشريط قوائم للنافذة ثم اضغط على الزر ‪.ok‬‬
‫قم بتوليد الترميز الفتراضي الخاص بهذه النافذة عن طرق الضغط على الزر‬ ‫•‬
‫‪ window‬و من ثم ‪ code expert‬في نافذة المشروع و من ثم تحديد الوحدة التي سيتم‬
‫فيها توليد الترميز "‪ "newModule‬و من ثم الضغط على الزر ‪.Default Code‬‬

‫‪ 8-2-4‬إضافة قائمة جديدة إلى شريط القوائم الفتراضي‬


‫قم بتعديل شريط القوائم ‪ Task Menu‬و أضف إليه القائمة ‪ test‬التي تحوي العنصر‬
‫الوحيد ‪new window‬‬

‫‪ 8-2-5‬إنشاء صندوق حوار جديد‬


‫يمكننا إنشاء صندوق حوار جديد و ذلك بالضغط على الزر ‪ dialog‬و من ثم ‪new‬‬ ‫•‬
‫من نافذة المشروع فنحصل على النافذة‪:‬‬

‫م‪ .‬أحمد زين‪2001-‬‬


‫مدخل إلى ‪Visual Prolog‬‬

‫أعط صندوق الحوار السم ‪ mydialog‬و من ثم اضغط على الزر ‪ ok‬كما هو موضح في‬
‫الشكل ومم ثم سوف تلحظ ظهور النافذة التالية‪:‬‬

‫قم باستخدام العناصر الموجودة في النافذة ‪ controls‬بتصميم شكل صندوق‬ ‫•‬


‫الحوار بحيث يصبح على الشكل التالي‪:‬‬

‫م‪ .‬أحمد زين‪2001-‬‬


‫مدخل إلى ‪Visual Prolog‬‬

‫نلحظ أنه لدينا أربعة عناصر تحكم من النوع ‪ text‬و أربعة عناصر تحكم من النوع ‪Edit‬‬
‫تم تعريفها من العلى إلى السفل بالثوابت ‪.idc_x1, idc_y1, idc_x2, idc_y2‬‬
‫كما أنه لدينا زرين هما ‪ ok‬و ‪.cancel‬‬
‫صندوق الحوار هذا سوف يتم استخدامه لرسم القطع الناقص المحدد بالنقطتين )‬
‫‪(x1,y1), (x2,y2‬‬
‫توليد الترميز الخاص بصندوق الحوار هذا‬ ‫•‬
‫اضغط بالزر اليميني للفأرة داخل الصندوق السابق و اختر العنصر ‪ code expert‬سوف‬
‫تلحظ ظهور الصندوق التالي‪:‬‬

‫حدد الخيارات كما هو موضح في الصندوق السابق‪.‬‬


‫الن اضغط على الزر ‪ Dialog Pack‬فيظهر أمامك صندوق الحوار التالي‪:‬‬ ‫•‬

‫م‪ .‬أحمد زين‪2001-‬‬


‫مدخل إلى ‪Visual Prolog‬‬

‫• اضغط مرتين متتاليتين على ‪ idc_x1‬الذي يعّرف عنصر التحكم ‪ edit‬المحدد‬


‫بالثابت ‪ idc_x1‬في صندوق الحوار و حدد نوع المتحول بـ ‪ integer‬كما هو مبين في‬
‫الشكل التالي‪:‬‬

‫افعل الشيء نفسه بالنسبة لـ ‪.idc_y1, idc_x2, idc_y2‬‬


‫اضغط بعد ذلك على الزر ‪. ok‬‬
‫• اضغط على الزر ‪ default code‬في خبير النوافذ و صناديق الحوار فيتم توليد‬
‫ترميز افتراضي خاص بصندوق الحوار هذا و يتم وضعه في الوحدة ‪.‬‬
‫‪.newModule.pro‬‬

‫‪ 8-2-6‬إضافة الترميز الخاص بعنصر القائمة ‪test | new window‬‬


‫سنقوم بإضافة الترميز الخاص بعنصر القائمة ‪ test | new window‬بحيث يتم فتح النافذة‬
‫‪ newWindow‬عند اختيار هذا العنصر وذلك حسب الخطوات التالية‪:‬‬

‫م‪ .‬أحمد زين‪2001-‬‬


Visual Prolog ‫مدخل إلى‬

task window ‫ بعد تحديد النافذة‬code expert ‫ و من ثم‬window ‫• اضغط على الزر‬
:‫في قائمة النوافذ‬

‫ من قائمة‬id_test_new_window ‫ في قائمة نمط الحوادث و اختر‬menu ‫• اختر‬


:add clause ‫الحوادث ثم اضغط على الزر‬

‫ و‬newModule.pre ‫ فتلحظ أنه تظهر أمامك الوحدة‬edit clause ‫• اضغط على الزر‬
:‫ هو التالي‬id_test_new_window ‫تلحظ أن الترميز الخاص بالحادثة‬
%BEGIN Task Window, id_test_new_window
task_win_eh(_Win,e_Menu(id_test_new_window,_ShiftCtlAlt),0):-!,
!.
%END Task Window, id_test_new_window

2001-‫ أحمد زين‬.‫م‬


‫مدخل إلى ‪Visual Prolog‬‬

‫عدل الترميز السابق وذلك بالضغط على الزر اليميني للفأرة بعد إشارة القطع الولى‬
‫ومن ثم اختيار عنصر القائمة ‪: Insert | Predicate Call | Window, Dialog or Toolbar‬‬
‫فيظهر أمامك صندوق حوار‪ ،‬قم بتحديد الخيارات في هذا الصندوق على النحو التالي‪:‬‬

‫سوف تلحظ أن الترميز السابق قد أصبح على النحو التالي‪.‬‬


‫‪%BEGIN Task Window, id_test_new_window‬‬
‫‪task_win_eh(_Win,e_Menu(id_test_new_window,_ShiftCtlAlt),0):-!,‬‬
‫‪win_newwindow_Create(_Win),‬‬
‫‪!.‬‬
‫‪%END Task Window, id_test_new_window‬‬

‫‪ 8-2-7‬إضافة الترميز الخاص بعنصر القائمة ‪ draw | ellipse‬و عنصر القائمة‬


‫‪close‬‬
‫سوف نقوم بإضافة الترميز الخاص بعنصر القائمة ‪ draw | ellipse‬بحيث يتم فتح صندوق‬
‫الحوار ‪ myDialog‬عند اختيار هذا العنصر و ذلك كما يلي‪:‬‬
‫اضغط على الزر ‪ window‬و من ثم الزر ‪ code expert‬بعد تحديد النافذة‬ ‫•‬
‫‪ newWindow‬في قائمة النوافذ‪:‬‬

‫• اختر ‪ menu‬في قائمة نمط الحوادث و اختر ‪ id_draw_ellipse‬من قائمة الحوادث‬


‫ثم اضغط على الزر ‪:add clause‬‬

‫م‪ .‬أحمد زين‪2001-‬‬


Visual Prolog ‫مدخل إلى‬

‫ و‬newModule.pre ‫ فتلحظ أنه تظهر أمامك الوحدة‬edit clause ‫• اضغط على الزر‬
‫ وهو على‬id_test_new_window ‫تلحظ أن تم إضافة الترميز الخاص بالحادثة‬
:‫الشكل التالي‬
%BEGIN newWindow, idr_draw_ellipse
win_newwindow_eh(_Win,e_Menu(idr_draw_ellipse,_ShiftCtlAlt),0):-!,
!.
%END newWindow, idr_draw_ellipse
‫دل الترميز السابق وذلك بالضغط على الزر اليميني للفأرة بعد إشارة القطع الولى‬ ّ ‫ع‬
Insert | Predicate Call | Window, Dialog or Toolbar ‫ومن ثم اختيار عنصر القائمة‬
‫فيظهر أمامك صندوق حوار يمكنك تحديد الخيارات في هذا الصندوق كما هو موضح‬
:‫في الشكل التالي‬

.‫سوف تلحظ أن الترميز السابق قد أصبح على النحو التالي‬


%BEGIN newWindow, idr_draw_ellipse
win_newwindow_eh(_Win,e_Menu(idr_draw_ellipse,_ShiftCtlAlt),0):-!,
dlg_mydialog_Create(_Win),
!.
%END newWindow, idr_draw_ellipse

2001-‫ أحمد زين‬.‫م‬


Visual Prolog ‫مدخل إلى‬

:draw | close ‫بنفس الطريقة أضف الترميز الفتراضي الخاص بالقائمة‬ •


:‫ثم عدل الترميز بحيث يصبح على الشكل‬
%BEGIN newWindow, idr_draw_close
win_newwindow_eh(_Win,e_Menu(idr_draw_close,_ShiftCtlAlt),0):-!,
win_Destroy(_Win),
retractall(p(_,_,_,_)),
!.
%END newWindow, idr_draw_close
.‫( التي تتولى موضوع إغلق النافذة‬win_Destroy(_Win ‫تلحظ أننا استدعينا السنادية‬
‫_( من قاعدة‬,_,_,_)p ‫_(( فتقوم بمحي كل الحقائق‬,_,_,_)retractall(p ‫أما السنادية‬
.‫الحقائق الديناميكية‬
:‫ أصبح لديك الترميز التالي‬newModule ‫الن تلحظ أنه في الوحدة‬
include "dialogexample.inc"
include "dialogexample.con"
include "hlptopic.con"

%BEGIN_WIN newWindow
/**************************************************************************
Creation and event handling for window: newWindow
**************************************************************************/

constants
%BEGIN newWindow, CreateParms, 11:25:51-23.5.2001, Code automatically updated!
win_newwindow_WinType = w_TopLevel
win_newwindow_Flags=
[wsf_SizeBorder,wsf_TitleBar,wsf_Maximize,wsf_Minimize,wsf_Close,wsf_ClipSiblings,wsf_ClipCh
ildren]
win_newwindow_RCT = rct(100,80,440,240)
win_newwindow_Menu = res_menu(id_newmenubar)
win_newwindow_Title = "newWindow"
win_newwindow_Help = idh_contents
%END newWindow, CreateParms

predicates

win_newwindow_eh : EHANDLER

clauses

win_newwindow_Create(_Parent):-
win_Create(win_newwindow_WinType,win_newwindow_RCT,win_newwindow_Title,
win_newwindow_Menu,_Parent,win_newwindow_Flags,win_newwindow_eh,0).

%BEGIN newWindow, e_Create


win_newwindow_eh(_Win,e_Create(_),0):-!,
%BEGIN newWindow, InitControls, 11:25:51-23.5.2001, Code automatically updated!
%END newWindow, InitControls
%BEGIN newWindow, ToolbarCreate, 11:25:51-23.5.2001, Code automatically updated!
%END newWindow, ToolbarCreate
!.
%END newWindow, e_Create
%MARK newWindow, new events

%BEGIN newWindow, idr_draw_close


win_newwindow_eh(_Win,e_Menu(idr_draw_close,_ShiftCtlAlt),0):-!,
win_Destroy(_Win),
retractall(p(_,_,_,_)),

2001-‫ أحمد زين‬.‫م‬


Visual Prolog ‫مدخل إلى‬

!.
%END newWindow, idr_draw_close

%BEGIN newWindow, e_CloseRequest


win_newwindow_eh(_Win,e_CloseRequest,0):-!,
!.
%END newWindow, e_CloseRequest

%BEGIN newWindow, idr_draw_ellipse


win_newwindow_eh(_Win,e_Menu(idr_draw_ellipse,_ShiftCtlAlt),0):-!,
dlg_mydialog_Create(_Win),
!.
%END newWindow, idr_draw_ellipse

%BEGIN newWindow, e_Size


win_newwindow_eh(_Win,e_Size(_Width,_Height),0):-!,
ifdef use_tbar
toolbar_Resize(_Win),
enddef
!.
%END newWindow, e_Size

%BEGIN newWindow, e_Menu, Parent window


win_newwindow_eh(Win,e_Menu(ID,CAS),0):-!,
PARENT = win_GetParent(Win),
win_SendEvent(PARENT,e_Menu(ID,CAS)),
!.
%END newWindow, e_Menu, Parent window

%END_WIN newWindow

%BEGIN_DLG myDialog
/**************************************************************************
Creation and event handling for dialog: myDialog
**************************************************************************/

constants

%BEGIN myDialog, CreateParms, 12:10:24-23.5.2001, Code automatically updated!


dlg_mydialog_ResID = idd_mydialog
dlg_mydialog_DlgType = wd_Modal
dlg_mydialog_Help = idh_contents
%END myDialog, CreateParms

predicates

dlg_mydialog_eh : EHANDLER
dlg_mydialog_handle_answer(INTEGER EndButton,DIALOG_VAL_LIST)
dlg_mydialog_update(DIALOG_VAL_LIST)

clauses

dlg_mydialog_Create(Parent):-
%MARK myDialog, new variables

dialog_CreateModal(Parent,dlg_mydialog_ResID,"",
[
%BEGIN myDialog, ControlList, 12:10:24-23.5.2001, Code automatically updated!
df(idc_x1,editint(void,[]),nopr),
df(idc_y1,editint(void,[]),nopr),

2001-‫ أحمد زين‬.‫م‬


Visual Prolog ‫مدخل إلى‬

df(idc_x2,editint(void,[]),nopr),
df(idc_y2,editint(void,[]),nopr)
%END myDialog, ControlList
],
dlg_mydialog_eh,0,VALLIST,ANSWER),
dlg_mydialog_handle_answer(ANSWER,VALLIST).

dlg_mydialog_handle_answer(idc_ok,VALLIST):-!,
dlg_mydialog_update(VALLIST).
dlg_mydialog_handle_answer(idc_cancel,_):-!. % Handle Esc and Cancel here
dlg_mydialog_handle_answer(_,_):-
errorexit().

dlg_mydialog_update(_VALLIST):-
%BEGIN myDialog, Update controls, 12:10:24-23.5.2001, Code automatically updated!
_IDC_X1_VALUE = dialog_VLGetint(idc_x1,_VALLIST),
_IDC_Y1_VALUE = dialog_VLGetint(idc_y1,_VALLIST),
_IDC_X2_VALUE = dialog_VLGetint(idc_x2,_VALLIST),
_IDC_Y2_VALUE = dialog_VLGetint(idc_y2,_VALLIST),
%END myDialog, Update controls
true.

%MARK myDialog, new events

dlg_mydialog_eh(_,_,_):-!,fail.

%END_DLG myDialog

2001-‫ أحمد زين‬.‫م‬


Visual Prolog ‫مدخل إلى‬

‫ تعديلت على الترميز‬8-2-8


:‫قم بتعديل الترميز ليصبح على النحو التالي‬
include "dialogexample.inc"
include "dialogexample.con"
include "hlptopic.con"

facts -ellipsParameter
p(integer,integer,integer,integer)

‫عندما يريد المستثمر إنشاء قطع ناقص جديد يتم‬


‫" تخزن الباراميترات‬p" ‫إضافة حقيقة جديدة‬
‫المحددة للقطع الناقص‬

domains
listInteger=integer*

predicates
/* to draw all the ellipse */
draw(WINDOW,listInteger,listInteger,listInteger,listInteger)

clauses
draw(_,[],[],[],[]).
draw(W,[X1|T1],[Y1|T2],[X2|T3],[Y2|T4]):-
draw_ellipse(W,rct(X1,Y1,X2,Y2)),draw(W,T1,T2,T3,T4).

‫"سيتم استخدامها لرسم كل‬draw" ‫هذه السنادية‬


.‫القطوع الناقصة التي أضافها المستثمر‬

%BEGIN_WIN newWindow
/**************************************************************************
Creation and event handling for window: newWindow
**************************************************************************/

constants
%BEGIN newWindow, CreateParms, 11:25:51-23.5.2001, Code automatically updated!
win_newwindow_WinType = w_TopLevel
win_newwindow_Flags=
[wsf_SizeBorder,wsf_TitleBar,wsf_Maximize,wsf_Minimize,wsf_Close,wsf_ClipSiblings,wsf_ClipCh
ildren]
win_newwindow_RCT = rct(100,80,440,240)
win_newwindow_Menu = res_menu(id_newmenubar)
win_newwindow_Title = "newWindow"
win_newwindow_Help = idh_contents
%END newWindow, CreateParms

predicates

win_newwindow_eh : EHANDLER

2001-‫ أحمد زين‬.‫م‬


Visual Prolog ‫مدخل إلى‬

clauses

2001-‫ أحمد زين‬.‫م‬


Visual Prolog ‫مدخل إلى‬

win_newwindow_Create(_Parent):-
win_Create(win_newwindow_WinType,win_newwindow_RCT,win_newwindow_Title,
win_newwindow_Menu,_Parent,win_newwindow_Flags,win_newwindow_eh,0).

%BEGIN newWindow, e_Create


win_newwindow_eh(_Win,e_Create(_),0):-!,
%BEGIN newWindow, InitControls, 11:25:51-23.5.2001, Code automatically updated!
%END newWindow, InitControls
%BEGIN newWindow, ToolbarCreate, 11:25:51-23.5.2001, Code automatically updated!
%END newWindow, ToolbarCreate
!.
%END newWindow, e_Create
%MARK newWindow, new events

%BEGIN newWindow, e_Update


win_newwindow_eh(_Win,e_Update(_UpdateRct),0):-!,
findall(X1,p(X1,_,_,_),L1),
findall(Y1,p(_,Y1,_,_),L2),
findall(X2,p(_,_,X2,_),L3),
findall(Y2,p(_,_,_,Y2),L4),
draw(_Win,L1,L2,L3,L4),

‫إيجاد كل القطوع الناقصة التي تم إضافتها من قبل المستثمر و من ثم‬


‫ عن‬e_Update ‫رسمها) قم بإضافة الترميز الفتراضي الخاص بالحادثة‬
‫طريق خبير النوافذ و صناديق الحوار و من ثم تعديل هذا الترميز كما هو‬
.(‫مبين هنا‬
!.
%END newWindow, e_Update

%BEGIN newWindow, idr_draw_close


win_newwindow_eh(_Win,e_Menu(idr_draw_close,_ShiftCtlAlt),0):-!,
win_Destroy(_Win),
retractall(p(_,_,_,_)),
!.
%END newWindow, idr_draw_close

%BEGIN newWindow, e_CloseRequest


win_newwindow_eh(_Win,e_CloseRequest,0):-!,
!.
%END newWindow, e_CloseRequest

2001-‫ أحمد زين‬.‫م‬


Visual Prolog ‫مدخل إلى‬

%BEGIN newWindow, idr_draw_ellipse


win_newwindow_eh(_Win,e_Menu(idr_draw_ellipse,_ShiftCtlAlt),0):-!,
dlg_mydialog_Create(_Win),

‫ من‬draw | ellipse ‫هذه القاعدة يتم تنفيذها عند اختيار عنصر القائمة‬
‫ التي‬dlg_mydialog_Create ‫قبل المستثمر عندها يتم طلب السنادية‬
‫تتولى عملية السماح للمستثمر بإدخال خواص القطع الناقص المضاف‬
‫ ومن ثم إضافة حقيقة جديدة‬mydialog ‫عن طريق إظهار صندوق الحوار‬
‫تعبر عن خواص القطع الناقص المراد إضافته‬
‫ بضرورة إعادة رسم النافذة عن طريق‬windows ‫بعد ذلك يتم اعلم‬
‫( فتنفذ القاعدة الخاصة بالحادثة‬win_Invalidate(_Win ‫السنادية‬
e_Update
win_Invalidate(_Win),
!.
%END newWindow, idr_draw_ellipse

%BEGIN newWindow, e_Size


win_newwindow_eh(_Win,e_Size(_Width,_Height),0):-!,

‫ بضرورة إعادة رسم‬windows ‫عند تغيير حجم النافذة نقوم بإعلم‬


‫ عن‬e_Size ‫النافذة ) قم بإضافة الترميز الفتراضي الخاص بالحادثة‬
‫طرق خبير النوافذ و صناديق الحوار و من ثم تعديل هذا الترميز كما هو‬
(‫مبين هنا‬
win_Invalidate(_Win),

IFDEF use_tbar
toolbar_Resize(_Win),
ENDDEF
!.
%END newWindow, e_Size

%BEGIN newWindow, e_Menu, Parent window


win_newwindow_eh(Win,e_Menu(ID,CAS),0):-!,
PARENT = win_GetParent(Win),
win_SendEvent(PARENT,e_Menu(ID,CAS)),
!.
%END newWindow, e_Menu, Parent window

%END_WIN newWindow

%BEGIN_DLG myDialog
/**************************************************************************
Creation and event handling for dialog: myDialog
**************************************************************************/

constants

%BEGIN myDialog, CreateParms, 12:10:24-23.5.2001, Code automatically updated!


dlg_mydialog_ResID = idd_mydialog
dlg_mydialog_DlgType = wd_Modal
dlg_mydialog_Help = idh_contents
%END myDialog, CreateParms

2001-‫ أحمد زين‬.‫م‬


Visual Prolog ‫مدخل إلى‬

predicates

2001-‫ أحمد زين‬.‫م‬


Visual Prolog ‫مدخل إلى‬

dlg_mydialog_eh : EHANDLER
dlg_mydialog_handle_answer(INTEGER EndButton,DIALOG_VAL_LIST)
dlg_mydialog_update(DIALOG_VAL_LIST)

clauses

dlg_mydialog_Create(Parent):-

%MARK myDialog, new variables

dialog_CreateModal(Parent,dlg_mydialog_ResID,"",
[
%BEGIN myDialog, ControlList, 12:10:24-23.5.2001, Code automatically updated!
df(idc_x1,editint(void,[]),nopr),
df(idc_y1,editint(void,[]),nopr),
df(idc_x2,editint(void,[]),nopr),
df(idc_y2,editint(void,[]),nopr)
%END myDialog, ControlList
],
dlg_mydialog_eh,0,VALLIST,ANSWER),
dlg_mydialog_handle_answer(ANSWER,VALLIST).

dlg_mydialog_handle_answer(idc_ok,VALLIST):-!,
dlg_mydialog_update(VALLIST).
dlg_mydialog_handle_answer(idc_cancel,_):-!. % Handle Esc and Cancel here
dlg_mydialog_handle_answer(_,_):-
errorexit().

dlg_mydialog_update(_VALLIST):-
%BEGIN myDialog, Update controls, 12:10:24-23.5.2001, Code automatically updated!
_IDC_X1_VALUE = dialog_VLGetint(idc_x1,_VALLIST),
_IDC_Y1_VALUE = dialog_VLGetint(idc_y1,_VALLIST),
_IDC_X2_VALUE = dialog_VLGetint(idc_x2,_VALLIST),
_IDC_Y2_VALUE = dialog_VLGetint(idc_y2,_VALLIST),
%END myDialog, Update controls
_IDC_X1_VALUE =i(X1),
_IDC_Y1_VALUE =i(Y1),
_IDC_X2_VALUE =i(X2),
_IDC_Y2_VALUE =i(Y2),

‫عندما يقوم المستثمر بإدخال قيم جديدة عن‬


‫ يتم اضافة حقيقة‬mydialog ‫طريق صندوق الحوار‬
.‫جديدة إلى قاعدة الحقائق تعبر عن ذلك‬
assert( p(X1,Y1,X2,Y2)),

true.
%MARK myDialog, new events

dlg_mydialog_eh(_,_,_):-!,fail.

%END_DLG myDialog

‫ تنفيذ البرنامج‬8-2-9

2001-‫ أحمد زين‬.‫م‬


‫مدخل إلى ‪Visual Prolog‬‬

‫يمكنك الن تنفيذ البرنامج ومن ثم طلب عنصر القائمة ‪ test | new window‬و من ثم‬
‫طلب رسم قطع ناقص جديد عن طريق عنصر القائمة ‪ draw‬حيث يظهر أمامك‬
‫صندوق حوار يمكنك بواسطته تحديد موقع القطع الناقص و أبعاده بالبيكسيل‪ ،‬و عند‬
‫الضغط على الزر ‪ ok‬تلحظ رسم قطع ناقص داخل النافذة الجديدة حسب ما تم‬
‫تحديده في صندوق الحوار‪.‬‬

‫‪ 8-2-10‬ملحظات حول الترميز‬


‫نلحظ أنه لرسم قطع ناقص استعملنا السنادية ‪((draw_ellipse(W,rct(X1,Y1,X2,Y2.‬‬
‫نشير هنا إلى أن ‪ Visual Prolog‬تقدم العديد من أدوات الرسم الخرى فيمكننا إظهار‬
‫نص في النافذة عن طريق السنادية ‪ draw text‬مثال‪:‬‬
‫)" ‪draw_Text(_Win, 100, 200, "This is a text‬‬
‫كما يمكننا رسم مضلع عن طريق السنادية ‪ draw_PolyGon‬كما في المثال التالي‪:‬‬
‫‪draw_PolyGon(_Win,[pnt(130,130),pnt(180,130),pnt(145,100),‬‬
‫)])‪pnt(150,150),pnt(170,110‬‬
‫ويمكننا رسم مستطيل عن طريق السنادية ‪ draw_Rect‬كما في المثال‪:‬‬
‫))‪draw_Rect(_Win, rct(100,200,300,400‬‬

‫كما أنه هنالك أدوات رسم أخرى تسمح بتغيير نمط خط الكتابة أو نمط خط الرسم أو‬
‫سماكته ‪.....‬‬
‫تلحظ أنه في الترميز السابق قمنا بإضافة قواعد تعالج الحوادث ‪ e_size‬و ‪ e_update‬و‬
‫تم ذلك باستخدام خبير النوافذ و صناديق الحوار حيث نقوم عن طريقه بتوليد الترميز‬
‫الفتراضي الموافق لهذه الحوادث و من ثم تعديل الترميز حسب ما هو مبين في‬
‫ة‪.‬‬
‫العلى‪ ،‬كما يمكنك القيام بذلك مباشر ً‬
‫نلحظ أيضا ً أننا استعملنا السنادية ‪ findall‬وذلك كما يلي‪:‬‬
‫)‪findall(X1,p(X1,_,_,_),L1‬‬
‫هذه السنادية تبحث عن كل الحقائق من الشكل ‪ (_,_,_,p(X1‬و تأخذ متحول الدخل‬
‫معه في القائمة ‪.L1‬‬‫الول ‪ X1‬من هذه الحقائق و ُتج ّ‬
‫ما رأيناه حتى الن هو مدخل سريع إلى ‪ Visual Prolog‬لمزيد من التفاصيل يمكنك‬
‫العودة للمراجع و المثلة و التعليمات المرافقة لـ ‪.Visual Prolog‬‬

‫‪ -9‬المراجع‬
‫‪1- Visual Prolog Version 5.0- Getting Started‬‬
‫‪2- Visual Prolog Version 5.0, Language Tutorial‬‬
‫‪3- Leon Sterling, Ehud Shapiro- The Art Of Prolog‬‬
‫المراجع العربية‪:‬‬
‫‪ -1‬البرمجة بلغة ‪ ،Prolog‬المهندس أحمد زين‪ ،‬نيسان ‪2000‬‬

‫م‪ .‬أحمد زين‪2001-‬‬

You might also like