Input and Output (Chapter 7)

مقدمة
  • دي اخر محاضرة معانا في المنهج واسهل واحده ,هناخد فيها إزاي نعمل read , write في الـ Prolog.

1. الـ Output باستخدام write

  • الـ write هي Predicate جاهز في الـ Prolog بيطبع أي Term على الشاشة.
?- write(c), write(8), write(r).
c8r
?- write([a, b, c, d]).
[a,b,c,d]

شرط أساسي: النصوص (Strings)

  • زي بقيت لغات البرمجع لو عايز تطبع نص (String)، لازم تحطه بين Single Quotes ('...').
?- write(Hello World).
ERROR: syntax error   %
 
?- write('Hello World').
Hello World         

2. التنسيق (Formatting Output)

  • الـ Prolog فيه دوال جاهزة لتنسيق المخرجات:
    • ا nl : تطبع سطر جديد (New line)
    • ا tab(N) : تطبع عدد N من المسافات (White spaces)

مثال:

?- write(a), tab(3), write(b), nl, tab(1), write(c).

% النتيجة على الشاشة:
% a   b
%  c
شرح الـ Output
  • write(a) → تطبع a
  • tab(3) → تطبع 3 مسافات
  • write(b) → تطبع b
  • nl → تنزل لسطر جديد
  • tab(1) → تطبع مسافة واحدة
  • write(c) → تطبع c

3. قراءة البيانات (Input) باستخدام read

  • الـ read بيقرا الـ Term من المستخدم. بيستنى المستخدم يكتب حاجة وينهيها بـ Full-stop (.)
?- write('What is your name?'), nl, read(X), write('Greetings '), write(X).
What is your name?
|: tamer.
Greetings tamer
X = tamer.
لازم بعد ما تكتب الـ input تحط نقطه ' . ' في الاخر عشان البرنامج يعرف انك خلصت

4. برنامج: مكعب العدد (Cube)

أ) نسخة بسيطة:

  • دالة بتاخد رقم وتطبع الـ Cube بتاعه:
cube :-
    write('enter number'),
    nl,
    read(N),
    C is N * N * N,
    write(C).
?- cube.
enter number
|: 2.
8
true.

ب) نسخة متكررة (Loop) باستخدام Cut:

د- الة بتقرا أرقام لغاية ما المستخدم يقول stop:

cube :-
    write('Next item, please: '),
    read(X),
    process(X).

process(stop) :- !.           % لو المستخدم كتب stop بتوقف

process(N) :-
    C is N * N * N,
    write('Cube of '), write(N), write(' is '), write(C),
    nl,
    cube.                      % ارجع تاني واقرا رقم جديد
?- cube.
Next item, please: 2.
Cube of 2 is 8
Next item, please: 3.
Cube of 3 is 27
Next item, please: stop.
true.
الفكرة

الـ Recursion هي اللي بتخلّي البرنامج يفضل شغال، والـ process(stop) :- !. هي اللي بتوقف التكرار لما المستخدم يدخل stop.


5. برنامج: دالة function (X ≤ 3 → 2X, X > 3 → 4X+5)

نفس الدالة بتاعة الشابتر الي فات لما كنا بنستخدم الـ Cut لكن دلوقتي بتقرا X من المستخدم بدل ما نبعتها كـ Argument.

بدون Cut:

function :-
    read(X),
    process(X).

process(X) :- X =< 3, Y is 2 * X, write(Y).
process(X) :- X > 3, Y is 4 * X + 5, write(Y).

باستخدام Cut:

function :-
    read(X),
    process(X).

process(X) :- X =< 3, !, Y is 2 * X, write(Y).
process(X) :- Y is 4 * X + 5, write(Y).
?- function.
|: 2.
4
true.

?- function.
|: 5.
25
true.

6. برنامج: الجذر التربيعي (Square Root) مع Validation

  • هنا بنعمل Validation عشان نتاكد ان X مش سالب،لو سالب هنديله ايرور. لو موجب، هنحسب الجذر التربيعي.

أ) كـ Predicate عادي (رقم ثابت من غير read):

sr(X, Y) :- X < 0, !, write('x is negative').
sr(X, Y) :- Y is X ^ 0.5.

ب) كـ Predicate تفاعلي (بتقرا X من المستخدم):

sqr :-
    write('enter number: '),
    read(X),
    process(X).

process(X) :- X < 0, !, write('number is negative').
process(X) :- Y is X ^ 0.5, write(Y).
?- sqr.
enter number: 9.
3
true.

?- sqr.
enter number: -4.
number is negative
true.

خلاصة سريعة

برنامج Prolog

طباعة: write

تنسيق: nl, tab(N)

قراءة: read

write('Hello'), write(X)

nl = سطر جديد, tab(5) = 5 مسافات

read(X) -> لازم Full-stop (.)


حل امثلة المحاضرة والسكاشن من هنا : Chapter 7 - Practice

Nour Eldeen Mahmoud