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)→ تطبعatab(3)→ تطبع 3 مسافاتwrite(b)→ تطبعbnl→ تنزل لسطر جديد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.
خلاصة سريعة
حل امثلة المحاضرة والسكاشن من هنا : Chapter 7 - Practice