Professional Documents
Culture Documents
Null
Null
4-4-1ططططط12 .....................................................................................................
4-4-2طططططط ططططططط ط ططططط ططططططط ط طططططط12 ........
-9المراجع41...........................................
-1مقدمة:
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).
.2نفتح نافذة لكتابة البرنامج عن طريق القائمة file | newفنحصل على ما يلي:
.4لتنفيذ التساؤل:
append([1,2], [ 3,4, 5,6],Z).
نقوم باستدعاء القائمة Project | Test Goal
فنحصل على النافذة التالية:
2-4ةةةةة ةةةةةة
تعرفنا على المقاطع الساسية لبرنامج مكتوب بلغة ،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
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
تمرين:
القائمة التالية هي قائمة غير صحيحة في :Visual Prolog
][ ["foo", "zoo"], "doo" ,100,33
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
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).
PREDICATES
nondeterm del(name, namelist,namelist)
CLAUSES
del(_,[],[]).
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).
PREDICATES
)nondeterm suffix(namelist, namelist
CLAUSES
suffix(X,X).
suffix(X,[_|Z]):-suffix(X,Z).
GOAL
suffix([ali,samir], [ ali,zaid, samir,ahmad]).
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
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).
المطلوب كتابة إسناديات الضرب والمقارنة و الرفع إلى قوة و باقي العمليات
المعروفة على العداد الطبيعية مستخدما ً بالطبع نفس التمثيل.
إن العمليات الحسابية و عمليات المقارنة في Visual Prologتماثل تلك الموجودة في
لغات البرمجة الخرى كـ ،...++c, cوفي ما يلي عرضا ً لهذه العمليات.
4-1ةةةةةةةة ةةةةةةةة
التعبير الحسابي يتألف من عمليات و معاملت و أقواس ،مثال على ذلك :
4-2ةةةةةةةة ةةةةةةةة
في Visual Prologلدينا العمليات الحسابية الربع )الجمع ،الطرح ،الضرب التقسيم(
المعاملت يمكن أن تكون من أنماط صحيحة أو حقيقية و يختلف نمط النتيجة حسب
المعاملت و الجدول التالي يوضح ذلك:
الولوية العملية
1 +-
2 * / mod div
3 - + (unary
4-4ةةةةةةة ةةةةةةةة
4-4-1مقدمة
اللغة Visual Prologتسمح بمقارنة التعابير الحسابية و المحارف و سلسل المحارف و
الرموز ،لحظ التعبير التالي:
X <Y-12
هذا التعبير في Visual Prologمكافئ إلى أن قيمة Xأصغر من قيمة Yمطروحا ً منها
القيمة .12
الجدول التالي يعرض معاملت المقارنة الموجودة في Visual Prolog
العلقة الرمز
أصغر من >
أصغر أو يساوي >=
يساوي =
أكبر من <
أكبر أو يسوي <=
ل يساوي >< or
<>
يجب توخي الحذر عند استخدام السنادية = لمقارنة قيم حقيقية ،لنأخذ التعبير التالي
100 = 5 * 100/5
FACTS
factdeclaration-list
ENDCLASS
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
الوصف السنادية
للكتابة في ملف أو على الشاشة، 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").
أعط المشروع السم helloوحدد الدليل الذي سيتم فيه تخزين ملفات المشروع و
ليكن ' 'c:\helloفي المكان .Base Directory
اضغط على الخيار VPI Optionsفي صندوق الحوار السابق فيظهر صندوق •
الحوار التالي:
من خلل هذا الصندوق يمكنك تحديد خواص التطبيق الذي ستقوم ببنائه ،في هذا
المثال البسيط سنحافظ على الخيارات الفتراضية.
الن اضغط على الزر Createفتظهر النافذة التالية: •
هذه النافذة نسميها بنافذة المشروع فعن طريق هذه النافذة يمكننا استعراض
الملفات التي يتألف منها المشروع في حالتنا هذه الملفان hello.proو VPITools.pro
يمكننا رؤية محتويات الملف hello.proعن طريق الضغط على هذا الملف مرتين
متتاليتين.
ً
لقد حصلت الن على بنية عامة تساعدك على بناء تطبيقك الخاص بدل من بناء كل
شيء من الصفر فيكفي أن تقوم بإجراء التعديلت المناسبة لتحصل على التطبيق
الخاص بك ،الن قم بتنفيذ البرنامج عن طريق عنصر القائمة Project | Runفتحصل
على مايلي:
يمكنك استعراض القوائم و عناصر القوائم و لكنك تلحظ غياب الوظائف عن معظم
هذه العناصر.
الن قم بإنهاء تنفيذ البرنامج.
إضافة قائمة جديدة: •
سنرى الن كيفية إضافة عنصر قائمة جديد ،في نافذة المشروع قم بالضغط على
الزر menuكما يلي:
الن قم بالضغط مرتين متتاليتين على Task Menuفتظهر أمامك النافذة التالية:
عّلم العنصر & Editومن ثم اضغط على الزر Newفتظهر نافذة ستسمح لك بإدخال
اسم القائمة و الثابت المستخدم لتعريف القائمة هذا الثابت سيتم استخدامه في
البرنامج ،أعط القائمة السم testأما الثابت فيتم تحديده بشكل أوتوماتيكي ":"id_test
الن قم بالضغط على الزر okلتثبيت خيارك و من ثم اضغط على الزر submenuو
من ثم الزر newلنشاء عنصر قائمة ضمن القائمة testأعط العنصر السم say hello
أما الثابت فيتم اختياره بشكل تلقائي من قبل البرنامج "."id_test_say_hello
يمكنك الن أخذ فكرة أولية عن شكل شريط القوائم للبرنامج عن طريق الضغط على
الزر . test
الن سنقوم بإضافة تعليمات للبرنامج بحيث يتم إظهار صندوق حوار يحتوي •
الجملة Hello wordعند اختيار عنصر القائمة say helloو ذلك عن طريق خبير
النوافذ و صناديق الحوار ،للقيام بذلك اتبع الخطوات التالية:
من نافذة المشروع اضغط على الزر 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):-!,
!.
%END Task Window, id_test_say_hello
سنقوم بتعديل هذه القاعدة لظهار صندوق حوار يحوي الجملة Hello wordو ذلك على
النحو التالي:
اضغط بالزر اليميني للفأرة بعد إشارة القطع الولى ! و اختر عنصر القائمة | Insert
: Predicate Call | Window, Dialog or Toolbarفيظهر أمامك صندوق حوار قم بتحديد
القيم على النحو التالي:
قم ببناء تطبيق جديد عن طريق عنصر القائمة Project | New Projectو حافظ على
الباراميترات الفتراضية التي يعرضها خبير التطبيقات ،أعط التطبيق السم
.dialogExample
أنشئ قائمة جديدة في شريط القوائم السابق عن طريق الزر new •
أعط القائمة الجديدة السم drawومن ثم اضغط على الزر :ok •
أنشئ عنصر داخل القائمة drawعن طريق الضغط على الزر submenuو •
بنفس الطريقة أضف عنصر قائمة آخر و أعطه السم ، closeعنصر القائمة •
هذا سنستخدمه لغلق النافذة.
تلحظ الن أنه أصبح لديك شريطي مهام الول هو newMenuBarو الثاني هو task
menuكما في الشكل التالي:
حدد شريط القوائم newMenuBarكشريط قوائم للنافذة ثم اضغط على الزر .ok
قم بتوليد الترميز الفتراضي الخاص بهذه النافذة عن طرق الضغط على الزر •
windowو من ثم code expertفي نافذة المشروع و من ثم تحديد الوحدة التي سيتم
فيها توليد الترميز " "newModuleو من ثم الضغط على الزر .Default Code
أعط صندوق الحوار السم mydialogو من ثم اضغط على الزر okكما هو موضح في
الشكل ومم ثم سوف تلحظ ظهور النافذة التالية:
نلحظ أنه لدينا أربعة عناصر تحكم من النوع textو أربعة عناصر تحكم من النوع Edit
تم تعريفها من العلى إلى السفل بالثوابت .idc_x1, idc_y1, idc_x2, idc_y2
كما أنه لدينا زرين هما okو .cancel
صندوق الحوار هذا سوف يتم استخدامه لرسم القطع الناقص المحدد بالنقطتين )
(x1,y1), (x2,y2
توليد الترميز الخاص بصندوق الحوار هذا •
اضغط بالزر اليميني للفأرة داخل الصندوق السابق و اختر العنصر code expertسوف
تلحظ ظهور الصندوق التالي:
task window بعد تحديد النافذةcode expert و من ثمwindow • اضغط على الزر
:في قائمة النوافذ
و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
عدل الترميز السابق وذلك بالضغط على الزر اليميني للفأرة بعد إشارة القطع الولى
ومن ثم اختيار عنصر القائمة : Insert | Predicate Call | Window, Dialog or Toolbar
فيظهر أمامك صندوق حوار ،قم بتحديد الخيارات في هذا الصندوق على النحو التالي:
و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_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).
!.
%END newWindow, idr_draw_close
%END_WIN newWindow
%BEGIN_DLG myDialog
/**************************************************************************
Creation and event handling for dialog: myDialog
**************************************************************************/
constants
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),
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.
dlg_mydialog_eh(_,_,_):-!,fail.
%END_DLG myDialog
facts -ellipsParameter
p(integer,integer,integer,integer)
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).
%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).
منdraw | ellipse هذه القاعدة يتم تنفيذها عند اختيار عنصر القائمة
التيdlg_mydialog_Create قبل المستثمر عندها يتم طلب السنادية
تتولى عملية السماح للمستثمر بإدخال خواص القطع الناقص المضاف
ومن ثم إضافة حقيقة جديدةmydialog عن طريق إظهار صندوق الحوار
تعبر عن خواص القطع الناقص المراد إضافته
بضرورة إعادة رسم النافذة عن طريقwindows بعد ذلك يتم اعلم
( فتنفذ القاعدة الخاصة بالحادثةwin_Invalidate(_Win السنادية
e_Update
win_Invalidate(_Win),
!.
%END newWindow, idr_draw_ellipse
IFDEF use_tbar
toolbar_Resize(_Win),
ENDDEF
!.
%END newWindow, e_Size
%END_WIN newWindow
%BEGIN_DLG myDialog
/**************************************************************************
Creation and event handling for dialog: myDialog
**************************************************************************/
constants
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):-
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),
true.
%MARK myDialog, new events
dlg_mydialog_eh(_,_,_):-!,fail.
%END_DLG myDialog
تنفيذ البرنامج8-2-9
يمكنك الن تنفيذ البرنامج ومن ثم طلب عنصر القائمة test | new windowو من ثم
طلب رسم قطع ناقص جديد عن طريق عنصر القائمة drawحيث يظهر أمامك
صندوق حوار يمكنك بواسطته تحديد موقع القطع الناقص و أبعاده بالبيكسيل ،و عند
الضغط على الزر okتلحظ رسم قطع ناقص داخل النافذة الجديدة حسب ما تم
تحديده في صندوق الحوار.
كما أنه هنالك أدوات رسم أخرى تسمح بتغيير نمط خط الكتابة أو نمط خط الرسم أو
سماكته .....
تلحظ أنه في الترميز السابق قمنا بإضافة قواعد تعالج الحوادث 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