Archive for the ‘Tutorials’ Category

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


سنقوم بعمل برنامج لحل اللعبة بإستخدام لغة برولوج وعلى نموذج مصغر 4×4 ولكن بنفس القواعد. والأرقام المقبولة هي 1,2,3,4

?- solve(1,4, _, _, _, _, 4, _, 2, _, _,_, _, _, _, 3).
1 4 3 2
3 2 4 1
2 3 1 4
4 1 2 3

كيف نقوم بحل ذلك السؤال؟
انظر على حلول لغات مثل سي هنا
http://rosettacode.org/wiki/Sudoku
يوجد اتجاه او اسلوب برمجي اخر يسمى ال declarative programming … كل ماعلينا هو أن نقوم بوصف الحل لا الخطوات للحل..

طريق سريع لبرولوج

1-التنصيب
http://www.swi-prolog.org/Download.html

مستخدمي لينكس موجود لديكم في مدير الحزم

striky@localhost ~/m/prolog> touch hello.pl master
striky@localhost ~/m/prolog> swipl master?
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 6.6.6)
Copyright (c) 1990-2013 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.

For help, use ?- help(Topic). or ?- apropos(Word).

?- write('Hello, World!').
Hello, World!
true.
?- write('Hello,'), nl, write('world').
Hello,
world
true.
?- X is 3*4 + 2.
X = 14.

لاحظ أي امر في برولوج ينتهي بال نقطة .
write يستخدم لطباعة نص
nl
تستخدم لطباعة سطر جديد
البرنامج في برولوج عبارة عن قاعدة معرفة knowledge base وفيه يتم ادراج الحقائق facts وقواعد الأستنباط rules

friend(john, julia).
friend(john, jack).
friend(julia, sam).
friend(julia, molly).

loves(john, julia).
loves(julia, sam).
loves(sam, julia).

male(brad).
male(john).
male(jim).
male(alfred).
female(marry).
child(brad, alfred).
child(john, jim).
child(john, marry).

هذا ملف KB يشمل مجموعة من الحقائق … برولوج ستساعدنا كثيرا لإجابة الكثير من الاسئلة .. لنرى!

?- [hello].
% hello compiled 0.00 sec, 3 clauses
true.

?- listing(friend).
friend(john, julia).
friend(john, jack).
friend(julia, sam).
friend(julia, molly).

true.

?- listing(loves).
loves(john, julia).
loves(julia, sam).
loves(sam, julia).

true.

