You are on page 1of 103

‫اﻻﺻﻄﻨﺎ� واﻷﻧﻈﻤﺔ‬

‫ي‬ ‫اﻟﺬكﺎء‬
‫اﻟﺨﺒ�ة ) ‪(1484‬‬
‫ي‬
‫ف‬
‫اﻟ�ﻣﺠﺔ ي�‬
‫اﻟﻮﺣﺪة اﻟﺨﺎﻣﺴﺔ‪ :‬ب‬
‫اﻟ�وﻟ�ج‬
‫ﻟﻐﺔ ب‬
‫‪Prolog‬‬ ‫اﻋﺪاد‪ :‬أ‪.‬د‪ .‬ﻳﻮﺳﻒ اﺑﻮزر‬
‫ﺟﺎﻣﻌﺔ اﻟﻘﺪس اﻟﻤﻔﺘﻮﺣﺔ‬
‫ف‬
‫اﻟﺼ��) ‪(1193‬‬ ‫ا�‬
‫‪2020‬‬ ‫ي‬ ‫اﻟﻔﺼﻞ اﻟﺪر ي‬
Link to prolog
• Download:
https://www.swi-prolog.org/download/stable/bin/swipl-8.2.1-1.x64.exe.envelope

• Online SWI Prolog


https://swish.swi-prolog.org/example/io.pl
‫اﻟﻣﻛوﻧﺎت اﻟرﺋﯾﺳﺔ‬
Constants Variables Each term is either a
X _A_variable constant, a variable, or a
Numbers: compound term.

1 -2 3.14 Compound terms person(socrates).


Atoms: likes(pooh_bear,honey) milestone(swiprolog,1987).
plus(4,mult(3,plus(1,9))) html(head(title(blah)),body(...))
tigger
'100 Acre Wood' Facts if

elephant(george).
Predicates Clauses elephant(forge).
elephant(X) :- grey(X), mammal(X), hasTrunk(X).
Rule and
then 3
Prolog - An Example
‫ﯾﺗﻛون اﻟﺑرﻧﺎﻣﺞ ﻣن ﺣﻘﺎﺋﻖ واﺳﺗﻔﺳﺎرات‬
mortal(X) :- person(X).
These are facts ‫اﻟﺤﻘﺎﺋﻖ‬
person(saleh). (a particular type of clause)

?- mortal(saleh).
These are queries ‫اﻻﺳﺘﻔﺴﺎرات‬
yes (and replies to the queries)
?- mortal(X).
X = saleh.
4
‫اﻟﻌﻣﻠﻲ ‪GNU-Prolog‬‬
‫• ﻧﺷﻐل اﻟﺑرﻧﺎﻣﺞ ‪gprolog‬‬
‫• ﺗظﮭر ﻟﻧﺎ اﻟﺷﺎﺷﺔ اﻟﺗﺎﻟﯾﺔ‬

‫• ﯾﻣﻛن اﻟﻌﻣل ﻛﺣﺎﻟﺗﯾن‬


‫– ﺗﻔﺎﻋﻠﻲ ﻧدﺧل ﻣﺛﻼ ‪X = 5 .‬‬
‫– ﻛﺗﺎﺑﺔ ﺑرﻧﺎﻣﺞ ﻧﻛﺗب ﺑرﻧﺎﻣﺞ ﯾﺣﺗوي ﻋﻠﻰ اﻟﺣﻘﺎﺋﻖ واﻟﻘواﻋد او ﻓﺗﺢ ﻣﻠف‬
‫‪6 + 2 = 8.‬‬ ‫• اﻣﺛﻠﺔ ﻋﻠﻰ اﻟﺗﻔﺎﻋﻠﻲ‪:‬‬
‫‪X is 6+2.‬‬

‫‪5‬‬
‫اﻟﻌﻣﻠﻲ‬
‫ﻛﺗﺎﺑﺔ اﻟﺑرﻧﺎﻣﺞ‬ ‫•‬
‫ﻧﺳﺗﺧدم ﻣﺣرر اﻟﻧﺻوص ﻣﺛﻼ ‪Notepad‬‬ ‫•‬
‫ﻧﻛﺗب اﻟﺑرﻧﺎﻣﺞ‬ ‫•‬
‫ﻣن ﻣﻔﺳر ﺑروﻟوج ﻧﺧﺗﺎر ‪ File‬ﺛم ‪ Change Dir‬ﻧﺣدد اﻟدﻟﯾل اﻟﻣوﺟود ﺑﮫ‬ ‫•‬
‫اﻟﺑرﻧﺎﻣﺞ‬
‫ﻧﻧﻔذ اﻟﺑرﻧﺎﻣﺞ ﺑوﺿﻊ اﺳم اﻟﺑرﻧﺎﻣﺞ ﺑﯾن اﻗواس ﻣرﺑﻌﺔ ‪ ، [FILE].‬ﺛم ﻧﺿﻐط ﻋﻠﻰ‬ ‫•‬
‫ﻣﻔﺗﺎح اﻻدﺧﺎل‪.‬‬
‫‪• ?- [filename].‬‬
‫‪• ?- [family].‬‬
‫‪6‬‬
‫اﻟﻌﻣﻠﻲ‬
‫• ﻧﻧﻔذ اﻟﺑرﻧﺎﻣﺞ ‪ family.pl‬ﺑوﺿﻊ اﺳم اﻟﺑرﻧﺎﻣﺞ ﺑﯾن اﻗواس ﻣرﺑﻌﺔ‪ ،‬ﺛم ﻧﺿﻐط ﻋﻠﻰ‬
‫ﻣﻔﺗﺎح اﻻدﺧﺎل‪.‬‬
‫‪?- [family].‬‬

‫‪7‬‬
‫اﻟﻌﻣﻠﻲ‬
male(ali). ‫اﻻﺳﺗﻔﺳﺎرات‬
male(veli).
female(zeynep). | ?- male(ali).
parent(ali,ayse).
parent(ali,ahmet). yes
parent(zeynep,ayse).
father(X,Y):-parent(X,Y), male(X). | ?-
father2(X,Y):-male(X),parent(X,Y).
somebodysparent(X):-father(X,Y).
somebodysparent(X):-mother(X,Y).

?- male(X).
?- father(X,Y).
8
An Example
mortal(X) :- person(X). • ?- mortal(lina).
person(sami).
• yes
person(lina).

• One more test. Enter this query.


• ?- write('Hello World').
• Hello World
• yes

9
Online Prolog

https://swish.swi-prolog.org/

10
An
Example

mortal_report.

11
An Example
mortal(X) :- person(X).
person(yousef). ?- mortal_report.
person(saleh). Known mortals are:
person(lojien). yousef
person(ahmad). saleh
mortal_report:- lojien
write('Known mortals are:'),nl, ahmad
false
mortal(X),
write(X),nl,
fail.

12
‫‪6 > 6.‬‬
‫‪false‬‬
‫‪6 < 6.‬‬
‫اﻟﻌﻼﻗﺎت اﻟﻣﻧطﻘﯾﺔ داﺧل اﻟﺑروﻟوج‬
‫‪false‬‬
‫‪6 =:= 6.‬‬ ‫ﺗﻛون ﺻﺣﯾﺣﺔ إذا ﻛﺎﻧت ﻗﯾم ‪ X‬و‪ Y‬ھﻲ ﻧﻔس اﻟﻘﯾﻣﺔ‬ ‫‪X=:=Y‬‬ ‫•‬
‫‪true‬‬
‫‪6 =\= 6.‬‬ ‫ﺗﻛون ﺻﺣﯾﺣﺔ إذا ﻛﺎﻧت ﻗﯾم ‪ X‬و‪ Y‬ﻣﺧﺗﻠﻔﺔ‬ ‫‪X=\=Y‬‬ ‫•‬
‫‪false‬‬ ‫ﺗﻛون ﺻﺣﯾﺣﺔ إذا ﻛﺎﻧت ﻗﯾﻣﺔ ‪ X‬أﻗل ﻣن ﻗﯾﻣﺔ ‪Y‬‬ ‫‪X<Y‬‬ ‫•‬
‫‪6 =< 6.‬‬
‫‪true‬‬
‫ﺗﻛون ﺻﺣﯾﺣﺔ إذا ﻛﺎﻧت ﻗﯾﻣﺔ ‪ X‬أﻛﺑر ﻣن ﻗﯾﻣﺔ ‪Y‬‬ ‫‪X>Y‬‬ ‫•‬
‫‪6 >= 6.‬‬ ‫ﺗﻛون ﺻﺣﯾﺣﺔ إذا ﻛﺎﻧت ﻗﯾﻣﺔ ‪ X‬ﺗﻘل أو ﺗﺳﺎوي ﻗﯾﻣﺔ ‪Y‬‬ ‫‪X=<Y‬‬ ‫•‬
‫‪true‬‬
‫ﺗﻛون ﺻﺣﯾﺣﺔ إذا ﻛﺎﻧت ﻗﯾﻣﺔ ‪ X‬أﻛﺑر أو ﺗﺳﺎوي ﻗﯾﻣﺔ ‪Y‬‬ ‫‪X>=Y‬‬ ‫•‬

‫• ﻻﺣظ أن ‪ X‬و‪ Y‬ﻓﻲ اﻟﻌﻼﻗﺎت أﻋﻼه ﯾﺟب أن ﺗﻛون ﺗﻌﺎﺑﯾر رﯾﺎﺿﯾﺔ )‪ (expressions mathematical‬ﻛﻲ‬
‫ﯾﻛون ﻟﮭﺎ ﻗﯾم ﺗﻘﺎرن ﻣﻌﺎ ً‬
‫‪6+2 < 6+7.‬‬
‫‪true‬‬
‫‪13‬‬
‫اﻟﻌﻼﻗﺎت اﻟﻣﻧطﻘﯾﺔ داﺧل اﻟﺑروﻟوج‬
‫‪ X = = Y‬وﺗﻛون ﺻﺣﯾﺣﺔ إذا ﻛﺎﻧت ‪ X‬و ‪ Y‬ھﻣﺎ اﻟﺷﻲء ﻧﻔﺳﮫ‪ .‬ﻓﻣﺛﻼ‪:‬‬ ‫•‬
‫‪? 5==5.‬‬
‫‪true‬‬
‫‪? X == Y .‬‬
‫‪false‬‬
‫‪?1+5==1+5.‬‬
‫‪true‬‬
‫‪?5+1==1+5.‬‬
‫‪false‬‬

‫• ﻻﺣظ أن ﺑروﻟوج ﻻ ﺗﻌﺗﺑر ‪ 1+5 == 5+1‬وذﻟك ﻷﻧﮭﺎ ﻻ ﺗﻘوم ﺑﻣﻘﺎرﻧﺔ ﻗﯾم اﻟﺗﻌﺎﺑﯾر اﻟرﯾﺎﺿﯾﺔ‬
‫ﻋﻧد اﺳﺗﺧدام اﻟﻌﻼﻗﺔ اﻟﻣﻧطﻘﯾﺔ ==‪.‬‬
‫‪14‬‬
‫‪5 \== 6.‬‬
‫اﻟﻌﻼﻗﺎت اﻟﻣﻧطﻘﯾﺔ داﺧل اﻟﺑروﻟوج‬
‫‪true‬‬
‫‪5 \== 6.‬‬ ‫‪ X \== Y‬وﺗﻛون ﺻﺣﯾﺣﺔ إذا ﻟم ﺗﻛوﻧﺎ ‪ X‬و ‪ Y‬اﻟﻲء ﻧﻔﺳﮫ ‪.‬‬ ‫•‬
‫‪ X = Y‬ھذه اﻟﻌﻼﻗﺔ ﺳﺗﺣﺎول أن ﺗوﺣد )أو ﺗطﺎﺑﻖ( ‪ X‬و ‪ Y‬ﻣﻌﺎ ﺣﺳب ﺧوارزﻣﯾﺔ اﻟﺗوﺣﯾد اﻟﻣذﻛورة ﻓﻲ‬ ‫•‬
‫اﻟوﺣدة اﻟﺛﺎﻟﺛﺔ ﻓﺈذا ﻛﺎﻧﺎ ﻗﺎﺑﻠﯾن ﻟﻠﺗوﺣﯾد أﺟﺎﺑت ﻟﻐﺔ ﺑروﻟوج ﺑﻘﯾﻣﺔ اﻟﺗوﺣﯾد وإﻻ أﺟﺎﺑت ﻟﻐﺔ ﺑروﻟوج ‪.no‬‬
‫ﻓﻣﺛﻼً ﻟﻧﺳﺄل ﻟﻐﺔ ﺑروﻟوج‪:‬‬ ‫•‬
‫‪?X = ali.‬‬
‫‪X = ali‬‬
‫أي أن ﻟﻐﺔ ﺑروﻟوج وﺣدت ‪ X‬و ‪. ali‬‬ ‫•‬
‫‪?- X=ali.‬‬
‫‪X = ali‬‬
‫‪true‬‬
‫أي أن ﻗﯾﻣﺔ اﻟﺗوﺣﯾد ھو أن ﺗﺻﺑﺢ ﻗﯾﻣﺔ ‪ X‬اﻟﺗﻌﺑﯾر ‪. 1/2‬‬ ‫•‬
‫‪? -X=1/2.‬‬
‫‪X = 1/2‬‬
‫ﻻﺣظ أن ﻟﻐﺔ ﺑروﻟوج ﻟم ﺗﺣﺳب ﻗﯾﻣﺔ اﻟﺗﻌﺑﯾر اﻟرﯾﺎﺿﻲ ‪ 1/2‬ﺑل أﺑﻘت اﻟﺗﻌﺑﯾر ﻛﻣﺎ ھو‪.‬‬ ‫•‬
‫‪15‬‬
‫اﻟﻌﻼﻗﺎت ﻓﻲ اﻟﺑروﻟوج‬

‫‪? f(X) = f(ali).‬‬


‫‪X = ali‬‬

‫‪?f=g.‬‬
‫‪false‬‬
‫أﻧﮫ ﻻ ﺗوﺟد طرﯾﻘﺔ ﻟﺗوﺣﯾد اﻟﺛواﺑت‪ f‬و ‪. g‬‬
‫‪16‬‬
‫اﻟﻌﻼﻗﺎت ﻓﻲ اﻟﺑروﻟوج‬
‫• ‪ X \= Y‬ﺗﻛون ھذه اﻟﻌﻼﻗﺔ ﺻﺣﯾﺣﺔ إذا ﻛﺎﻧت ‪ X‬و‪ Y‬ﻏﯾر ﻗﺎﺑﻠﺗﯾن ﻟﻠﺗوﺣﯾد‪ .‬أي إذا‬
‫ﻟم ﺗوﺟد ﻣﺟﻣوﻋﺔ ﻣن اﻟﺗﻌوﯾﺿﺎت ﻓﻲ اﻟﻣﺗﻐﯾرات )‪(Variable Substitution‬‬
‫ﺑﺣﯾث ﺗﺟﻌل ‪ X‬و ‪ Y‬ﻣﺗطﺎﺑﻘﺗﯾن ﺗﻣﺎﻣﺎ ً ‪ .‬ﻣﺛﻼ ﻟو ﺳﺄﻟﻧﺎ ﻟﻐﺔ ﺑروﻟوج ﻧﻼﺣظ ان ﻓﻲ‪:‬‬
‫‪? f(X)\=f(ali).‬‬
‫‪false‬‬

‫‪?- f\=g.‬‬
‫‪true‬‬
‫• اﻟﺟﻣﻠﺔ اﻷوﻟﻰ اﺟﺎﺑت ‪ No‬او ‪ false‬ﻷﻧﮫ ﻣن اﻟﻣﻣﻛن ﺗوﺣﯾد )‪ f(ali‬و )‪f(x‬‬
‫• ﺑﯾﻧﻣﺎ ﻓﻲ اﻟﺟﻣﻠﺔ اﻟﺛﺎﻧﻲ اﺟﺎﺑت ‪ Yes‬او ‪ true‬ﻷﻧﮫ ﻣن ﻏﯾر اﻟﻣﻣﻛن ﺗوﺣﯾد ‪ g‬و ‪f‬‬
‫‪17‬‬
‫اﻟﻌﻼﻗﺎت ﻓﻲ اﻟﺑروﻟوج‬
‫ھﻧﺎك ﺑﻌض اﻟﻌﻼﻗﺎت اﻟﻣﻧطﻘﯾﺔ اﻟﺗﻲ ﺗﺳﺗطﯾﻊ اﺳﺗﺧداﻣﮭﺎ ﻣﻊ اﻟﺛواﺑت اﻹﺳﻣﯾﺔ‬ ‫•‬
‫‪ (Strings).‬وﺗﻛﺗب اﻟﺛواﺑت اﻹﺳﻣﯾﺔ اﺑﺗداء ﺑﺣرف ﺻﻐﯾر ﻣﺛل ‪ ali‬أو ﺑﺎﺳﺗﺧدام‬
‫ﻓﺎﺻﻠﺔ ﻣﻔردة)‪ (single quotes‬ﻣﺛل ’‪. ‘ALI‬‬
‫وھذه اﻟﻌﻼﻗﺎت ھﻲ‪:‬‬ ‫•‬
‫‪ x @< y‬وﺗﻛون ﺻﺣﯾﺣﺔ إذا ﻛﺎﻧت ‪ X‬ﺗﺄﺗﻲ ﻗﺑل ‪ Y‬ﻟﺣﺳﺎب اﻟﺗرﺗﯾب ﻷﺑﺟدي‪.‬‬ ‫•‬
‫ﻓﻣﺛﻼً ‪:‬‬
‫‪?ali @< basem.‬‬
‫‪true‬‬
‫‪ X @> Y‬وﺗﻛون ﺻﺣﯾﺣﺔ إذا ﻛﺎﻧت ‪ X‬ﺗﺄﺗﻲ ﺑﻌد ‪ Y‬ﺣﺳب اﻟﺗرﺗﯾب اﻷﺑﺟدي‬ ‫•‬
‫‪ X @= < Y‬وﺗﻛون ﺻﺣﯾﺣﺔ إذا ﻛﺎﻧت ‪ X‬ﺗﺄﺗﻲ ﻗﺑل ‪ Y‬ﺣﺳب اﻟﺗرﺗﯾب اﻷﺑﺟدي‬ ‫•‬
‫‪ X @> = Y‬وﺗﻛون ﺻﺣﯾﺣﺔ إذا ﻛﺎﻧت ‪ X‬و ‪ Y‬ﻟﮭﻣﺎ اﻟﺗرﺗﯾب اﻷﺑﺟدي ﻧﻔﺳﮫ أو‬ ‫•‬
‫إذا ﻛﺎﻧت ‪ X‬ﺗﺄﺗﻲ ﺑﻌد ‪ Y‬ﺣﺳب اﻟﺗرﺗﯾب اﻷﺑﺟدي ‪.‬‬
‫‪18‬‬
Example
ali @> sami.
False

'Ali' @> sami.


false
ali @< basem.
True

X @> Y
true
19
‫ﺟﻣﻠﺔ اﻟﺗﻌﯾﯾن و اﻟﻌﻣﻠﯾﺎت اﻟﺣﺳﺎﺑﯾﺔ ﻓﻲ ﻟﻐﺔ ﺑروﻟوج‬
‫• ﻻﺣظ أن ‪ X = Y‬ﻓﻲ ﻟﻐﺔ ﺑروﻟوج ﺗﻌﻧﻲ ﺣﺎول ﺗوﺣﯾد ‪ X‬و ‪ Y‬وﻟذا ﻻ ﻧﺳﺗطﯾﻊ‬
‫اﺳﺗﺧداﻣﮫ ﻟﺗﻌﯾﯾن ﻗﯾﻣﺔ ﺗﻌﺑﯾر ﺣﺳﺎﺑﻲ ﻟﻣﺗﻐﯾر ﻓﻲ ﻟﻐﺔ ﺑروﻟوج ﻓﻣﺛﻼً ﻟو ﺣﺎوﻟت‬
‫‪?X = 1 + 2.‬‬
‫• ﺗﺟﯾب ﻟﻐﺔ ﺑروﻟوج‬
‫‪X=1+2‬‬

‫• أي أن ﻟﻐﺔ ﺑروﻟوج ﻟم ﺗﺣﺳب ﻗﯾﻣﺔ ‪ ،2+1‬أن ﻛل ﻣﺎ ﻋﻣﻠﺗﮫ ھو أﻧﮭﺎ وﺣدت ‪ X‬ﻣﻊ‬


‫‪.1+2‬‬
‫• وﻹﺟﺑﺎر ﻟﻐﺔ ﺑروﻟوج ﻋﻠﻰ ﺣﺳﺎب ﻗﯾﻣﺔ اﻟﻣﺗﻐﯾر اﻟرﯾﺎﺿﻲ وﺛم ﺗﻌﯾﯾن ﺗﻠك اﻟﻘﯾﻣﺔ‬
‫ﻟﻣﺗﻐﯾر ﻧﺳﺗﺧدم ‪ is‬ﺑدﻻً ﻣن = ‪.‬‬
‫‪20‬‬
‫ﺟﻣﻠﺔ اﻟﺗﻌﯾﯾن و اﻟﻌﻣﻠﯾﺎت اﻟﺣﺳﺎﺑﯾﺔ ﻓﻲ ﻟﻐﺔ ﺑروﻟوج‬
‫‪? X = 1+2.‬‬
‫‪X=1+2‬‬

‫‪? X is 1+2.‬‬
‫‪X=3‬‬

‫‪X is 5, X is 3+3.‬‬
‫‪false‬‬
‫‪21‬‬
‫ﺟﻣﻠﺔ اﻟﺗﻌﯾﯾن و اﻟﻌﻣﻠﯾﺎت اﻟﺣﺳﺎﺑﯾﺔ ﻓﻲ ﻟﻐﺔ ﺑروﻟوج‬
‫‪?X is 5, X is 3+3.‬‬
‫‪false‬‬
‫• ﺗﺟﯾب ﻟﻐﺔ ﺑروﻟوج ‪ ،no‬وذﻟك ﻷن ﻟﻐﺔ ﺑروﻟوج ﻋﻧدﻣﺎ ﻧﻔذت اﻟﮭدف‬
‫اﻟﻔرﻋﻲ اﻷول‪ (X is 5) .‬أﻋطت اﻟﻣﺗﻐﯾر ‪ X‬اﻟﻘﯾﻣﺔ ‪5‬‬
‫• ﻋﻧدﻣﺎ وﺻﻠت إﻟﻰ اﻟﮭدف اﻟﻔرﻋﻲ اﻟﺛﺎﻧﻲ ‪ X is 3 + 3‬ﻗﺎﻣت ﺑﺣﺳﺎب‬
‫‪ 3 + 3‬وﻷن ھذه اﻟﻘﯾﻣﺔ )‪ (6‬ﻣﺧﺗﻠﻔﺔ ﻋن ﻗﯾﻣﺔ ‪ X‬اﻟﺣﺎﻟﯾﺔ وھﻲ )‪،(5‬‬
‫أﺟﺎﺑت ﻟﻐﺔ ﺑروﻟوج ﺑـ ‪. no‬‬
‫‪22‬‬
‫اﻟﻌﻣﻠﯾﺎت اﻟﺣﺳﺎﺑﯾﺔ ﻓﻲ ﻟﻐﺔ ﺑروﻟوج‬
‫ھﻧﺎك اﻟﻣزﯾد ﻣن اﻟﻌﻣﻠﯾﺎت اﻟﺣﺳﺎﺑﯾﺔ اﻟﺗﻲ ﺗﻘوم ﺑﮭﺎ ﻟﻐﺔ اﻟﺑروﻟوج وھﻲ‪:‬‬ ‫•‬
‫وﺗﺳﺗﻌﻣل ﻛﻣﺎ رأﯾﻧﺎ ﻟﻠﺟﻣﻊ‪.‬‬ ‫‪+‬‬ ‫•‬
‫وﺗﺳﺗﻌﻣل ﻟﻠطرح‪.‬‬ ‫‪-‬‬ ‫•‬
‫وﺗﺳﺗﻌﻣل ﻟﻠﺿرب‪.‬‬ ‫*‬ ‫•‬
‫وﺗﺳﺗﻌﻣل ﻟﻠﻘﺳﻣﺔ اﻟﺣﻘﯾﻘﯾﺔ )‪.(real division‬‬ ‫‪/‬‬ ‫•‬
‫وﺗﺳﺗﻌﻣل ﻟﻠﻘﺳﻣﺔ اﻟﺻﺣﯾﺣﺔ )‪.(integer division‬‬ ‫‪//‬‬ ‫•‬
‫‪ mod‬وﺗﺳﺗﻌﻣل ﻹﯾﺟﺎد ﺑﺎﻗﻲ اﻟﻘﺳﻣﺔ اﻟﺻﺣﯾﺣﺔ‪.‬‬ ‫•‬
‫وﺗﺳﺗﻌﻣل ﻟﻠرﻓﻊ ﻟﻠﻘوة‪.‬‬ ‫^‬ ‫•‬

‫‪23‬‬
‫اﻟﻌﻣﻠﯾﺎت اﻟﺣﺳﺎﺑﯾﺔ ﻓﻲ ﻟﻐﺔ ﺑروﻟوج‬
‫‪X is 3+1.‬‬
‫• ﻻﺣظ اﻟﻔرق ﺑﯾن ﻧﺗﯾﺟﺔ ‪ 1/2‬و ‪1//2‬‬
‫‪X=4‬‬
‫• ﻟﺣﺳﺎب ‪ 1/2‬ﺗﺳﺗﻌﻣل ﻟﻐﺔ ﺑروﻟوج اﻟﻘﺳﻣﺔ اﻟﺣﻘﯾﻘﯾﺔ‬
‫‪X is 3-1.‬‬ ‫ﻓﺗﻛون اﻟﻧﺗﯾﺟﺔ ‪،0.5‬‬
‫‪X=2‬‬ ‫• ﻟﺣﺳﺎب ‪ 1//2‬ﺗﺳﺗﻌﻣل ﻟﻐﺔ ﺑروﻟوج اﻟﻘﺳﻣﺔ اﻟﺻﺣﯾﺣﺔ‬
‫وﻟذا ﺗﻛون اﻟﻧﺗﯾﺟﺔ ‪.0‬‬
‫‪X is 1/2.‬‬
‫‪X = 0.5‬‬

‫‪X is 1//2.‬‬
‫‪X=0‬‬
‫‪24‬‬
‫اﻟﻌﻣﻠﯾﺎت اﻟﺣﺳﺎﺑﯾﺔ ﻓﻲ ﻟﻐﺔ ﺑروﻟوج‬
‫‪X is 7//3.‬‬
‫‪X=2‬‬

‫‪X is 7/3.‬‬
‫‪X = 2.3333333333333335‬‬

‫‪X is 5 mod 4.‬‬


‫‪X=1‬‬
‫‪25‬‬
‫اﻟﻌﻣﻠﯾﺎت اﻟﺣﺳﺎﺑﯾﺔ ﻓﻲ ﻟﻐﺔ ﺑروﻟوج‬
• X is <arithmetic expression>
• Here is how to use Prolog as a calculator.
?- X is 2 + 2.
X=4
?- X is 3 * 4 + 2.
X = 14

26
‫اﻟﻌﻣﻠﯾﺎت اﻟﺣﺳﺎﺑﯾﺔ ﻓﻲ ﻟﻐﺔ ﺑروﻟوج‬
‫‪?- X is 3 * (4 + 2).‬‬
‫‪X = 18‬‬
‫‪?- X is (8 / 4) / 2.‬‬
‫‪X=1‬‬

‫‪27‬‬
‫اﻟﻌﻣﻠﯾﺎت اﻟﺣﺳﺎﺑﯾﺔ ﻓﻲ ﻟﻐﺔ ﺑروﻟوج‬
• converts centigrade temperatures to Fahrenheit, and
checks if a temperature is below freezing =< 32.
c_to_f(36,F).
c_to_f(C,F):- F is C * 9 / 5 + 32. F = 96.8
freezing(F):- F =< 32. freezing(44).
false

28
‫اﻟﻌﻣﻠﯾﺎت اﻟﺣﺳﺎﺑﯾﺔ ﻓﻲ ﻟﻐﺔ ﺑروﻟوج‬
Here are some examples of their use.
?- c_to_f(100,X).
X = 212
yes
?- freezing(15).
yes
?- freezing(45).
no
29
‫ﺗدرﯾﺑﺎت ‪ -‬اﻟﻌﻣﻠﯾﺎت اﻟﺣﺳﺎﺑﯾﺔ ﻓﻲ ﻟﻐﺔ ﺑروﻟوج‬
‫‪X>Y‬‬ ‫‪?- X is 2 + 2, X > 3.‬‬
‫‪X<Y‬‬ ‫‪X=4‬‬
‫‪X >= Y‬‬
‫‪X =< Y‬‬
‫‪?- X is 2 + 2, 3 >= X.‬‬
‫‪?- 4 > 3.‬‬ ‫‪no‬‬
‫‪yes‬‬
‫‪?- 4 < 3.‬‬ ‫‪?- 3+4 > 3*2.‬‬
‫‪no‬‬ ‫‪yes‬‬

‫‪30‬‬
‫ﺗدرﯾﺑﺎت – اﻟﺗﻌﯾﯾن واﻟﻌﻣﻠﯾﺎت اﻟﺣﺳﺎﺑﯾﺔ ﻓﻲ ﻟﻐﺔ ﺑروﻟوج‬
2 = 2.
2 = 2. =(mia,mia).
true =(mia,vincent).
mia = mia .
=(mia,mia). 'mia' = mia.
'2' = 2.
true mia = X.
kill(shoot(gun),Y) = kill(X,stab(knife)).
=(mia,vincent). kill(shoot(gun), stab(knife)) = kill(X,stab(Y)).
false likes(X,X) = likes(book,story).

mia = mia .
true kill(shoot(gun),Y) = kill(X,stab(knife)).
'mia' = mia. X = shoot(gun),
true Y = stab(knife)
'2' = 2. kill(shoot(gun), stab(knife)) = kill(X,stab(Y)).
false X = shoot(gun),
mia = X. Y = knife
X = mia likes(X,X) = likes(book,story).
false 31
‫ﺗدرﯾﺑﺎت – اﻟﺗﻌﯾﯾن واﻟﻌﻣﻠﯾﺎت اﻟﺣﺳﺎﺑﯾﺔ ﻓﻲ ﻟﻐﺔ ﺑروﻟوج‬
a \= b.
a \= b. a \= a.
true 'a' \= a.
A \= a.
a \= a. f(A) \= f(a). f(a) \= a.
false false f(a) \= A.
f(A) \= f(a).
'a' \= a. g(a,B,c) \= g(A,b,C). g(a,B,c) \= g(A,b,C).
false false g(a,b,c) \= g(A,C).
f(X) \= X.
A \= a. g(a,b,c) \= g(A,C).
false true
f(a) \= a. f(X) \= X.
true false
f(a) \= A.
false
32
‫اﺧﺗر اﻹﺟﺎﺑﺔ‬
• If sky is blue, everyone likes it. - Write this statement
as a prolog clause. .‫ ﯾﺣﺑﮭﺎ اﻟﺟﻣﯾﻊ‬، ‫إذا ﻛﺎﻧت اﻟﺳﻣﺎء زرﻗﺎء‬

A) sky(blue) :- everyone(likes).
B) blue(sky), likes(X).
C) likes(X, sky) :- blue(sky).
D) likes(sky, everyone) :- blue(sky).

