Lists and Arithmetic (Lecture 5 - Part 1)

مقدمة
  • في المحاضرة دي هنتعلم إزاي نتعامل مع العمليات الحسابية (Arithmetic Operations) في الـ Prolog.
  • هنفهم الفرق بين علامة = (الـ Unification) وبين معامل الحساب is وعلامات المقارنة.
  • هنتدرب على كتابة الـ Functions الحسابية وكمان العلاقات اللي بتحتاج تفكير رياضي زي حساب الكثافة السكانية، أو الـ Factorial والـ GCD (القاسم المشترك الأكبر).
  • هنشوف إزاي نمثل البوابات المنطقية (Logic Gates) في الـ Prolog ونبني بيها دايرة بسيطة زي الـ Half Adder.

1. العمليات الحسابية (Arithmetic Operators)

الـ Prolog بيدعم العمليات الحسابية الأساسية وكلها مبنية جاهزة (Built-in)، وهي:

المعامل (Operator) العملية
+ جمع (Addition)
- طرح (Subtraction)
* ضرب (Multiplication)
/ قسمة عادية (Real Division)
// قسمة صحيحة (Integer Division - بتطير الباقي)
mod باقي القسمة (Modulus)
** أو ^ الأسس (Power)
  • أولويات التنفيذ (Precedence): زي الرياضة العادية، الضرب والقسمة قبل الجمع والطرح. العمليات اللي من نفس المستوى بتتنفذ من الشمال لليمين. الأقواس () بتجبر الـ Prolog يخلص اللي جواها الأول.
  • الدوال الجاهزة: الـ Prolog كمان فيه دوال رياضية زي sin(X), cos(X), log(X), exp(X).

2. معامل الـ Evaluation (المعامل is)

الفرق بين "=" و is
  • في الـ Prolog، علامة = بتعمل Matching (Unification) مش بتحسب.
    • يعني لو كتبت X = 1 + 2، الـ X مش هتبقى 3< الـ X هتاخد القيمة كـ Structure اللي هو 1 + 2.
  • عشان تجبر الـ Prolog إنه يحسب العملية الرياضية، لازم تستخدم المعامل is.
    • لو كتبت X is 1 + 2، ساعتها بس الـ X هتتخزن فيها 3.
  • أمثلة:
?- X is 5/2, Y is 5//2, Z is 5 mod 2.

% النتيجة:
% X = 2.5
% Y = 2
% Z = 1

3. معاملات المقارنة (Comparison Operators)

  • لما بنحب نقارن قيمتين رياضيتين ببعض بنستخدم المعاملات دي (كلهم بيجبروا الـ Prolog إنه يحسب Values قبل ما يقارن):
المعامل الوصف
> أكبر من
< أصغر من
>= أكبر من أو يساوي
=< أصغر من أو يساوي (مهم: ركز في ترتيبها "=<" مش "<=)"
=:= القيمتين متساويتين حسابياً
=/= القيمتين مش متساويتين حسابياً
ركز هنا

الـ =:= بتقارن ناتج العملية الحسابية، لكن الـ = بتطابق الـ Data Objects (Terms).

  • 1 + 2 =:= 2 + 1 -> Yes (عشان 3 بتساوي 3).
  • 1 + 2 = 2 + 1 -> No (عشان كـ Structures مختلفين).

4. أمثلة تطبيقية (Practical Examples)

أ) حساب الكثافة السكانية (Population Density)

  • لو عندنا الـ Population والـ Area، نقدر نحسب الكثافة (الـ pop علي الـ area):
pop(usa, 203).
pop(india, 500).
area(usa, 3).
area(india, 1).

density(X, Y) :- pop(X, P), area(X, A), Y is P / A.

ب) التكرار مع الحسابات: الـ Factorial والـ GCD

  • المضروب (Factorial - N!):
    • بنقسمه لقاعدتين (واحدة للـ Base Case وواحدة للـ Recursion):
% Base case: مضروب 1 هو 1
fac(1, 1).

% Recursive Step
fac(N, F) :- 
    N > 1, 
    M is N - 1,       % نجيب الرقم اللي قبله
    fac(M, Fm),       % نجيب مضروب الرقم اللي قبله
    F is N * Fm.      % نضرب الرقم الحالي في المضروب اللي رجع
لو مش فاهمها احفظ شكلها

5. الدوائر المنطقية في الـ Prolog (Logical Circuits)

  • ممكن نمثل الـ Logic Gates ببساطة جداً عن طريق الـ Facts:
% البوابات الأساسية

not(0, 1).
not(1, 0).

and(0, 0, 0).
and(0, 1, 0).
and(1, 0, 0).
and(1, 1, 1).

xor(0, 0, 0).
xor(0, 1, 1).
xor(1, 0, 1).
xor(1, 1, 0).

بناء دائرة Half Adder

  • الـ Half Adder بيجمع 2 Bits، وبيطلع لنا (Sum) و (Carry).

  • Carry = A AND B

  • Sum = A XOR B

  • نقدر نربط البوابات دي بـ Rule في الـ Prolog:

halfadder(A, B, Carry, Sum) :- 
    and(A, B, Carry), 
    xor(A, B, Sum).

A

B

AND

Carry

XOR

Sum

  • تجربة السؤال:
?- halfadder(0, 1, C, S).
% النتيجة:
% C = 0
% S = 1

قبل ما تدخل علي المحاضره الي بعدها حل امثلة المحاضرة والسكاشن من هنا : Chapter 5 (Part 1) - Practice

Nour Eldeen Mahmoud