?- listing(parent).
ERROR: toplevel: procedure `parent' does not exist (DWIM could not correct goal)

نستطيع استخدام listing لعرض الحقائق

?- friend(john, julia).
true .

?- friend(john, jack).
true.

?- loves(john, julia).
true.

?- loves(john, sam).
false.

استعلامات بسيطة على الحقائق التي لدينا

?- friend(john, Who).
Who = julia ;
Who = jack.

هذا الاستعلام يعني … ماهي قيمة المتغير Who التي تجعل العلاقة friend(john, Who) صحيحة؟
نجد في ال KB قيم مثل julia وتقوم برولوج بإخبارنا بذلك .. ولكن يوجد قيم اخرى نستطيع الوصول اليها بالضغط على ;
*لاحظ ان المتغيرات تبدأ بحرف capital

الواد john دا ابن مين

?- listing(child).
child(brad, alfred).
child(john, jim).
child(john, marry).

true.

?- child(john, X).
X = jim ;
X = marry.

الأستنباط

يوجد الكثير من الأسئلة والأجابات
مثلا هل العلاقات

friend(julia, john)

صحيحة؟
هل john is friendzoned؟
😀
هل فلان ابو فلان؟
لنقوم بإضافة بعض القواعد

rule :- stmt1, stmt2,...

تنطق ال rule محققة اذا كان ( :- ) stmt1, stmt2 محققين

parent(X, Y) :- child(Y,X).

فلان X هو أبو Y في حال اذا كان Y هو ابن ل X

father(X, Y) :- child(Y,X), male(X).

فلان X هو اب ل Y في حال اذا كان Y هو ابن X وX هو male

mother(X, Y) :- child(Y,X), female(X).

فلان X هي ام ل Y في حال اذا كان Y هو ابن ل X و X تكون female

friend(X, Y) :- friend(Y,X).

فلان X صديق Y .. اذا كان في ال kB معروف ان Y صديق X

friendzoned(X) :- loves(X, Y), \+ loves(Y,X).

فلان X في ال friendzone اذا كان X بيحب Y وفي نفس الوقت Y لاتحب X

?- friend(julia, john).
true .
?- male(jim).
true.

?- parent(jim,X).
X = john.

?- father(jim, X).
X = john.

?- mother(X, john).
X = marry.

?- mother(marry,X).
X = john.

?- mother(marry, john).
true.

قصة قصيرة حزينة…

جون بيحب جوليا، ولكن جوليا وسام بيحبوا بعض

?- loves(julia, X).
X = sam.

?- friendzoned(julia).
false.

?- friendzoned(john).
true.

الكود

اولا نقوم بتعريف ال domain .. وهو القيم المقبولة للمتغيرات

num(1). num(2).
num(3). num(4).

التأكد من أن القيم فريدة بين 4 متغيرات

%create unique values of A,B,C,D based.
uniq(A,B,C,D) :-
num(A), num(B), num(C), num(D), \+ A=B, \+ A=C, \+ A=D, \+ B=C, \+ B=D, \+ C=D.

هنا نقول ان A لايساوي B ولايساوي C ولايساوي D وكذلك B لايساوي C ولا يساوي D وكذلك C لايساوي D وكل منهم عبارة عن رقم قد يكون 1 او 2 او 3 او 4

الحصول على الحل

%find solution to sudoku 4x4 based on constraints.
solution(C11, C12, C13, C14,
C21, C22, C23, C24,
C31, C32, C33, C34,
C41, C42, C43, C44) :-
%rows (every row is uniq).
uniq(C11, C12, C13, C14), uniq(C21, C22, C23, C24), uniq(C31, C32, C33, C34), uniq(C41, C42, C43, C44),
%columns (every column is uniq).
uniq(C11, C21, C31, C41), uniq(C12, C22, C32, C42), uniq(C13, C23, C33, C43), uniq(C14, C24, C34, C44),
%blocks (every block (2x2) cells is uniq).
uniq(C11, C12, C21, C22), uniq(C31, C32, C41, C42), uniq(C13, C14, C23, C24), uniq(C33, C34, C43, C44).

لاتنزعج!
اولا الboard او لوحة السودكو عبارة عن 16 خانة .. 4 صفوف و 4 أعمدة
قم بتسميتهم من C11 الى C44
C21 تعني الخلية في الصف الثاني والعمود الأول

الآن لنصف الحل ..

الحل يعتمد على
1-تفرد القيم في كل صف ..

uniq(C11, C12, C13, C14)

هنا نقول ان القيم C11, C12, C13,C14 المكونة للصف الأول يجب ان يتم اسناد قيمة مختلفة لها من 1 ل 4 وهذا ماوضحناه في uniq
وبالمثل مع الخلايا المكونة لباقي الصفوف الثاني والثالث والرابع

2- تفرد الفيم في كل عمود ..

uniq(C11, C21, C31, C41)

وبالمثل مع الخلايا المكونة لباقي الأعمدة
3- تفرد القيم في كل مربع
لدينا ٤ مربعات (C11, C12, C21, C22) (C31, C32, C41, C42)(C13, C14, C23, C24)(C33, C34, C43, C44)

يجب ان تكون الأرقام مختلفة داخل المربع

uniq(C11, C12, C21, C22)

لقد أنتهينا!
الآن برولوج ستقوم بالبحث عن القيم اللتي تتفق مع وصفنا لتلك المشكلة

الآن لنقوم بعرض القيم

solve(C11, C12, C13, C14,
C21, C22, C23, C24,
C31, C32, C33, C34,
C41, C42, C43, C44) :-

solution(C11, C12, C13, C14,
C21, C22, C23, C24,
C31, C32, C33, C34,
C41, C42, C43, C44),
showrow(C11, C12, C13, C14), showrow(C21, C22, C23, C24), showrow(C31, C32, C33, C34), showrow(C41, C42, C43, C44),nl.

كان من الممكن دمجهم في الكود السابق
فقط نقوم بطباع كل 4 خلايا المكونين لصف عن طريق showrow المعرف كالتالي

showspace :- write(' ').
%row representation.
showrow(A, B, C, D) :-
showspace, write(A), showspace, write(B), showspace, write(C), showspace, write(D), nl.

*لاحظ showspace تقوم بطباعة مسافة فارغة فقط لاأكثر

الكود كامل

%based on thinking as computation example

%domain
num(1). num(2).
num(3). num(4).
showspace :- write(' ').
%row representation.
showrow(A, B, C, D) :-
showspace, write(A), showspace, write(B), showspace, write(C), showspace, write(D), nl.

%create unique values of A,B,C,D based.
uniq(A,B,C,D) :-
num(A), num(B), num(C), num(D), \+ A=B, \+ A=C, \+ A=D, \+ B=C, \+ B=D, \+ C=D.

%find solution to sudoku 4x4 based on constraints.
solution(C11, C12, C13, C14,
C21, C22, C23, C24,
C31, C32, C33, C34,
C41, C42, C43, C44) :-
%rows (every row is uniq).
uniq(C11, C12, C13, C14), uniq(C21, C22, C23, C24), uniq(C31, C32, C33, C34), uniq(C41, C42, C43, C44),
%columns (every column is uniq).
uniq(C11, C21, C31, C41), uniq(C12, C22, C32, C42), uniq(C13, C23, C33, C43), uniq(C14, C24, C34, C44),
%blocks (every block (2x2) cells is uniq).
uniq(C11, C12, C21, C22), uniq(C31, C32, C41, C42), uniq(C13, C14, C23, C24), uniq(C33, C34, C43, C44).
solve(C11, C12, C13, C14,
C21, C22, C23, C24,
C31, C32, C33, C34,
C41, C42, C43, C44) :-

solution(C11, C12, C13, C14,
C21, C22, C23, C24,
C31, C32, C33, C34,
C41, C42, C43, C44),
showrow(C11, C12, C13, C14), showrow(C21, C22, C23, C24), showrow(C31, C32, C33, C34), showrow(C41, C42, C43, C44),nl.

https://github.com/xmonader/prolog-rands/blob/master/sudoku.pl

الحمد لله بعد نجاح الإصدار الأول قررت ان يكون فى إصدار تانى مع تحسينات للتصفح اونلين

فى الإصدار التانى هيتم اضافة برمجة الواجهات الرسومية وتم انهاء ال 3 اجزاء Gnome, Qt, wx
وإضافة دراسة rSQLiteGUI (معتمدة على ال gtk وال active records كتطبيق)

ازاى اقدر اساعد؟
لسه فى مكان لأساسيات threading, networking وكتابة ال extensions وبعض الإضافات على rails
اذا تقدر تنهى التنسيق ومراجعة اللغة ياريت تراسلنى

GQamoos: RAD with Glade

Posted: ديسمبر 3, 2008 in Tutorials
الوسوم:, , , , ,

كتبت مستند لشرح كيفية استخدام Glade مع PyGTK لإنشاء تطبيق قاموس بإستخدام wordlist من عرب ايز وال looker service

لتحميل المستند

لتحميل التطبيق



PyGTK Tutorial!

Posted: ديسمبر 2, 2008 in PF, Tutorials
الوسوم:, , , , ,

30 صفحة يتم التعرض فيها لأساسيات البرمجة الرسومية مع pygtk مثل ال signals والcallbacks واستخدام ال الصناديق والجداول وبعض الويدجتس الأساسية وكيف الإستفادة من gladizer و glade

اى مساهمات ؟

لسه ال textview, treeview والتطبيق الشهير محرر النصوص!

مكتملين فى Ruby-Gnome لو حد حب يعدل الأمثلة

للتحميل

Gladizer

Posted: نوفمبر 28, 2008 in PF, Tutorials
الوسوم:, , , , , ,

الحمد لله خلصت الميدتيرم امبارح وفضيت شوية فكتبت Gladizer من ضمن الشغل اللى بنعمله انا والحج احمد مصطفى

Gladizer هو سكربت وسيط بين ملف .glade اللى بيشمل وصف للواجهة ك XML ولغة البرمجة (حاليا بايثون وروبى) بيقوم بربط الواجهة فى .glade بالكلاس

للتطبيق

1- انشئ ملف بإستخدام glade وصمم واجهتك وحدد ال callbacks وال id للويدجتس واحفظه وليكن ب tst.glade

2- من الترمنال قم بتنفيذ

striky@striky-desktop:~/workspace/gladizer/src$ gladizer.py –file tst.glade –plugin python > tst.py

striky@striky-desktop:~/workspace/gladizer/src$ gladizer.py -f tst.glade -p ruby > tst.rb

البرنامج بياخد

–file | -f → وهى الملف المخزن فيه وصف الواجهة

–plugin | -p → اللغة المطلوب التحويل ليها

المدعم منها حاليا هو python, ruby

بعدها

python tst.py

او

ruby tst.py

برامج مشابهه

Gladex

glade2py

ruby-glade-create-template

للتحميل اضغط هنا

rSQLiteGUI Case Study

Posted: نوفمبر 9, 2008 in Tutorials
الوسوم:, , , , ,

دراسة تحليلية لبرنامج rSQLiteGUI كتطبيق على قواعد البيانات و الواجهات الرسومية بإستخدام RubyGnome

للتحميل اضغط هنا

المتطلبات: قراءة مقدمة فى روبى وجزئية RubyGnome

Ruby/Qt

Posted: أكتوبر 17, 2008 in Tutorials
الوسوم:, ,

كالعادة الملف قبل التعديل لجزئية تصميم الواجهات من خلال Qt مع Ruby

ياريت اى تعديلات او تصحيحات نتبلغ بيها قبل مايبدأ التجهيز لضمه

طبعا معظم الشرح متجهز للأمثلة.. لو حد عنده وقت ويحب يضيف ال XML, networking, Qt Designer,.. etc ياريت يشاركنا بيهم

للتحميل اضغط هنا

ودى بورت للتوتريل الشهيرة لل Qt

http://www.darshancomputing.com/qt4-qtruby-tutorial/