33
‫ﻣﺎ ﻣﻌﻧﻰ ﺟﻣﻠﺔ ﺑروﻟوج اﻟﺗﺎﻟﯾﺔ‬
• What would be the English meaning for this prolog clause.
‫ اﻟﻔراء‬Fur
?- owner(jack, cat(X)) :- fur(X),spots(X). ‫ ﺑﻘﻊ‬spots

A) jack is a owner of cat and fur and spots.


B) jack is the owner of X or jack is the owner of fur and spots .
C) jack is the owner of some cat if that cat has fur and spots.
D) B & C both.

34
• Do these different queries produce the same result in prolog?
‫؟‬prolog ‫• ھل ﺗؤدي ھذه اﻻﺳﺗﻔﺳﺎرات اﻟﻣﺧﺗﻠﻔﺔ إﻟﻰ ﻧﻔس اﻟﻧﺗﯾﺟﺔ ﻓﻲ‬
?- N is -(+(5,6),4). and ?- N is (5+6)-4.

N is -(+(5,6),4).
A) yes N=7

B) no N is (5+6)-4.
N=7

35
• How will prolog respond to this query?

?- 11 + 4 is 15.
A) true
B) false

36
‫ﻣﺛﺎل ‪max‬‬
‫• أﻛﺗب ﺑرﻧﺎﻣﺟﺎ ً ﻟﺗﻌرﯾف اﻟﻌﻼﻗﺔ )‪ max(X,Y,M‬ﺑﺣﯾث ﺗﻛون ‪ M‬ھﻲ أﻛﺑر ﻗﯾﻣﺔ ﻣن‬
‫اﻟﻘﯾم ‪ X‬و‪. Y‬‬

‫‪max(X,Y,M):-‬‬
‫‪max(3,7,Y).‬‬
‫‪Y=7‬‬
‫‪X>=Y,M is X.‬‬
‫‪max(X,Y,M):-‬‬
‫‪max(5,3,Y).‬‬
‫‪Y>X, M is Y.‬‬
‫‪Y=5‬‬
‫‪37‬‬
‫ﻣﺛﺎل اﻟﻘﯾﻣﺔ اﻟﻣطﻠﻘﺔ‬
‫• أﻛﺗب ﺑرﻧﺎﻣﺞ ) ‪ absval(X,Y‬ﻟﺣﺳﺎب اﻟﻘﯾﻣﺔ اﻟﻣطﻠﻘﺔ ‪ y‬ﻟـِ ‪. X‬‬

‫‪abs(-7,Y).‬‬
‫‪abs(X,Y):-X<0,‬‬ ‫‪Y=7‬‬
‫‪Y is -1*X.‬‬
‫‪abs(3,Y).‬‬
‫‪abs(X,X):-X>0.‬‬ ‫‪Y=3‬‬

‫‪38‬‬
‫ﻣﺛﺎل اﻻﻋداد اﻟزوﺟﯾﺔ‬
‫• أﻛﺗب ﺑرﻧﺎﻣﺟﺎ ً ﻟﺗﻌرﯾف اﻟﻌﻼﻗﺔ )‪ even(X‬ﺑﺣﯾث ﺗﻛون ﺻﺣﯾﺣﺔ ﻓﻘط إذا ﻛﺎن ‪ X‬ﻋددا ً زوﺟﯾﺎ ً‪.‬‬

‫‪even(X):- X mod 2 =:= 0.‬‬

‫‪even(4).‬‬
‫‪true‬‬

‫‪39‬‬
‫ﻣﺛﺎل اﻻﻋداد اﻟﻔردﯾﺔ‬
‫• أﻛﺗب ﺑرﻧﺎﻣﺟﺎ ً ﻟﺗﻌرﯾف اﻟﻌﻼﻗﺔ )‪ odd(X‬ﺑﺣﯾث ﺗﻛون ﺻﺣﯾﺣﺔ ﻓﻘط إذا ﻛﺎن ‪ X‬ﻋددا ً ﻓردﯾﺎ‪.‬‬

‫‪odd(X):- X mod 2 =\= 0.‬‬

‫‪odd(4).‬‬
‫‪false‬‬

‫‪40‬‬
Example
male(ram).
male(shyam).
female(sita).
female(gita).
parents(shyam, gita, ram).
parents(sita, gita, ram).
sister_of(X,Y):- female(X), parents(X, M, F), parents(Y, M, F).

41
Backtracking ?- sister_of (sita, shyam).
sister_of (X,Y):- female (X), parents (X, M, F),parents (Y, M, F).
sister_of (sita, shyam):- female (sita), parents (sita, M, F), parents (shyam, M, F).

?- sister_of (sita, shyam).

{X/sita , Y/ shyam}

parents(sita,M,F) parents(shyam,M,F)
female(sita)

{M/gita , F/ ram} {M/gita , F/ ram}

1. male(ram). parents(shyam,gita,ram)
2. male(shyam). parents(sita,gita,ram)
3. female(sita).
4. female(gita).
5. parents(shyam, gita, ram). success
6. parents(sita, gita, ram).
7. sister_of(X,Y):- female(X), parents(X, M, F), parents(Y, M, F).
Question Answering: whose sister is sita?
sister_of (sita,Y):- female (sita), parents (sita, M, F),parents (Y, M, F).

?- sister_of(sita, Y).

{X/sita}
1 5

female(sita) parents(sita,M,F) parents(Y,M,F)

{M/gita , F/ ram}
{M/gita , F/ ram}
parents(Y,gita,ram)
1. male(ram).
2. male(shyam). 6 {Y/ shyam}
parents(sita,gita,ram)
3. female(sita).
parents(shyam,gita,ram)
4. female(gita).
5. parents(shyam, gita, ram).
6. parents(sita, gita, ram). Success
7. sister_of(X,Y):- female(X), parents(X, M, F), parents(Y, M, F). Y=shyam
‫اﻻﺳﺗدﻋﺎء اﻟذاﺗﻲ )‪(Recursion‬‬
‫• ﻛﺗﺎﺑﺔ اﻟﻌﻼﻗﺔ )‪ predecessor(X,Y‬ﺑﺣﯾث ﺗﻛون ﺻﺣﯾﺣﺔ إذا ﻛﺎن ‪ X‬أﺣد أﺳﻼف‬
‫)أﺟداد(‪ .Y‬ﯾﻣﻛن ﻛﺗﺎﺑﺗﮭﺎ ﺑﺎﻟطرﯾﻘﺔ اﻟﺗﺎﻟﯾﺔ‬
‫‪predecessor (X,Y) :- parent (X,Y).‬‬
‫‪predecessor(X,Y) :- parent (X,Z), parent(Z,Y).‬‬
‫‪predecessor (X,Y) :- parent(X,Z1),parent(Z1, Z2), parent (Z2,Y).‬‬

‫ﺗﻘول اﻟﺟﻣﻠﺔ اﻷوﻟﻰ أن ‪ X‬ﺳﻠف‪ Y‬إذا ﻛﺎﻧت ‪ X‬ھو أﺣد واﻟدي ‪،Y‬‬ ‫•‬
‫اﻟﺟﻣﻠﺔ اﻟﺛﺎﻧﯾﺔ ﺗﻘول أن‪ X‬ﺳﻠف ‪ Y‬إذا ﻛﺎن ھﻧﺎﻟك ‪ Z‬ﺑﺣﯾث ﺗﻛون ‪ X‬أﺣد واﻟدي ‪Z‬‬ ‫•‬
‫وﺗﻛون ‪ Z‬أﺣد واﻟدي ‪) Y‬أي أن ‪ X‬ھﻲ اﻟﺟد اﻷول ﻟـ ‪.(Y‬‬
‫أﻣﺎ اﻟﺟﻣﻠﺔ اﻟﺛﺎﻟﺛﺔ ﻓﺗﻘول أن ‪ X‬ﺗﻛون أﺣد أﺳﻼف ‪ Y‬إذا ﻛﺎﻧت ‪ X‬اﻟﺟد اﻟﺛﺎﻧﻲ ﻟـ ‪Y‬‬ ‫•‬
‫وﻟو أردﻧﺎ اﻷﺧذ ﺑﻌﯾن اﻻﻋﺗﺑﺎر ان ‪ X‬ﻗد ﺗﻛون اﻟﺟد اﻟﺛﺎﻟث ﻟـ ‪ Y‬ﻟﺗوﺟب ﻋﻠﯾﻧﺎ ﻛﺗﺎﺑﺔ‬ ‫•‬
‫ﺟﻣﻠﺔ راﺑﻌﺔ وھﻛذا‪.‬‬
‫‪44‬‬
‫اﻻﺳﺗدﻋﺎء اﻟذاﺗﻲ )‪(Recursion‬‬
‫• ﻟﻛﺗﺎﺑﺔ ‪ predecessor‬ﺑﺷﻛل ﻋﺎم‪ ،‬ﻏﯾر ﻣﺣدود ﺑﻌدد ﻣﻌﯾن ﻣن اﻷﺟﯾﺎل‪،‬‬
‫ﻧﺣﺗﺎج إﻟﻰ اﺳﺗﺧدام ﻓﻛرة اﻻﺳﺗدﻋﺎء اﻟذاﺗﻲ )‪(Recursion‬‬
‫‪predecessor(X,Y) :- parent(X,Y).‬‬
‫‪predecessor(X,Y) :- parent(X,Z),predecessor(Z,Y).‬‬

‫• اﻟﺟﻣﻠﺔ اﻷوﻟﻰ ﺗﻘول أن )‪ predecessor(X,Y‬ﺗﻛون ﺻﺣﯾﺣﺔ إذا ﻛﺎﻧت‬


‫‪ X‬أﺣد واﻟدي ‪.Y‬‬
‫• اﻟﺟﻣﻠﺔ اﻟﺛﺎﻧﯾﺔ أن )‪ predecessor(X,Y‬ﺗﻛون ﺻﺣﯾﺣﺔ إذا ﻛﺎﻧت ھﻧﺎﻟك‬
‫‪ Z‬ﺑﺣﯾث أن ‪ X‬ھﻲ أﺣد واﻟدي ‪ Z‬و ‪ Z‬ھﻲ أﺣد أﺳﻼف ‪.Y‬‬
‫‪45‬‬
predecessor(X,Y).
parent(ali,ahmad). ‫ﻣﺛﺎل‬ X = ali,
parent(ahmad,fatema). Y = ahmad
parent(father,samer).
predecessor(X,Y):- parent(X,Y). X = ahmad,
predecessor(X,Y):- parent(X ,Z), Y = fatema
predecessor(Z,Y).
X = father,
Y = samer
? predecessor(ali,ahmad).
true
X = ali,
Y = fatema
false 46
‫ﻣﺛﺎل ﻣﺿروب اﻟﻌدد‬
fact(0,1).
fact(N,X):- ‫اﻟﺗﻌدﯾل اﻟﺧﺎطﺊ‬
fact(0,1). fact(-3,F). N>0,
fact(N,X):- fact(N-1,X1),
N1 is N - 1, X is N*X1.
fact(N1,X1),
X is N * X1. fact(0,1).
fact(N,X):-
fact(0,X). fact(1,X).
N> 0, N1 is N-1, ‫اﻟﺗﻌدﯾل ﺻﺣﯾﺢ‬
X=1 X=1
fact(N1,X1),
fact(3,X).
X=6 X is N*X1. 47
fact(0,1).
fact(N,F) :-
How does it work
?- trace.
N>0, ?- fact(3,X). % The debugger will first creep --
N1 is N-1, showing everything (trace).
yes
fact(N1,F1), [trace]
?- fact(3,X).
F is N * F1. (1) 0 Call: fact(3,_8140) ?
(1) 1 Head [2]: fact(3,_8140) ?
(2) 1 Call (built-in): 3>0 ?
(2) 1 Done (built-in): 3>0 ?
(3) 1 Call (built-in): _8256 is 3-1 ?
(3) 1 Done (built-in): 2 is 3-1 ?
(4) 1 Call: fact(2, _8270) ?
...
(1) 0 Exit: fact(3,6) ?
X=6
[trace]
?- notrace.
% The debugger is switched off
yes 48
How does it work
fact(0,1).
fact(N,F) :-
N>0,
N1 is N-1,
fact(N1,F1),
F is N * F1.

?- fact(3,X).

49
.N,...,3,2,1 ‫أﻛﺗب ﺑرﻧﺎﻣﺟﺎ ً ﻹﯾﺟﺎد ﻣﺟﻣوع اﻷرﻗﺎم‬

sum(0,0). sum(5,X).
X = 15
sum(N,S):-
N> 0, N1 is N-1,
sum(N1,S1),
S is N+S1.

50
Structures ‫اﻟﺗراﻛﯾب‬
. ‫( ﺷرﻛﺔ ﻣﺎ ﺑﺎﺳﺗﺧدام ﻟﻐﺔ اﻟﺑروﻟوج‬employees) ‫• ﻟﻧﻣﺛل اﻟﺑﯾﺎﻧﺎت اﻟﺧﺎﺻﺔ ﺑﻣوظﻔﻲ‬

employee(Name,House_no,Street_name,City_name,Day,Month,Year) .

‫• ﻓﻣﺛﻼً اﻟﺟﻣﻠﺔ‬
employee(ali,5,salfeet_street,salfeet,19,10,1980).
employee(ali,address(5,salt_street,salfeet),date(19,10,1980)).

51
Structures ‫اﻟﺗراﻛﯾب‬
employee(ali, address(5,salt_street,amman),date(19,10,1980)).

-?employee(ali,A,D).

A = address(5, salt_street, amman)


D = date(19, 10, 1980)

52
Structures ‫اﻟﺗراﻛﯾب‬
employee(ali,address(5,salt_street,salfeet),date(19,10,1980)).
employee(fatema,address(17,university_street,nablus),date(7,5,1985)).
employee(ahmad,address(11,king_street,salfeet),date(15,8,1985)).

53
‫اﻟﺗراﻛﯾب ‪Structures‬‬
‫• اﻵن ﻧﺳﺗطﯾﻊ اﻟطﻠب ﻣن ﻟﻐﺔ ﺑروﻟوج ﺗزوﯾدﻧﺎ ﺑﺎﻟﻣﻌﻠوﻣﺎت اﻟﺧﺎﺻﺔ ﺑﻛل اﻟﻣوظﻔﯾن‬
‫اﻟذﯾن ﯾﺳﻛﻧون ﻣدﯾﻧﺔ ‪ salfeet‬ﺑﺎﺳﺗﺧدام اﻟﺟﻣﻠﺔ اﻻﺳﺗﻔﺳﺎرﯾﺔ اﻟﺗﺎﻟﯾﺔ ‪:‬‬
‫‪employee(Name,address(No,St,salfeet),D ).‬‬

‫‪54‬‬
‫اﻟﺗراﻛﯾب ‪Structures‬‬
‫• ﻟﻼﺳﺗﻔﺳﺎر ﻋن ﺟﻣﯾﻊ اﻟﻣوظﻔﯾن اﻟذﯾن اﻟﺗﺣﻘوا ﺑﺎﻟﻌﻣل ﻓﻲ ﻋﺎم ‪ 1985‬ﻛﻣﺎ ﯾﻠﻲ ‪:‬‬
‫‪employee(Name,A,date(D,M,1985)).‬‬
‫• ﻻﺳﺗﻔﺳﺎر ﻋن ﺟﻣﯾﻊ اﻟﻣوظﻔﯾن اﻟذﯾن ﺗزﯾد ﻓﺗرة ﻋﻣﻠﮭم ﻋﻠﻰ ﺧﻣﺳﺔ ﻋﺷر ﻋﺎﻣﺎ ً )ﻣﻊ‬
‫ﺗﺟﺎھل ﻋدد اﻷﯾﺎم واﻷﺷﮭر( وﺳﻧﻔرض أن اﻟﻌﺎم اﻟﺣﺎﻟﻲ ھو ﻋﺎم ‪ 1997‬ﻓﺗﻛون‬
‫اﻟﺟﻣﻠﺔ اﻻﺳﺗﻔﺳﺎرﯾﺔ اﻟﻣطﻠوﺑﺔ ھﻲ‪:‬‬
‫‪employee(X,A,date(Day,Month,Year)), 1997 - Year >15.‬‬

‫‪55‬‬
‫اﻟﺷﺟرة‬
‫• ﯾﻣﻛﻧﻧﺎ ﺗﻣﺛﯾل اﻟﺷﺟرة اﻟﺛﻧﺎﺋﯾﺔ اﻟﻔﺎرﻏﺔ ﺑﺎﻟرﻣز ‪ ،nil‬وإذا ﻟم ﺗﻛن ﻓﺎرﻏﺔ ﺑﺗرﻛﯾب‬
‫)أو ﻗﺎﻟب( ﺳﻧﺳﻣﯾﮫ ‪ bin_tree‬وﻟﮫ اﻟﺻﯾﻐﺔ اﻟﺗﺎﻟﯾﺔ‪:‬‬

‫‪bin_tree(Left_subtree, Root, Right_subtree).‬‬

‫‪56‬‬
‫اﻟﺷﺟرة‬
‫• ﻓﻣﺛﻼً ﻧﻣﺛل اﻟﺷﺟرة رﻗم )أ( ﺑﺎﻟﺗرﻛﯾب‪:‬‬
‫‪bin_tree(nil,a,nil).‬‬

‫‪57‬‬
‫اﻟﺷﺟرة‬
bin_tree(bin_tree(nil,b,nil),a,bin_tree(nil,c,nil)).

bin_tree(nil,a,nil).

58
bin_tree(bin_tree(nil,2,nil),5,bin_tree(bin_tree(nil,7,nil),10 ,
bin_tree(nil,9,bin_tree(nil,3,nil))))

bin_tree(bin_tree(nil,7,nil),
bin_tree(bin_tree(nil,2,nil) 10 ,
bin_tree(nil,9,bin_tree(nil,3,nil)))

(bin_tree(nil,7,nil)
bin_tree(nil,9,bin_tree(nil,3,nil)

59
count(nil,0). count ‫ﻣﺛﺎل‬
count(bin_tree(Left,Root,Right),C):-
count(Left,C1),
count(nil,0).
count(Right,C2),
count(bin_tree(Left,_,Right),C):-
C is C1+C2+1.
count(Left,C1),
count(Right,C2),
C is C1+C2+1.

count(bin_tree(bin_tree(nil, 1, bin_tree(nil, 2, nil)), 3, nil), H).


60
Tracing Count
Call:count(bin_tree(bin_tree(nil, 1, bin_tree(nil, 2, nil)), 3, nil), _4924)
Call:count(bin_tree(nil, 1, bin_tree(nil, 2, nil)), _5338) bin_tree
Call:count(nil, _5338)
Exit:count(nil, 0)
(bin_tree(nil, 1, bin_tree(nil, 2, nil))
Call:count(bin_tree(nil, 2, nil), _5338) , 3,
Call:count(nil, _5338) nil)
Exit:count(nil, 0)
Call:count(nil, _5338)
Exit:count(nil, 0) Call:_5360 is 0+1+1
Exit:2 is 0+1+1
Call:_5348 is 0+0+1
Exit:count(bin_tree(nil, 1, bin_tree(nil, 2, nil)), 2)
Exit:1 is 0+0+1 Call:count(nil, _5362)
Exit:count(bin_tree(nil, 2, nil), 1) Exit:count(nil, 0)
Call:_4924 is 2+0+1
Exit:3 is 2+0+1
Exit:count(bin_tree(bin_tree(nil, 1, bin_tree(nil, 2, nil)), 3, nil), 3)
H=3

61
sum ‫ﻣﺛﺎل‬
sum(nil,0).
sum(bin_tree(Left,Root,Right),S):-
count(Left,S1),
count(Right,S2),
S is S1+S2+Root.

62
depth ‫ﻣﺛﺎل اﻟﻌﻣﻖ‬
depth(nil,0).
depth(bin_tree(Left,Root,Right),D):- depth(nil,0)
depth(Left,D1),
depth(Right,D2),
D1>=D2 ,
D is D1+1.

depth(bin_tree(Left,Root,Right),D):-
depth(Left,D1),
depth(Right,D2),
D2 >D1,
D is D2+1.
63
depth ‫ﻣﺛﺎل اﻟﻌﻣﻖ‬
depth(nil,0).
depth(bin_tree(L,Root,R),D):-
depth(L,D1),
depth(R,D2),
max(D1,D2,M),
D is M+1.

max(X,Y,M):- X>=Y,
M=X.
max(X,Y,M):- Y>X
M=Y.
64
height(nil, 0).
height(tree(L, _ , R), H) :- height(L, HL), height(R, HR),
max(HL, HR, HN), H is HN + 1.
max(X, Y, X) :- X >= Y.
max(X, Y, Y) :- X < Y.

• Consult:
height(bin_tree(bin_tree(nil, 1, bin_tree(nil, 2, nil)), 3, nil), H).
height(bin_tree(bin_tree(nil,2,nil),5,bin_tree(bin_tree(nil,7,nil),10 ,
bin_tree(nil,9,bin_tree(nil,3,nil)))) ,H).

65
height(tree(tree(nil, 1, tree(nil, 2, nil)), 3, nil), H).

66
‫ﻣﻌﺎﻟﺟﺔ اﻟﻘواﺋم‬
‫ﺗﻌﺗﺑر اﻟﻘواﺋم ‪ lists‬ﻣن أھم وأﻛﺛر اﻟﺗراﻛﯾب اﻟﻣﺳﺗﺧدﻣﺔ ﻓﻲ ﻟﻐﺔ اﻟﺑروﻟوج‪.‬‬ ‫•‬
‫وﻗد ﺗﻛون اﻟﻘﺎﺋﻣﺔ ﻓﺎرﻏﺔ وﯾرﻣز ﻟﮭﺎ ﻓﻲ ھذه اﻟﺣﺎﻟﺔ ﺑـ ] [‪ ،‬وإذا ﻟم ﺗﻛن ﻓﺎرﻏﺔ ﻓﺈن‬ ‫•‬
‫اﻟﻌﻧﺻر اﻷول ﻓﯾﮭﺎ ﯾﺳﻣﻰ ﺑﺎﻟرأس ‪ Head‬واﻟﻘﺎﺋﻣﺔ اﻟﻣﻛوﻧﺔ ﻣن ﺑﻘﯾﺔ اﻟﻌﻧﺎﺻر‬
‫ﺗﺳﻣﻰ ﺑﺎﻟذﯾل ‪Tail‬‬
‫‪ -‬ﻓﻣﺛﻼً ﻓﻲ اﻟﻘﺎﺋﻣﺔ ‪[5,2,7,10] :‬‬ ‫•‬
‫ﯾﻛون اﻟرأس ھو اﻟﻌﻧﺻر اﻷول ‪ 5‬وﯾﻛون اﻟذﯾل اﻟﻘﺎﺋﻣﺔ ]‪[2,7,10‬‬ ‫•‬
‫وﻧﺳﺗطﯾﻊ ﺟﻌل ﻟﻐﺔ ﺑروﻟوج اﻟﻘﯾﺎم ﺑﻔرز اﻟرأس ﻋن اﻟذﯾل ﺑﺎﺳﺗﺧدام أداة اﻟرﺑط |‪.‬‬ ‫•‬
‫ﻓﻣﺛﻼً ﻟﻧﺟرب ھذه اﻟﺟﻣﻠﺔ اﻻﺳﺗﻔﺳﺎرﯾﺔ وﻧﻼﺣظ ﻣﺎذا ﺳﺗﺟﯾب ﻋﻠﯾﻧﺎ ﻟﻐﺔ ﺑروﻟوج‪:‬‬ ‫•‬
‫‪67‬‬
‫إن ﻣﺎ ﻗﺎﻣت ﺑﮫ ﻟﻐﺔ ﺑروﻟوج ھو‬
‫أﻧﮭﺎ وﺣدت‬
‫‪ H‬ﻣﻊ اﻟرأس ‪5‬‬
‫‪ T‬ﻣﻊ اﻟذﯾل ]‪.[2,7,10‬‬

‫‪68‬‬
‫• ﻟﻧﺟرب ھذه اﻟﺟﻣﻠﺔ اﻻﺳﺗﻔﺳﺎرﯾﺔ‬
‫‪[H|T]=[ali].‬‬
‫• وﺗﺟﯾب ﻟﻐﺔ ﺑروﻟوج‬
‫‪H=ali‬‬
‫][=‪T‬‬
‫• ﻟﻧﺟرب اﻟﺟﻣﻠﺔ اﻻﺳﺗﻔﺳﺎرﯾﺔ اﻟﺗﺎﻟﯾﺔ ‪:‬‬
‫‪[H|T] = [].‬‬
‫• ﺗﺟﯾب ﺑروﻟوج ‪ ،no‬وذﻟك ﻷن اﻟﺟﻣﻠﺔ اﻟﻔﺎرﻏﺔ ﻻ ﺗﺣﺗوي ﻋﻠﻰ رأس وذﯾل‪.‬‬
‫‪69‬‬
‫• ﻛﺗﺎﺑﺔ اﻟﺑرﻧﺎﻣﺞ ) ‪ member(X,L‬اﻟذي ﯾﻘوم ﺑﺗﺣدﯾد ﻓﯾﻣﺎ إذا ﻛﺎن اﻟﻌﻧﺻر ‪X‬‬
‫ﻣوﺟودا ً ﻓﻲ اﻟﻘﺎﺋﻣﺔ ‪ L‬أم ﻻ‪.‬‬
‫‪member(X,[X,T]).‬‬
‫‪member(X,[ _|T]):- member(X,T).‬‬
‫ﺗﻘول اﻟﺟﻣﻠﺔ اﻷوﻟﻰ ﻓﻲ ﺗﻌرﯾف ‪ member‬أن اﻟﻌﻧﺻر ﯾﻛون ﻣوﺟودا ً ﻓﻲ اﻟﻘﺎﺋﻣﺔ اذا‬
‫ﻛﺎن ھو رأس اﻟﻘﺎﺋﻣﺔ‪.‬‬
‫اﻟﺟﻣﻠﺔ اﻟﺛﺎﻧﯾﺔ ﺗﻘول أن اﻟﻌﻧﺻر ﯾﻛون ﻣوﺟودا ً ﻓﻲ اﻟﻘﺎﺋﻣﺔ إذا ﻛﺎن ﻣوﺟودا ﻓﻲ ذﯾﻠﮭﺎ‪.‬‬

‫‪70‬‬
‫‪member(X,[X,T]).‬‬ ‫•أن ‪ 5‬ﻟﯾﺳت أول ﻋﻧﺻر ﻓﻲ اﻟﻘﺎﺋﻣﺔ‬
‫‪member(X,[ _|T]):- member(X,T).‬‬ ‫]‪ [1,5‬ﻟذﻟك اﻟﺟﻣﻠﺔ اﻟﺗﻌرﯾﻔﯾﺔ اﻷوﻟﻰ ﻟـ‬
‫‪ member‬ﻟم ﺗﻧطﺑﻖ‬
‫•ﻟذا ﻗﺎﻣت ﻟﻐﺔ ﺑروﻟوج ﺑﺎﺳﺗﺧدام‬
‫•اﻟﺟﻣﻠﺔ اﻟﺛﺎﻧﯾﺔ اﻟﺗﻲ ﺣﺎوﻟت ﺗﺣدﯾد ﻓﯾﻣﺎ إذا‬
‫‪ 5‬ﻣوﺟودة ﻓﻲ ذﯾل اﻟﻘﺎﺋﻣﺔ ]‪.[5‬أي ﺗﺣوﻟت‬
‫اﻟﺟﻣﻠﺔ اﻻﺳﺗﻔﺳﺎرﯾﺔ اﻷﺻﻠﯾﺔ إﻟﻰ‬
‫‪member(5,[1,5]).‬‬ ‫)]‪،member(5,[5‬‬
‫‪yes‬‬ ‫•واﻵن وﺑﺎﺳﺗﺧدام اﻟﺟﻣﻠﺔ اﻷوﻟﻰ ﻟﺗﺣﻘﯾﻖ‬
‫ھذا اﻟﮭدف ﺗﺟﯾب ﻟﻐﺔ ﺑروﻟوج ‪yes.‬‬
‫‪71‬‬
member(X,[a,b,c,d ]).
X=a;
X=b;
X=c;
X=d;
no

72
‫• أﻛﺗب ﺑرﻧﺎﻣﺟﺎ ً ﯾﺣدد ﻋدد اﻟﻌﻧﺎﺻر اﻟﻣوﺟودة ﻓﻲ ﻗﺎﺋﻣﺔ ﻣﺎ‪.‬‬
‫– أن ﻋدد اﻟﻌﻧﺎﺻر ﻓﻲ اﻟﻘﺎﺋﻣﺔ اﻟﻔﺎرﻏﺔ ھو ﺻﻔر‪.‬‬
‫– وﻋدد اﻟﻌﻧﺎﺻر ﻓﻲ اﻟﻘﺎﺋﻣﺔ ﻏﯾر اﻟﻔﺎرﻏﺔ ھو واﺣد زاﺋد ﻋدد اﻟﻌﻧﺎﺻر اﻟﻣوﺟودة ﻓﻲ ذﯾل‬
‫اﻟﻘﺎﺋﻣﺔ‪.‬‬
‫‪count([ ],0 ).‬‬
‫‪count([X|T],C):-‬‬
‫‪count(T,C1 ),‬‬
‫‪C is C1 + 1.‬‬
‫‪count([a,b,c,d ],X).‬‬
‫‪73‬‬
‫• ﺑرﻧﺎﻣﺞ ﯾﺣدد ﻣﺟﻣوع اﻟﻘﯾم ﻓﻲ ﻗﺎﺋﻣﺔ ﻣﺎ‪ ،‬ﻋﻠﻰ اﻓﺗراض أﻧﮭﺎ ﻗﯾم رﻗﻣﯾﺔ ﺑﺎﻟطﺑﻊ‪.‬‬
‫‪sum([ ],0).‬‬
‫‪sum([X|T],S):-‬‬
‫‪sum(T,S1),‬‬
‫‪S is S1 + X.‬‬

‫‪sum([2,4,7,9 ],X).‬‬

‫‪74‬‬
‫‪append‬‬
‫• اﻛﺗب ﺑرﻧﺎﻣﺟﺎ ً ﻟوﺻل ‪ append‬ﻗﺎﺋﻣﺗﯾن ﻣﻌﺎ ً ﺑﺣﯾث ﯾﻛون اﻟﻧﺎﺗﺞ ﻗﺎﺋﻣﺔ ﺟدﯾدة‬
‫ﺗﺣﺗوي ﻋﻠﻰ ﺟﻣﯾﻊ ﻋﻧﺎﺻر اﻟﻘﺎﺋﻣﺔ اﻷوﻟﻰ ﺛم ﻋﻧﺎﺻر اﻟﻘﺎﺋﻣﺔ اﻟﺛﺎﻧﯾﺔ‬

‫‪75‬‬
append

76
‫ﻹﯾﺟﺎد أﻛﺑر ﻗﯾﻣﺔ ﻓﻲ ﻗﺎﺋﻣﺔ ﻣﺎ‬

‫‪77‬‬
‫ﻋدد اﻟﻣرات اﻟﺗﻲ ﯾﺗﻛرر ﻓﯾﮭﺎ ظﮭور اﻟﻌﻧﺻر ‪X‬ﻓﻲ اﻟﻘﺎﺋﻣﺔ ‪L‬‬

‫‪78‬‬
‫ﯾﺣﺳب ﻋدد اﻷرﻗﺎم اﻟزوﺟﯾﺔ ‪E‬وﻋدد اﻷرﻗﺎم اﻟﻔردﯾﺔ ‪O‬اﻟﺗﻲ‬
‫ﺗظﮭر ﻓﻲ اﻟﻘﺎﺋﻣﺔ ‪L.‬‬

‫‪79‬‬
‫ﻣﺛﺎل‬
/* Take X out of list [1,2,3,4] */
takeout(A,[A|B],B).
takeout(A,[B|C],[B|D]) :- takeout(A,C,D).
?- takeout(X,[1,2,3,4],Y).
X=1 Y=[2,3,4]
X=2 Y=[1,3,4] ;
X=3 Y=[1,2,4] ;
X=4 Y=[1,2,3] ;
no 80
‫اﻟﻧﻔﻲ واﻟﻘطﻊ‬
‫اﻟﺗﺣﻛم ﻓﻲ ﻋﻣﻠﯾﺔ اﻟﺗراﺟﻊ ‪ backtracking‬اﻟﺗﻲ ﺗﻘوم ﺑﮭﺎ ﻟﻐﺔ اﻟﺑروﻟوج ﺣﯾن‬ ‫•‬
‫ﺗﺻل إﻟﻰ طرﯾﻖ ﻣﺳدود ‪.‬‬
‫اﻷھداف اﻟﻣﻧﻔﯾﺔ ‪Negated Goals‬‬ ‫•‬
‫ﻧﺳﺗطﯾﻊ أن ﻧﺷﺗرط ﻋدم ﺗﺣﻘﻖ ھدف ﻣﻌﯾن ‪ G‬ﺑﺎﺳﺗﺧدام اﻹﺟراء ‪. not‬‬ ‫•‬
‫ﻓﻣﺛﻼً ﻧﺳﺗطﯾﻊ ﺗﻌرﯾف اﻟﻌﻼﻗﺔ ‪ big‬ﻛﻣﺎ ﯾﻠﻲ‪:‬‬ ‫•‬
‫‪big(X):-not(small(X)).‬‬
‫ﺗﻘول ھذه اﻟﻘﺎﻋدة اﻧﻧﺎ ﻧﺳﺗطﯾﻊ اﺳﺗﻧﺗﺎج ) ‪ big(X‬إذا ﻟم ﻧﺗﻣﻛن ﻣن اﺛﺑﺎت‬ ‫•‬
‫)‪ ،small(X‬وھو ﻣﺎ ﯾﻌرف ﺑﺎﻟﻧﻔﻲ ﻋﻧد اﻟﻔﺷل ‪Negation as Failure.‬‬

‫‪81‬‬
‫اﻟﻧﻔﻲ واﻟﻘطﻊ‬

‫‪82‬‬
‫اﻟﻧﻔﻲ واﻟﻘطﻊ‬
‫• وﻣن اﻻﺧطﺎء اﻟﺷﺎﺋﻌﺔ ﻋﻧد اﺳﺗﺧدام اﻹﺟراء ‪ not‬أن ﯾﺳﺗﻌدى ﻋﻠﻰ ھدف ﯾﺣﺗوي‬
‫ﻋﻠﻰ ﻣﺗﻐﯾرات ﻟم ﺗﻌطﻰ ﻗﯾﻣﺔ ﺑﻌد‪.‬‬
‫• ﻣﺛﻼً ﻟو أردﻧﺎ ﺳؤال ﺑروﻟوج ھل ﯾوﺟد أي ﺷﻲء ﻛﺑﯾر‬
‫‪? big(X).‬‬
‫‪no‬‬
‫• أﺟﺎﺑت ﺑـ ‪no‬ﻷﻧﮭﺎ ﻟم ﺗﺳﺗطﻊ اﺛﺑﺎت) ‪not(small(X‬ﻷي ﻗﯾﻣﺔ ﻟـ ‪X‬‬

‫‪83‬‬
‫اﻟﻧﻔﻲ واﻟﻘطﻊ‬
‫• اﻟﺗﺣﻛم ﻓﻲ ﻋﻣﻠﯾﺔ اﻟﺗراﺟﻊ ‪Controlling Backtracking‬‬
‫• ﺑﺎﺳﺗﺧدام أداة اﻟﻘطﻊ ! ‪cut‬أن ﻧﻣﻧﻊ ﻟﻐﺔ ﺑروﻟوج ﻣن اﻟﻘﯾﺎم ﺑﻌﻣﻠﯾﺔ اﻟﺗراﺟﻊ‬
‫‪backtracking‬‬
‫• ﻣﺛﻼً ﻗد ﯾﻌﺗﻘد اﻟﻣرء أﻧﮫ ﻣن اﻟﻣﻣﻛن ﻛﺗﺎﺑﺔ اﻟﺑرﻧﺎﻣﺞ )‪max(X,Y,M‬اﻟذي ﯾﺟد أﻛﺑر‬
‫ﻗﯾﻣﺔ ‪M‬ﺑﯾن اﻟﻘﯾم ‪X‬و ‪Y‬ﻛﻣﺎ ﯾﻠﻲ‪:‬‬
‫‪max(X,Y,X):-‬‬
‫‪X>=Y.‬‬
‫‪max(X,Y,Y).‬‬
‫‪84‬‬
‫اﻟﻧﻔﻲ واﻟﻘطﻊ‬
‫• أﺣد اﻟطرق ﻟﻌﻣل ذﻟك ھﻲ ﺑﺎﺳﺗﺧدام أداة اﻟﻘطﻊ ﻓﻲ ﻧﮭﺎﯾﺔ اﻟﺟﻣﻠﺔ‬
‫اﻷوﻟﻰ ﻛﻣﺎ ﻓﻲ اﻟﺑرﻧﺎﻣﺞ اﻟﺗﺎﻟﻲ‪:‬‬
‫‪max(X,Y,X):-‬‬
‫‪X>=Y,!.‬‬
‫‪max(X,Y,Y ).‬‬
‫• اﻵن ﻟﻧﺳﺄل ﻟﻐﺔ ﺑروﻟوج اﻟﺳؤال اﻟﺗﺎﻟﻲ‪:‬‬
‫•‬

‫‪85‬‬
‫اﻟﻧﻔﻲ واﻟﻘطﻊ‬
‫• ﻻﺣظ‪ :‬أن وﺟود أداة اﻟﻘطﻊ ﻓﻲ اﻟﺟﻣﻠﺔ اﻷوﻟﻰ ﻣﻧﻊ ﻟﻐﺔ ﺑروﻟوج‬
‫ﻣن اﻟﺗراﺟﻊ واﺳﺗﺧدام اﻟﺟﻣﻠﺔ اﻟﺛﺎﻧﯾﺔ‪.‬‬
‫• ﻣﺛﺎل آﺧر ﻋﻠﻰ اﺳﺗﺧدام أداة اﻟﻘطﻊ ﻟﻧﻛﺗب ﺑرﻧﺎﻣﺟﺎ ً‬
‫) ‪add(X,L‬ﯾﺿﯾف اﻟﻌﻧﺻر ‪X‬إﻟﻰ اﻟﻘﺎﺋﻣﺔ ‪L‬ﻓﻘط إذا ﻟم ﯾﻛن‬
‫ذﻟك اﻟﻌﻧﺻر ﻣوﺟودا ﻣﺳﺑﻘﺎ ﻓﻲ ﺗﻠك اﻟﻘﺎﺋﻣﺔ‪.‬‬
‫‪add(X,L,L):-‬‬
‫‪(member(X,L),!.‬‬
‫‪add(X,L,[X|L]).‬‬
‫‪86‬‬
‫اﺟراءات داﺧﻠﯾﺔ اﺧرى ‪More built -in procedure‬‬
‫اﻷﻣر) ‪write(X :‬‬ ‫•‬
‫ﯾﺳﺗﺧدم اﻷﻣر) ‪write(X‬ﻟطﺑﺎﻋﺔ اﻟﺣد ‪X‬ﻋﻠﻰ ﺟﮭﺎز اﻹﺧراج‪ ،‬وھو ﺷﺎﺷﺔ‬ ‫•‬
‫اﻟﺣﺎﺳوب ﻋﺎدة ﻟﻛن ﻟﯾس ﺑﺎﻟﺿرورة ﻓﻣن اﻟﻣﻣﻛن اﻟﻛﺗﺎﺑﺔ ﻋﻠﻰ ﻣﻠف ﻋﻠﻰ اﻟﻘرص‬
‫اﻟﻣﻐﻧﺎطﯾﺳﻲ ‪magnetic disk‬أو ﻋﻠﻰ أي ﺟﮭﺎز إﺧراج آﺧر‪.‬‬
‫وﻗد ﯾﻛون اﻟﺣد ‪X‬ﻣﺗﻐﯾرا ً ‪ variable‬أو ﺛﺎﺑت ‪ constant‬أو ﻗﺎﺋﻣﺔ ‪ list‬أو‬ ‫•‬
‫ﺣﺗﻰ ﺗرﻛﯾب ‪structure‬‬
‫‪ write‬ﻣﮭﻣﺎ ﻛﺎﻧت‬ ‫ﻣن ﻣزاﯾﺎ ﻟﻐﺔ ﺑروﻟوج أﻧﮭﺎ ﺗﻌرف ﻛﯾف ﺗﻧﻔذ أﻣر اﻟطﺑﺎﻋﺔ‬ ‫•‬
‫طﺑﯾﻌﺔ اﻟﺣد ‪. X‬‬
‫‪87‬‬
write(X)‫اﻷﻣر‬

88
write(X)‫اﻷﻣر‬

89
‫اﻷﻣر)‪read(X‬‬
‫• ھذا اﻷﻣر ﺳﯾﺗﺳﺑب ﻓﻲ أن ﺗﻘرأ ﻟﻐﺔ ﺑروﻟوج ﻗﯾﻣﺔ ﻣن ﺟﮭﺎز اﻹدﺧﺎل‪ ،‬وﯾﺟب‬
‫أن ﺗﻧﺗﮭﻲ ھذه اﻟﻘﯾﻣﺔ ﺑﻧﻘطﺔ ﺛم ﺗﺣﺎول ﻟﻐﺔ ﺑروﻟوج ﺗوﺣﯾد )ﻣطﺎﺑﻘﺔ( ھذه‬
‫اﻟﻘﯾﻣﺔ ﻣﻊ ‪X‬‬
‫• ﻓﺈذا ﻛﺎﻧت ‪ X‬ﻣﺗﻐﯾر ﻻ ﯾﺣﻣل أي ﻗﯾﻣﺔ ﯾﻧﺗﺞ ﻋن ھذه اﻟﻌﻣﻠﯾﺔ أن ﺗﺻﺑﺢ ﻗﯾﻣﺔ‬
‫‪ X‬ھﻲ اﻟﻘﯾﻣﺔ اﻟﻣﻘروءة‪.‬‬
‫• إذا ﻛﺎﻧت ‪ X‬ﺛﺎﺑت أو ﻣﺗﻐﯾر ﯾﺣﻣل ﻗﯾﻣﺔ ﻏﯾر ﺗﻠك اﻟﻣﻘروءة ﻋﻧدھﺎ ﺳﺗﻔﺷل‬
‫ﻟﻐﺔ ﺑروﻟوج ﻓﻲ ﺗﺣﻘﯾﻖ ھدف اﻟﻘراءة وﺳوف ﺗﺗراﺟﻊ ‪ backtrack‬ﻟﮭدف‬
‫ﺳﺎﺑﻖ‪.‬‬
‫‪90‬‬
‫ﻣﺛﺎل‬

‫‪91‬‬
‫ﻣﺛﺎل ﻹﯾﺟﺎد ﻣرﺑﻊ ﻋدد‬

‫‪92‬‬
‫إﺟراءات داﺧﻠﯾﺔ أﺧرى ‪More built -in procedure‬‬

‫ھﻧﺎﻟك ﺑﻌض اﻹﺟراءات ‪ procedures‬اﻟداﺧﻠﯾﺔ ﻓﻲ ﻟﻐﺔ‬ ‫•‬


‫ﺑروﻟوج اﻟﺗﻲ ﻧﺳﺗطﯾﻊ اﺳﺗﺧداﻣﮭﺎ ﻛﻲ ﻧﻣﻛن اﻟﺑرﻧﺎﻣﺞ ﻣن زﯾﺎدة‬
‫ﺑﻌض اﻟﺟﻣل ﻟﻧﻔﺳﮫ أو ﺣذف ﺑﻌض اﻟﺟﻣل ‪.‬‬
‫ﻣن ھذه اﻹﺟراءات ‪:‬‬ ‫•‬
‫)‪assert(C‬‬ ‫•‬
‫)‪retract(C‬‬ ‫•‬
‫‪abolish‬‬ ‫•‬

‫‪93‬‬
‫اﻹﺟراء )‪assert(C‬‬

‫اﻹﺟراء )‪ assert(C‬ﯾﺳﺗﺧدم ﻹﺿﺎﻓﺔ اﻟﺟﻣﻠﺔ ‪ C‬إﻟﻰ اﻟﺑرﻧﺎﻣﺞ ﺑﺣﯾث ﺗﺻﺑﺢ‬ ‫•‬


‫اﻟﺟﻣﻠﺔ ‪ C‬ﺟﻣﻠﺔ ﻛﺑﺎﻗﻲ ﺟﻣل اﻟﺑرﻧﺎﻣﺞ ﻣن ﺣﯾث اﺳﺗﺧداﻣﮭﺎ ﻣن ﻗﺑل ﻣﺗرﺟم ﻟﻐﺔ‬
‫ﺑروﻟوج‪.‬‬
‫ﻧﺳﺗطﯾﻊ ﺗﺣدﯾد اﻟﻣﻛﺎن اﻟذي ﻧرﯾد إﺿﺎﻓﺔ اﻟﺟﻣﻠﺔ ﻟﮫ ﻓﻲ ﺑداﯾﺔ اﻟﺑرﻧﺎﻣﺞ أو ﻧﮭﺎﯾﺗﮫ‪.‬‬ ‫•‬
‫ﻹﺿﺎﻓﺔ ﺟﻣﻠﺔ إﻟﻰ ﺑداﯾﺔ اﻟﺑرﻧﺎﻣﺞ ﻧﺳﺗﺧدم ‪asserta‬‬ ‫•‬
‫ﻹﺿﺎﻓﺔ ﺟﻣﻠﺔ إﻟﻰ ﻧﮭﺎﯾﺔ اﻟﺑرﻧﺎﻣﺞ ﻧﺳﺗﺧدم ‪assertz‬‬ ‫•‬

‫‪94‬‬
‫ﻣﺛﺎل‬

‫‪95‬‬
‫اﻹﺟراء )‪retract(C‬‬
‫• اﻹﺟراء )‪ retract(C‬ﯾﻌﻣل ﻋﻣﻼ ﻣﻌﺎﻛﺳﺎ ً ﺗﻣﺎﻣﺎ ً ﻟـ ) ‪ assert(C‬إذ أﻧﮫ ﯾﺣذف‬
‫اﻟﺟﻣﻠﺔ ‪ C‬ﻣن اﻟﺑرﻧﺎﻣﺞ‬
‫• ﻣن اﻟﺟدﯾر ﺑﺎﻟذﻛر أن ) ‪ retract(C‬ﺗﺣذف أول ﺟﻣﻠﺔ ﻓﻲ اﻟﺑرﻧﺎﻣﺞ ﺗطﺎﺑﻖ ﯾﻣﻛن‬
‫ﺗوﺣﯾدھﺎ ﻣﻊ ‪. C‬‬

‫‪96‬‬
‫‪abolish‬‬
‫‪ abolish‬ﺗﺳﺗﺧدم ﻟﺣذف ﺟﻣﯾﻊ اﻟﺟﻣل اﻟﺧﺎﺻﺔ ﺑﺗﻌرﯾف اﻟﻌﻼﻗﺔ‬ ‫•‬
‫‪parent‬ﻋﻠﻰ ﺳﺑﯾل اﻟﻣﺛﺎل‬
‫ﻧﺳﺗﺧدم اﻻﺟراء ) ‪ abolish(Pred_name,N‬ﺣﯾث ﺗﻣﺛل‬ ‫•‬
‫‪ Pred_name‬اﺳم اﻟﻌﻼﻗﺔ اﻟﺗﻲ ﻧود ﺣذف ﺟﻣﯾﻊ اﻟﺟﻣل اﻟﻣﻌّ ِرﻓﺔ‬
‫ﻟﮭﺎ‪ ،‬وﺗﻣﺛل ‪N‬ﻋدد ﻋواﻣل اﻟﻌﻼﻗﺔ ﻧﻔﺳﮭﺎ‪.‬‬
‫ﻋﻠﻰ ﺳﺑﯾل اﻟﻣﺛﺎل‪:‬‬ ‫•‬
‫‪? abolish(parent,2).‬‬
‫‪yes‬‬
‫ﺗﺣذف ﻣن اﻟﺑرﻧﺎﻣﺞ ﺟﻣﯾﻊ اﻟﺟﻣل اﻟﻣﻌرﻓﺔ ﻟﻠﻌﻼﻗﺔ ‪parent‬‬ ‫•‬
‫اﻟرﻗم ‪ 2‬ﯾﻣﺛل ﻋدد ﻋواﻣل اﻟﻌﻼﻗﺔ ‪. parent‬‬ ‫•‬
‫‪97‬‬
‫أﻣر اﻟﻔﺷل ‪fail‬‬
‫• أﻣر اﻟﻔﺷل ‪ - fail‬ﺗزودﻧﺎ ﻟﻐﺔ ﺑروﻟوج ﺑﺎﻹﺟراء اﻟداﺧﻠﻲ ‪ fail‬اﻟذي ﯾﺳﺗﺧدم ﻹﺟﺑﺎر‬
‫ﻟﻐﺔ ﺑروﻟوج ﻋﻠﻰ اﻟﻔﺷل واﻟﺗراﺟﻊ ‪. backtracking‬‬
‫• ﯾﺳﺗﺧدم ﻻﺟﺑﺎر ﺑروﻟوج ﻋﻠﻰ اﯾﺟﺎد ﺟﻣﯾﻊ اﻟﺣﻠول اﻟﻣﻣﻛﻧﺔ دون اﻟﺣﺎﺟﺔ اﻟﻰ ﺗدﺧل ﻣن‬
‫اﻟﻣﺳﺗﺧدم ﺑوﺿﻊ ﻓﺎﺻﻠﺔ ﻣﻧﻘوطﺔ ﺑﻌد ﻛل ﺣل‪.‬‬
‫• ﻓﻣﺛﻼً ﻧﺳﺗطﯾﻊ أن ﻧﻛﺗب اﻟﺑرﻧﺎﻣﺞ ‪ all_parents‬اﻟذي ﯾﻛﺗب ﻟﻧﺎ اﺳم ﻛل اﻻﺑﺎء‬
‫اﻟﻣﻌرﻓﯾن ﻣن ﺧﻼل )‪parent(X,Y‬‬

‫‪98‬‬
‫ﻣﺛﺎل ﻋﻠﻰ ‪fail‬‬

‫ﻻﺣظ أن ﻟﻐﺔ ﺑروﻟوج أﻋطﺗﻧﺎ أﺳﻣﺎء ﺟﻣﯾﻊ اﻵﺑﺎء دون أن ﻧﺿﻊ ﻓﺎﺻﻠﺔ‬
‫ﻣﻧﻘوطﺔ ﺑﻌد ﻛل إﺟﺎﺑﺔ ﻹﺟﺑﺎرھﺎ ﻋﻠﻰ اﻟﺗراﺟﻊ‪.‬‬
‫‪99‬‬
‫أﻣر اﻟﻔﺷل ‪fail‬‬
‫• ھدف ‪ fail‬ﻓﻲ ﻧﮭﺎﯾﺔ اﻟﺟﻣﻠﺔ اﻷوﻟﻰ ﻟـ ‪ all_parents‬أﺟﺑﺎر ﻟﻐﺔ ﺑروﻟوج ﻋﻠﻰ‬
‫اﻟﻔﺷل واﻟﺗراﺟﻊ واﺳﺗﺧدام ﺟﻣﻠﺔ أﺧرى ﻣن ﺟﻣل ‪،parent‬‬
‫• ﺑﻌد طﺑﺎﻋﺔ اﺳم اﻷب اﻟذي ظﮭر ﻓﻲ ﺟﻣﻠﺔ ‪ parent‬اﻟﺟدﯾدة ﺗﻔﺷل ﻟﻐﺔ ﺑروﻟوج ﻣرة‬
‫أﺧرى وﺗﻌﯾد اﻟﻛرة إﻟﻰ أن ﺗﺳﺗﻧﻔذ ﺟﻣﯾﻊ ﺟﻣل ‪ parent‬اﻟﻣوﺟودة ﻓﻲ اﻟﺑرﻧﺎﻣﺞ‪.‬‬
‫• ھﻧﺎ ﯾﺄﺗﻲ دور اﻟﺟﻣﻠﺔ اﻟﺛﺎﻧﯾﺔ ﻣن ﺟﻣل ‪ all_parents‬اﻟﺗﻲ ﺗﻣﻧﻊ ﻟﻐﺔ ﺑروﻟوج ﻣن‬
‫طﺑﺎﻋﺔ ‪ no‬ﻓﻲ ﻧﮭﺎﯾﺔ اﻟﻌﻣﻠﯾﺔ‪.‬‬

‫‪100‬‬
‫أﻣر اﻹﻋﺎدة ‪repeat‬‬
‫• أﻣر اﻹﻋﺎدة ‪ - repeat‬ﺗزودﻧﺎ ﻟﻐﺔ ﺑروﻟوج ﺑﺎﻹﺟراء اﻟداﺧﻠﻲ ‪ repeat‬اﻟذي‬
‫ﯾﺳﺗﺧدم ﻟﻌﻣل دوران ﻏﯾر ﻧﮭﺎﺋﻲ ‪.‬‬
‫• ﺗﺷﻛل ‪ repeat‬ﻧﻘطﺔ ﺗﻔرع إﺿﺎﻓﯾﺔ ﻋﺎدة ﻣﺎ ﺗﺳﺗﺧدم ﻣﻊ اﻹﺟراء ‪. fail‬‬
‫• ﻓﻣﺛﻼً اﻟﺑرﻧﺎﻣﺞ اﻟﺗﺎﻟﻲ ﯾﻘرأ ﻣﺟﻣوﻋﺔ ﻣن اﻷرﻗﺎم وﯾطﺑﻊ ﻣرﺑﻌﺎﺗﮭﺎ‪ ،‬وﯾﺗوﻗف ﻓﻘط ﻋﻧد‬
‫إدﺧﺎل اﻟﻛﻠﻣﺔ ‪. stop‬‬

‫‪101‬‬
do repeat
repeat ,
read(X),
square(X). ?do
5.
fail . 25
6.
do . 36
square(stop ):- !. stop.
square(X ):- yes
Y is X * X ,
write(Y),nl.
102
‫اﻻﺻﻄﻨﺎ� واﻷﻧﻈﻤﺔ‬
‫ي‬ ‫اﻟﺬكﺎء‬
‫اﻟﺨﺒ�ة ) ‪(1484‬‬
‫ي‬
‫ف‬
‫اﻟ�ﻣﺠﺔ ي�‬
‫اﻟﻮﺣﺪة اﻟﺨﺎﻣﺴﺔ‪ :‬ب‬
‫اﻟ�وﻟ�ج‬
‫ﻟﻐﺔ ب‬
‫‪Prolog‬‬ ‫اﻋﺪاد‪ :‬أ‪.‬د‪ .‬ﻳﻮﺳﻒ اﺑﻮزر‬
‫ﺟﺎﻣﻌﺔ اﻟﻘﺪس اﻟﻤﻔﺘﻮﺣﺔ‬
‫ف‬
‫اﻟﺼ��) ‪(1193‬‬ ‫ا�‬
‫‪2020‬‬ ‫ي‬ ‫اﻟﻔﺼﻞ اﻟﺪر ي‬

You might also like