120

Íïìéêüò - cs.uoi.grcnomikos/courses/pl/Prolog-2015.pdf · ÊåöÜëáéï 1 1.1 Ëïãéêüò Ðñïãñáììáôéóìüò Ï ëïãéêüò ðñïãñáììáôéóìüò

Embed Size (px)

Citation preview

Ëïãéêüò �ñïãñáììá�éóìüòÇ ãëþóóá Prolog(Óçìåéþóåéò)×ñÞó�ïò ÍïìéêüòÉùÜííéíá 2015

2

�åñéå÷üìåíá1 51.1 Ëïãéêüò �ñïãñáììá�éóìüò . . . . . . . . . . . . . . . . . . . . . 51.2 Ç ãëþóóá Prolog . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.3 Ï äéåñìçíÝáò GNU-Prolog �çò Prolog . . . . . . . . . . . . . . 61.4 ¼ñïé êáé ÁðëÝò �ñï�Üóåéò . . . . . . . . . . . . . . . . . . . . . 71.5 �åãïíü�á . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81.6 Åñù�Þóåéò . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.7 Êáíüíåò . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.8 ÁíáäñïìÞ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.9 Óõí�áê�éêïß êáíüíåò . . . . . . . . . . . . . . . . . . . . . . . . 151.10 Ôáõ�ïðïßçóç . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151.11 Äéáäéêáóßá áðÜí�çóçò óå åñþ�çóç . . . . . . . . . . . . . . . . . 211.12 Åíóùìá�ùìÝíç áñéèìç�éêÞ . . . . . . . . . . . . . . . . . . . . . . 351.13 ×ñÞóç üñùí ãéá áíáðáñÜó�áóç áñéèìþí . . . . . . . . . . . . . 381.14 Óõíáñ�Þóåéò . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381.15 Õëïðïßçóç áñéèìç�éêþí óõíáñ�Þóåùí ìå áíáäñïìÞ . . . . . . . 431.16 Ëßó�åò . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571.17 Ç óåéñÜ �ùí ðñï�Üóåùí . . . . . . . . . . . . . . . . . . . . . . . 921.18 ÁðïêïðÞ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 941.19 Áñíçóç ùò Áðï�õ÷ßá . . . . . . . . . . . . . . . . . . . . . . . . . 1051.20 Åíóùìá�ùìÝíá Êá�çãïñÞìá�á . . . . . . . . . . . . . . . . . . . 1081.21 ×åéñéóìüò �çò âÜóçò äåäïìÝíùí . . . . . . . . . . . . . . . . . . 114

3

4

ÊåöÜëáéï 11.1 Ëïãéêüò �ñïãñáììá�éóìüòÏ ëïãéêüò ðñïãñáììá�éóìüò âáóßæå�áé ó�çí éäÝá íá ÷ñçóéìïðïéçèåß ç ìáèçìá�éêÞëïãéêÞ ùò ãëþóóá ðñïãñáììá�éóìïý. Ó�ï ëïãéêü ðñïãñáììá�éóìü, �ï ðñüãñáììáóõíßó�á�áé áðü Ýíá óýíïëï ðñï�Üóåùí ðïõ ðåñéãñÜöïõí �ï ðñüâëçìá ðïõ èÝëïõìåíá åðéëýóïõìå. Ç õëïðïßçóç �çò ãëþóóáò åßíáé ó�çí ïõóßá Ýíá áðïäåéê�éêü óý-ó�çìá, ó�ï ïðïßï äßíïõìå ðñï�Üóåéò �éò ïðïßåò áõ�ü áðïäåéêíýåé áðü �éò ðñï�Üóåéòðïõ óõíéó�ïýí �ï ðñüãñáììá.1.2 Ç ãëþóóá PrologÇ �ëþóóá Prolog åßíáé ç ðñþ�ç ÷ñïíïëïãéêÜ êáé ðéï äéáäåäïìÝíç ãëþóóá ëïãéêïýðñïãñáììá�éóìïý. Áíáð�ý÷èçêå ó�éò áñ÷Ýò �çò äåêáå�ßáò �ïõ 1970. Ó�çñß÷èçêåêõñßùò ó�ç äïõëåéÜ �ïõ Robert Kowalski êáé õëïðïéÞèçêå áðü �ïí Alain Colmer-auer. Ôï üíïìÜ �çò áðï�åëåß óõí�ïìïãñáößá �ïõ PROgramming in LOGi .¸íá ðñüãñáììá Prolog áðï�åëåß�áé áðü ðñï�Üóåéò �çò ðñù�ïâÜèìéáò ëïãéêÞò ïéïðïßåò Ý÷ïõí ìßá åéäéêÞ ìïñöÞ (ðñï�Üóåéò Horn). ÅðéðëÝïí, ç Prolog äéáèÝ�åé ðñï-êáèïñéóìÝíá êá�çãïñÞìá�á, ðïõ õðïó�çñßæïõí ÷áñáê�çñéó�éêÜ äåõ�åñïâÜèìéáò ëï-ãéêÞ, üðùò åðßóçò êáé áñéèìç�éêïýò �åëåó�Ýò.�éá íá ðå�ý÷ïõìå �ï åðéèõìç�ü áðï�Ýëåóìá êÜíïõìå ó�ç Prolog ìßá åñþ�çóç, çïðïßá áðï�åëåß�áé áðü �ç óýæåõîç Ýíïò ðëÞèïõò á�ïìéêþí ðñï�Üóåùí êáé åíäÝ÷å-�áé íá ðåñéÝ÷åé ìå�áâëç�Ýò. Ç Prolog ðñïóðáèåß íá áðïäåßîåé �çí ðñü�áóç áðü �éòðñï�Üóåéò ðïõ áðï�åëïýí �ï ðñüãñáììá, êáé ìáò åðéó�ñÝöåé �éò óõíèÞêåò êÜ�ù áðü�éò ïðïßåò ç ðñü�áóÞ ó�çí åñþ�çóç áðï�åëåß ëïãéêÞ óõíÝðåéá �ïõ ðñïãñÜììá�ïò,ïé ïðïßåò åêöñÜæïí�áé ùò ðåñéïñéóìïß ó�éò �éìÝò �ùí ìå�áâëç�þí.Ó�ç óõíÝ÷åéá èá ÷ñçóéìïðïéÞóïõìå �ç ãëþóóá Prolog ãéá íá êÜíïõìå ìßá åéóá-ãùãÞ ó�éò Ýííïéåò �ïõ ëïãéêïý ðñïãñáììá�éóìïý.Ï óêïðüò áõ�þí �ùí óçìåéþóåùí äåí åßíáé óå êáììßá ðåñßð�ùóç �ï íá ðåñéãñá-öåß ðëÞñùò ç ãëþóóá Prolog. Èá äïýìå ðùò ïñßæïí�áé êá�çãïñÞìá�á ðÜíù óåóõìâïëéêÜ áí�éêåßìåíá. Åðßóçò èá äïýìå ðþò ìðïñïýìå íá ïñßóïõìå áñéèìç�éêÝò5

óõíáñ�Þóåéò êáé íá ÷åéñéó�ïýìå ëßó�åò. ÔÝëïò èá åîå�Üóïõìå �çí Üñíçóç ùò áðï-�õ÷ßá ðïõ ÷ñçóéìïðïéåß ç Prolog, �ïí Ýëåã÷ï �çò ïðéóèïäñüìçóçò êáé �ï ðþò çåê�Ýëåóç åíüò ðñïãñÜììá�ïò ìðïñåß íá �ñïðïðïéåß �ï ßäéï �ï ðñüãñáììá. Áí�ßèå�áèá ðáñáëåßøïõìå �çí ðåñéãñáöÞ èåìÜ�ùí ðïõ áöïñïýí åßóïäï-Ýîïäï ãéá äçìéïõñãßáäéáäñáó�éêþí åöáñìïãþí êáèþò êáé �çí ðáñïõóßáóç ðïëëþí ðñïêáèïñéóìÝíùí êá-�çãïñçìÜ�ùí.Ó�çí Prolog ìðïñïýìå íá öïñ�þóïõìå �áõ�ü÷ñïíá ðïëëÜ äéáöïñå�éêÜ ðñïãñÜì-ìá�á (óýíïëá ðñï�Üóåùí). Ó�ç óõíÝ÷åéá áí ó�ïí ïñéóìü åíüò êá�çãïñÞìá�ïò÷ñçóéìïðïéïýìå Ýíá êá�çãüñçìá ðïõ Ý÷ïõìå ïñßóåé ðñïçãïõìÝíùò, èá õðïèÝ�ïõìåü�é êáé ïé äýï ïñéóìïß ðåñéÝ÷ïí�áé ó�ï ßäéï áñ÷åßï.1.3 Ï äéåñìçíÝáò GNU-Prolog �çò Prolog�éá íá åê�åëåó�åß ï äéåñìçíÝáò GNU-Prolog óå óýó�çìá Unix ãñÜöïõìå ó�ï �åñ-ìá�éêü prolog êáé ðá�Üìå <ENTER>. Ï äéåñìçíÝáò åìöáíßæåé �çí prompt| ?-Óå áõ�Þ �ç öÜóç ï äéåñìçíÝáò ìðïñåß íá ìáò áðáí�Þóåé óå åñù�Þóåéò ðïõ ðåñéëáìâÜ-íïõí ðñïêáèïñéóìÝíá êá�çãïñÞìá�á êáé �åëåó�Ýò �çò Prolog. Ï äéåñìçíÝáò èá ìáòáðáí�Þóåé yes Þ no Þ, áí ç åñþ�çóÞ ìáò ðåñéÝ÷åé ìå�áâëç�Ýò, èá ìáò åðéó�ñÝøåé �éò�éìÝò �ùí ìå�áâëç�þí ãéá �éò ïðïßåò ç ðñü�áóç ó�çí åñþ�çóç áëçèåýåé (èá ðñÝðåéìå�Ü �çí ïëïêëÞñùóç �çò åñþ�çóçò íá âÜëïõìå �åëåßá êáé íá ðá�Þóïõìå <ENTER>):| ?- 1+1 =:= 2.yes| ?- f(a,X) = f(Y,b).X = bY = aÁí ãñÜøïõìå ìßá åñþ�çóç ðïõ ðåñéÝ÷åé Üëëá êá�çãïñÞìá�á ï äéåñìçíÝáò áðëÜ èáåðéó�ñÝøåé Ýíá ìÞíõìá �çò ìïñöÞòun aught ex eption: error(existen e_error(pro edure,p/2),top_level/0)(óçìåéþíå�áé ü�é óå Üëëåò åêäüóåéò �çò Prolog óå áíÜëïãç ðåñßð�ùóç ç áðÜí�çóç åß-íáé no.) Ìðïñïýìå íá öïñ�þóïõìå Ýíá áñ÷åßï ðñïãñÜììá�ïò ð.÷. �ï example.pro,�ï ïðïßï âñßóêå�áé ó�ïí êá�Üëïãï áðü �ïí ïðïßï åêêéíÞóáìå �ç GNU-Prolog ãñÜ-öïí�áò:| ?- onsult('example.pro').Ôï onsult åßíáé ðñïêáèïñéóìÝíï êá�çãüñçìá �çò Prolog (áõ�ü óçìáßíåé ü�é ìðïñåßíá ðåñéÝ÷å�áé êáé óå ðñïãñÜììá�á Prolog). Áí �ï áñ÷åßï õðÜñ÷åé ó�ïí êá�Üëïãïáðü �ïí ïðïßï åê�åëÝóáìå �çí åí�ïëç prolog êáé åßíáé óõí�áê�éêÜ ïñèü, �ü�å ïäéåñìçíÝáò èá ìáò äþóåé ìßá áðÜí�çóç ðáñüìïéá ìå �çí ðáñáêÜ�ù:6

example.pro ompiled, 2 lines read - 353 bytes written, 98 msyesÇ áðÜí�çóç áõ�Þ ìáò ëÝåé ü�é �ï áñ÷åßï example.pro öïñ�þèçêå êáé ìáò åíç-ìåñþíåé ãéá �ï ìÝãåèïò �ïõ óå ÷áñáê�Þñåò êáé �ï ÷ñüíï ðïõ ÷ñåéÜó�çêå ãéá �çíåðåîåñãáóßá �ïõ. Áöü�ïõ öïñ�þóïõìå �ï ðñüãñáììá ï äéåñìçíÝáò ìðïñåß íá ìáòáðáí�Þóåé óå åñù�Þóåéò ðïõ ðåñéÝ÷ïõí êá�çãïñÞìá�á �á ïðïßá ïñßæïí�áé óå áõ�ü.Ôï onsult('example.pro') ìðïñåß ðéï óýí�ïìá íá ãñáö�åß ['example.pro'℄.Áí �ï áñ÷åßï example.pro âñßóêå�áé óå äéáöïñå�éêü êá�Üëïãï áðü áõ�üí áðü �ïíïðïßï åê�åëÝóáìå �çí åí�ïëÞ prolog, �ü�å èá ðñÝðåé íá ãñÜøïõìå �ï ðëÞñåò ìïíï-ðÜ�é ùò üñéóìá �ïõ onsult. Áí �ï ðñüãñáììá äåí åßíáé óõí�áê�éêÜ ïñèü, �ü�ååìöáíßæå�áé Ýíá ìçíõìá ðïõ ìáò åíçìåñþíåé ãéá �ï óõí�áê�éêü ëÜèïò. Áí �ï áñ÷åßïexample.pro äåí õðÜñ÷åé �ü�å åìöáíßæå�áé Ýíá ìÞíõìá ðáñüìïéï ìå �ï ðáñáêÜ�ù:un aught ex eption: error(existen e_error(sour e_sink,'example.pro'), onsult/1)Ïé ðñï�Üóåéò ðïõ áðï�åëïýí �ï ðñüãñáììá �ï ïðïßï ðåñéÝ÷å�áé ó�ï áñ÷åßï ðïõöïñ�þíå�áé ìå �ï onsult áðïèçêåýïí�áé ó�ç âÜóç äåäïìÝíùí �çò Prolog, ïðïßá÷ñçóéìïðïéåß�áé ãéá íá áðáí�çèïýí ïé åñù�Þóåéò ðïõ êÜíïõìå ó�ï äéåñìçíÝá. Ç âÜóçäåäïìÝíùí ü�áí îåêéíÜåé ï äéåñìçíÝáò åßíáé êåíÞ. ÊÜèå öïñÜ ðïõ ÷ñçóéìïðïéïýìå�ï onsult ãéá íá öïñ�þóïõìå Ýíá áñ÷åßï, äéáãñÜöïí�áé áðü �ç âÜóç äåäïìÝíùíüëåò ïé ðñï�Üóåéò ðïõ ïñßæïõí êÜðïéï êá�çãüñçìá p ìå n ïñßóìá�á, ãéá �ï ïðïßïõðÜñ÷åé ïñéóìüò ãéá ßäéï ðëÞèïò ïñéóìÜ�ùí ó�ï áñ÷åßï ðïõ ðñüêåé�áé íá öïñ�ùèåß,áíåîÜñ�ç�á áðü �ï ðþò åß÷áí åéóá÷åß ó�ç âÜóç äåäïìÝíùí. Ùó�üóï, ïé õðüëïéðåòðñï�Üóåéò ðáñáìÝíïõí ó�ç âÜóç äåäïìÝíùí.Ôïíßæå�áé ü�é �ï onsult �çò GNU-Prolog ëåé�ïõñãåß üðùò �ï êá�çãüñçìáre onsult óå Üëëåò åêäüóåéò �çò Prolog, ó�éò ïðïßåò �ï onsult öïñ�þíåé �ïíÝï áñ÷åßï ÷ùñßò íá äéáãñÜøåé ðñï�Üóåéò áðü �ç âÜóç äåäïìÝíùí.Ç åê�Ýëåóç �çò GNU-Prolog �åñìá�ßæå�áé ãñÜöïí�áò halt Þ ðá�þí�áò CTRL-D.1.4 ¼ñïé êáé ÁðëÝò �ñï�Üóåéò¸íá ðñüãñáììá Prolog áðï�åëåß�áé áðü Ýíá óýíïëï ðñï�Üóåùí (ãåãïíü�ùí êáéêáíüíùí) êáé �ï åðéèõìç�ü áðï�Ýëåóìá õðïëïãßæå�áé äßíïí�áò ó�o äéåñìçíÝá �çòProlog ìßá åñþ�çóç.ÂáóéêÞ äïìéêÞ ìïíÜäá ãéá �ï ó÷çìá�éóìü �ùí ãåãïíü�ùí, �ùí êáíüíùí êáé �ùíåñù�Þóåùí åßíáé ç á�ïìéêÞ ðñü�áóç, ç ïðïßá ó÷çìá�ßæå�áé áðü Ýíá êá�çãüñçìá �ïïðïßï ðáßñíåé ùò ïñßóìá�á Ýíá ðëÞèïò üñùí. Ôá ïñßóìá�á åíüò êá�çãïñÞìá�ïòäßíïí�áé ìÝóá óå ðáñÝíèåóç, ÷ùñéóìÝíá ìå êüììá. ¸íá êá�çãüñçìá ìå Ýíá üñé-óìá áðïäßäåé ìßá éäéü�ç�á ó�ïí üñï ðïõ äÝ÷å�áé ùò üñéóìá. ¸íá êá�çãüñçìá ìåðåñéóóü�åñá ïñßóìá�á ðåñéãñÜöåé ìßá ó÷Ýóç áíÜìåóá ó�ïõò üñïõò ðïõ äÝ÷å�áé ùòïñßóìá�á. 7

�éá ðáñÜäåéãìá ó�çí á�ïìéêÞ ðñü�áóç born('Robert De Niro', date(17,aug,1943))�ï êá�çãüñçìá åßíáé �ï born êáé �á ïñßóìá�á åßíáé ïé üñïé 'Robert De Niro' êáédate(17,aug,1943).Ïé üñïé ðáñéó�Üíïõí áí�éêåßìåíá �ïõ êüóìïõ ðïõ èÝëïõìå íá ðåñéãñÜøïõìå ìå �ïðñüãñáììá. Ïé üñïé ìðïñåß íá åßíáé áðëïß Þ óýíèå�ïé. Ïé áðëïß üñïé åßíáé ó�áèåñÝòÞ ìå�áâëç�Ýò. Ïé ó�áèåñÝò åßíáé åß�å Ü�ïìá åß�å áñéèìïß. Ïé óýíèå�ïé üñïé ó÷çìá-�ßæïí�áé áðü Ýíá óõíáñ�çóéáêü óýìâïëï �ï ïðïßá äÝ÷å�áé ùò ïñßóìá�á Ýíá ðëÞèïòüñùí (ìÝóá óå ðáñåíèÝóåéò êáé ÷ùñéóìÝíá ìå êüììá). �áñáäåßãìá�á üñùí:• áñéèìïß: 1968, -12, 3.14• Ü�ïìá: aug, 'Robert De Niro'• ìå�áâëç�Ýò: ×, Variable, _1• óýíèå�ïé üñïé: date(17,aug,1943)), point(2.0,3.4), s(s(s(0)))(ïé êáíüíåò óýí�áîçò ãéá �á Ü�ïìá �á óõíáñ�çóéáêÜ óýìâïëá êáé �á êá�çãïñÞìá�áèá äïèïýí ðáñáêÜ�ù).1.5 �åãïíü�á¸íá ãåãïíüò åßíáé ìßá á�ïìéêÞ ðñü�áóç ç ïðïßá áëçèåýåé ÷ùñßò êáìßá ðñïûðüèåóç.�áñÜäåéãìá 1: Ôá ðáñáêÜ�ù åßíáé ãåãïíü�á ðïõ ìðïñåß íá ðåñéÝ÷ïí�áé óå Ýíáðñüãñáììá PROLOG:lp('Chet Baker','My Funny Valentine',1954).lp('Billie Holiday','Lady Sings the Blues',1956).lp('Van Morrison','Astral Weeks',1968).lp('Leonard Cohen','Songs From a Room',1969).lp('The Rolling Stones','Sti ky Fingers',1971).lp('Tom Waits','Closing Time',1973).lp('Pink Floyd','The Dark Side of the Moon',1973).lp('The Jam','Sound Affe ts',1980).lp('Tuxedomoon','Desire',1981).lp('The Beautiful South','Quen h',1998).lp('Tom Waits','Ali e',2002).Ôï ðñþ�ï ãåãïíüò äçëþíåé ü�é ï Chet Baker êõêëïöüñçóå �ï Üëìðïõì My FunnyValentine �ï 1954. Áí�ßó�ïé÷á åñìçíåýïí�áé êáé �á õðüëïéðá ãåãïíü�á. Ôï êá-�çãüñçìá lp óõó÷å�ßæåé �ñßá äéáöïñå�éêÜ áí�éêåßìåíá: Ýíáí êáëëé�Ý÷ç, �ïí �ß�ëïåíüò Üëìðïõì êáé Ýíáí áñéèìü ðïõ ðáñéó�Üíåé ìßá ÷ñïíïëïãßá.Ç Prolog äåí áðáé�åß íá äçëþíïõìå �ï ðëÞèïò êáé �ïí �ýðï �ùí ïñéóìÜ�ùí åíüòêá�çãïñÞìá�ïò. Óå üëá �á ðáñáðÜíù ãåãïíü�á, �á äýï ðñþ�á ïñßóìá�á �ïõ lp8

åßíáé óõìâïëéêïß áðëïß üñïé (Ü�ïìá) åíþ �ï �ñß�ï åßíáé áñéèìüò. Áõ�ü ùó�üóï äåíåßíáé äåóìåõ�éêü. �éá ðáñÜäåéãìá èá ìðïñïýóáìå íá ãñÜøïõìå ó�ï ðñüãñáììá �ïãåãïíüò lp(2,2). ÷ùñßò íá õðÜñ÷åé óõí�áê�éêü ëÜèïò.Ìðïñïýìå íá åðåê�åßíïõìå �ï ðñüãñáììá ìå ãåãïíü�á ðïõ ðåñéÝ÷ïõí ðëçñïöïñßåòãéá �á �ñáãïýäéá �ïõ êÜèå Üëìðïõì:tra k('Lady Sings the Blues',4,'Love Me or Leave Me',duration(2,54)).tra k('Astral Weeks',2,'Beside You',duration(5,16)).tra k('Sti ky Fingers',3,'Wild Horses',duration(5,44)).tra k('Quen h',5,'Perfe t Ten',duration(3,38)).tra k('Ali e',1,'Ali e',duration(4,28)).Ôï ðñþ�ï ãåãïíüò ãéá ðáñÜäåéãìá äçëþíåé ü�é ó�ï áëìðïõì Lady Sings the Blues�ï 4ï �ñáãïýäé åßíáé �ï Love Me or Leave Me ìå äéÜñêåéá 2 ëåð�Ü êáé 54 äåõ�å-ñüëåð�á. ×ñçóéìïðïéïýìå Ýíáí óýíèå�ï üñï ãéá íá êá�áãñÜøïõìå �ç äéÜñêåéá �ïõ�ñáãïõäéïý. .1.6 Åñù�ÞóåéòÌßá åñþ�çóç áðï�åëåß�áé áðü �ç ìßá Þ ðåñéóóü�åñåò á�ïìéêÝò ðñï�Üóåéò, ÷ùñéóìÝíåòìå êüììá. ¼�áí ãñÜøïõìå ìßá åñþ�çóç ó�üí äéåñìçíÝá �çò Prolog, áõ�üò åîå�Ü-æåé áí ç óýæåõîç �ùí ðñï�Üóåùí ðïõ �çí áðï�åëïýí ðñïêýð�åé áðü �ï ðñüãñáììá,äçëáäÞ áí åßíáé ëïãéêÞ óõíÝðåéá �ùí ðñï�Üóåùí ðïõ áðï�åëïõí �ï ðñüãñáììá.Áí ç åñþ�çóç äåí ðåñéÝ÷åé ìå�áâëç�Ýò �ü�å ç Prolog áðáí�Üåé åß�å yes åß�å no.�áñÜäåéãìá 2: Ìðïñïýìå áöïý öïñ�þóïõìå �ï ðñüãñáììá ðïõ ðåñéÝ÷åé �ïí ïñé-óìü �ùí êá�çãïñçìÜ�ùí lp êáé tra k �ïõ ðñïçãïýìåíïõ ðáñáäåßãìá�ïò íá êÜ-íïõìå �éò ðáñáêÜ�ù åñù�Þóåéò:?- lp('The Rolling Stones','Sti ky Fingers',1971).yes?- lp('Tom Waits','Ali e',1973).no?- lp('The Rolling Stones','Aftermath',1966).no?- lp('Tom Waits','Ali e',1973),lp('Tuxedomoon','Desire',1981).no?- member('Paul Weller', 'Jam').noÓ�çí ðñþ�ç åñþ�çóç ç áðÜí�çóç åßíáé yes, êáèþò ç ðñü�áóç ðïõ �çí áðï�åëåß õðÜñ-÷åé ìÝóá ó�ï ðñüãñáììá. 9

Ó�çí äåý�åñç åñþ�çóç ç áðÜí�çóç åßíáé no, êáèþò ç ðñü�áóç ðïõ �çí áðï�åëåßäåí õðÜñ÷åé ìÝóá ó�ï ðñüãñáììá ïý�å ìðïñåß íá ðñïêýøåé ëïãéêÜ áðü áõ�ü. Ó�ïðñüãñáììá åßíáé êá�á÷ùñçìÝíï �ï áëìðïõì Ali e �ïõ Tom Waits áëëá ç ÷ñïíïëï-ãßá êõêëïöïñßáò äåí åßíáé �ï 1973, üðùò åðßóçò êáé Ýíá Üëìðïõì �ïõ Tom Waitsìå ÷ñïíïëïãßá êõêëïöïñßáò �ï 1973 ðïõ ùó�üóï äåí ëÝãå�áé Ali e.Ó�çí �ñß�ç åñþ�çóç ç áðÜí�çóç åßíáé åðßóçò no: ïé Rolling Stones êõêëïöüñç-óáí ðñÜãìá�é �ï Üëìðïõì Aftermath �ï 1966, áëëÜ áõ�ü äåí õðÜñ÷åé ùò ãåãïíüòó�ï ðñüãñáììá. Ç Prolog ãíùñßæåé �ïí ðñáãìá�éêü êüóìï ìüíï ìÝóù �ùí ðñï�Ü-óåùí �ïõ ðñïãñÜììá�ïò.Ó�çí �Ý�áñ�ç åñþ�çóç ç áðÜí�çóç åßíáé no, åðåéäÞ ìüíï ìßá áðü �éò äýï ðñï�Ü-óåéò ðïõ áðï�åëïýí �çí åñþ�çóç ðñïêýð�åé áðü �ï ðñüãñáììá.Ó�çí ðÝìð�ç åñþ�çóç ç áðÜí�çóç åßíáé ðñïöáíþò no. �áñá�çñïýìå ü�é ç Prologäåí åíï÷ëåß�áé áðü �ï ãåãïíüò ü�é �ï êá�çãüñçìá member äåí Ý÷åé ïñéó�åß ðïõèåíÜìÝóá ó�ï ðñüãñáììá. .Áí ç åñþ�çóç ðåñéÝ÷åé ìå�áâëç�Ýò, �ü�å ç Prolog ðñïóðáèåß íá âñåß êá�Üëëçëåòäåóìåýóåéò ãéá �éò ìå�áâëç�Ýò, êÜ�ù áðü �éò ïðïßåò ç óýæåõîç �ùí ðñï�Üóåùí ðïõáðï�åëïýí �çí åñþ�çóç áðï�åëåß ëïãéêÞ óõíÝðåéá �ïõ ðñïãñÜììá�ïò.Áí åðé�ý÷åé, �ü�å �õðþíåé �éò �éìÝò �ùí ìå�áâëç�þí ðïõ õðïëüãéóå êáé áíáìÝíåéáðü �ï ÷ñÞó�ç íá êáèïñßóåé �é åðéèõìåß íá ãßíåé ó�ç óõíÝ÷åéá:• áí o ÷ñÞó�çò ðëçê�ñïëïãÞóåé ; ç Prolog óõíå÷ßæåé, ðñïóðáèþí�áò íá âñåßÜëëç áðÜí�çóç (Üëëåò �éìÝò ãéá �éò ìå�áâëç�Ýò)• áí o ÷ñÞó�çò ðëçê�ñïëïãÞóåé . ç Prolog áðáí�Üåé yes êáé ó�áìá�Üåé (ðåñéìÝ-íåé íÝá åñþ�çóç).Áí ç Prolog áðï�ý÷åé íá âñåé ëýóç (åß�å áñ÷éêÜ åß�å ìå�Ü áðü ;) áðáí�Üåé no.Ìðïñïýìå íá ÷ñçóéìïðïéÞóïõìå �çí áíþíõìç ìå�áâëç�Þ áí êÜðïéåò áðü �éò �é-ìÝò äåí ìáò åíäéáöÝñïõí. Ç áíþíõìç ìå�áâëç�Þ åßíáé ç _ êáé Ý÷åé �éò ðáñáêÜ�ùéäéü�ç�åò• äåí åðéó�ñÝöåé �éìÝò• äéáöïñå�éêÝò åìöáíßóåéò �çò ó�ïí ßäéï êáíüíá Þ åñþ�çóç åßíáé áóõó÷Ý�éó�åò,ìðïñïýí äçëáäÞ íá ðÜñïõí äéáöïñå�éêÝò �éìÝò.�áñÜäåéãìá 2 (óõíÝ÷åéá): �éá íá ìÜèïõìå �ç ÷ñïíïëïãßá êõêëïöïñßáò �ïõ Üë-ìðïõì Sti ky Fingers �ùí Rolling Stones ãñÜöïõìå:?- lp('The Rolling Stones','Sti ky Fingers',Y).Y = 1971 10

�éá íá ìÜèïõìå áí ïé Rolling Stones êõêëïöüñçóáí êÜðïéï Üëìðïõì �ï 1952 ãñÜ-öïõìå:?- lp('The Rolling Stones',X,1952).no�éá íá äïýìå üëá �á (êá�á÷ùñçìÝíá) áëìðïõì �ïõ Tom Waits ãñÜöïõìå:?- lp('Tom Waits',X,Y).X = 'Closing Time'Y = 1973 ;X = 'Ali e'Y = 2002 ;no(Ìå�Ü áðü êÜèå áðÜí�çóç ãñÜöïõìå ; þó�å ç Prolog íá óõíå÷ßóåé ìå �çí áíáæÞ-�çóç Üëëùí áðáí�Þóåùí). �áñá�çñïýìå ü�é ç Prolog åðéó�ñÝöåé �éò áðáí�Þóåéò ìåßäéá óåéñÜ ðïõ åìöáíßæïí�áé ìÝóá ó�ï ðñüãñáììá.�éá íá ìÜèïõìå áí õðÜñ÷åé Üëìðïõì ðïõ ðåñéÝ÷åé ïìþíõìï �ñáãïýäé ãñÜöïõìå:?- tra k(X,N,X,D).X = 'Ali e'N = 1D = duration(4,28)Ç ÷ñÞóç �çò ßäéáò ìå�áâëç�Þò ùò ðñþ�ï êáé �ñß�ï üñéóìá, áíáãêÜæåé áõ�Ü �á ïñß-óìá�á íá Ý÷ïõí �çí ßäéá �éìÞ.Ó�çí ðáñáðÜíù åñþ�çóç ðáßñíïõìå �éìÝò ãéá üëåò �éò ìå�áâëç�Ýò ðïõ åìöáíßæïí�áé.Ìðïñïýìå íá ÷ñçóéìïðïéÞóïõìå �çí áíþíõìç ìå�áâëç�Þ þó�å íá ìçí åìöáíéó�ïýí�éìÝò ðïõ ìáò åßíáé áäéÜöïñåò:?- tra k(X,_,X,_).X = 'Ali e'�éá íá ìÜèïõìå ðïéïò �ñáãïýäçóå �ï Love Me or Leave Me ãñÜöïõìå:?- tra k(L,_,'Love Me or Leave Me',_), lp(X,L,_).L = 'Lady Sings the Blues'X = 'Billie Holiday'ÅðåéäÞ ç ìå�áâëç�Þ L óõíäÝåé �éò äýï ðñï�Üóåéò äåí ìðïñåß íá áí�éêá�áó�áèåß áðü�çí áíþíõìç ìå�áâëç�Þ . 11

1.7 ÊáíüíåòÏé êáíüíåò åßíáé óýíèå�åò ðñï�Üóåéò ïé ïðïßåò äçëþíïõí ü�é ìßá á�ïìéêÞ ðñü�áóç(ç êåöáëÞ �ïõ êáíüíá) åßíáé áëçèÞò áí Ýíá ðëÞèïò á�ïìéêþí ðñï�Üóåùí (ïé ïðïßåòáðï�åëïýí �ï óþìá �ïõ êáíüíá) åßíáé üëåò áëçèåßò.Ïé êáíüíåò ÷ñçóéìïðïéïýí�áé ãéá íá ïñßóïõìå íÝá êá�çãïñÞìá�á ìå âÜóç �á ÞäçõðÜñ÷ïí�á, üðùò åðßóçò êáé ãéá íá ïñßóïõìå êá�çãïñÞìá�á ìå áíáäñïìÞ. ¸íá êá-�çãüñçìá ìðïñåß íá ïñßæå�áé áðü ðåñéóóü�åñïõò �ïõ åíüò êáíüíåò Þ áêüìç êáé áðüóõíäõáóìü êáíüíùí êáé ãåãïíü�ùí.�áñÜäåéãìá 3: Áò õðïèÝóïõìå ü�é �á êá�çãïñÞìá�á parent(X,Y) (ï/ç X åßíáéãïíÝáò �ïõ/�çò Y), male(X) (ï X åßíáé Üí�ñáò) êáé female(X) (ç X åßíáé ãõíáßêá)Ý÷ïõí ïñéó�åß ìå Ýíá óýíïëï ãåãïíü�ùí.Ôï êá�çãüñçìá father(X,Y) (ï X åßíáé ðá�Ýñáò �ïõ/�çò Y) ìðïñåß íá ïñéó�åß áðü�ïí ðáñáêÜ�ù êáíüíá:father(X,Y) :- parent(X,Y), male(X).Ï êáíüíáò ëÝåé ü�é ï X åßíáé ðá�Ýñáò �ïõ/�çò Y áí óõí�ñÝ÷ïõí äýï ðñïûðïèÝóåéò:(á) o X åßíáé ãïíÝáò �ïõ/�çò Y êáé (â) ï X åßíáé áí�ñáò.Ôá êá�çãïñÞìá�á grandfather(X,Y) (ï X åßíáé ðáððïýò �ïõ/�çò Y) ìðïñåß íáïñéó�åß áðü �ïí ðáñáêÜ�ù êáíüíá:grandfather(X,Y) :- father(X,Z), parent(Z,Y).Ï êáíüíáò ëÝåé ü�é ï X åßíáé ðáððïýò �ïõ/�çò Y áí ï X åßíáé ðá�Ýñáò êÜðïéïõ ãïíÝá�ïõ Õ (ï ïðïßïò åßíáé ï Z ó�ï óþìá �ïõ êáíüíá).Ôï êá�çãüñçìá brother(X,Y) (ï X åßíáé áäåñöüò �ïõ/�çò Y) ïñßæå�áé áðü �ïíðáñáêÜ�ù êáíüíá:brother(X,Y) :- parent(Z,X),parent(Z,Y),male(X),X \== Y.Ï X åßíáé áäåñöüò �ïõ/�çò Y áí ï X åßíáé Üí�ñáò êáé ïé X, Y Ý÷ïõí êÜðïéïí êïéíüãïíÝá. Ôï X \== Y åîáóöáëßæåé ü�é ïé ìå�áâëç�Ýò X êáé Y äåí èá Ý÷ïõí ßäéá �éìÞ,þó�å êáíåßò íá ìçí åßíáé áäåñöüò �ïõ åáõ�ïý �ïõ.Ôï êá�çãüñçìá person(X) (ï X åßíáé êÜðïéï öõóéêü ðñüóùðï) ìðïñåß íá ïñéó�åß÷ñçóéìïðïéþí�áò äýï êáíüíåò:person(X) :- male(X).person(X) :- female(X). 12

Áò õðïèÝóïõìå ü�é ó�ï ðñüãñáììá ðåñéÝ÷ïí�áé åðßóçò �á ðáñáêÜ�ù ãåãïíü�á:parent(tantalos,pelopas).parent(dioni,pelopas).parent(dioni,niovi).parent(tantalos,niovi).parent(pelopas,atreas).male(tantalos).male(pelopas).male(atreas).female(dioni).female(niovi).�ü�å ìðïñïýìå íá Ý÷ïõìå �ïí ðáñáêÜ�ù äéÜëïãï ìå �ï äéåñìçíÝá �çò Prolog:?- father(tantalos,pelopas).yes?- father(tantalos,X).X = pelopas ;X = niovi ;no?- father(dioni,X).no?- brother(pelopas,niovi).yes?- brother(niovi,pelopas).no1.8 ÁíáäñïìÞÓ�çí Prolog ïíïìÜæïõìå áíáäñïìÞ �ç åìöÜíéóç �ïõ ßäéïõ êá�çãïñÞìá�ïò (ìå �ïßäéï ðëÞèïò ïñéóìÜ�ùí) �üóï ó�çí êåöáëÞ üóï êáé ó�ï óþìá åíüò êáíüíá. Ç÷ñÞóç áíáäñïìÞò åßíáé áðáñáß�ç�ç þó�å íá õëïðïéÞóïõìå óå Prolog õðïëïãéóìïýòðïõ áðáé�ïýí åðáíÜëçøç.�áñÜäåéãìá 4: ¸ó�ù ü�é èÝëïõìå íá ïñßóïõìå �ï êá�çãüñçìá prede essor(X,Y)(ï X åßíáé ðñüãïíïò �ïõ Y). Ç ðñü�áóç prede essor(X,Y) áëçèåýåé áí ï X êáé ïY óõíäÝïí�áé ó�ï ãåíåáëïãéêü äÝí�ñï ðïõ ïñßæåé �ï êá�çãüñçìá parent ìå ÝíáìïíïðÜ�é ðåðåñáóìÝíïõ ìÞêïõò.Áò õðïèÝóïõìå ðñþ�á ü�é ðñïóðáèïýìå íá ïñßóïõìå �ï prede essor ìÝóù êá-íüíùí ðïõ äåí ÷ñçóéìïðïéïýí áíáäñïìÞ.13

�éá ðáñÜäåéãìá, Ýó�ù ü�é ãñÜöïõìå ó�ï ðñüãñáììá �ïõò ðáñáêÜ�ù êáíüíåò:prede essor(X,Y) :- parent(X,Y).prede essor(X,Y) :- parent(X,Z),parent(Z,Y).prede essor(X,Y) :- parent(X,Z),parent(Z,W),parent(W,Y).Áí �ï parent ïñßæå�áé áðü �á ãåãïíü�á �ïõ ðñïçãïýìåíïõ ðáñáäåßãìá�ïò, �ü�å ïéðáñáðÜíù êïíüíåò åßíáé åðáñêåßò. Áõ�ü üìùò ïöåßëå�áé ó�ï ü�é �ï ìÝãéó�ï ìïíïðÜ�éó�ï ãåíåáëïãéêü äÝí�ñï ðïõ ðåñéãñÜöåé �ï parent åßíáé 2. Áí ðñïóèÝóïõìå �áãåãïíü�áparent(atreas,menelaos).parent(menelaos,nikostratos).�ü�å ç Prolog ó�çí åñþ�çóç?- prede essor(tantalos,nikostratos).èá áðáí�Þóåé no. Áõ�ü ïöåßëå�áé ó�ï ü�é ïé ÔÜí�áëïò êáé Íéêüó�ñá�ïò äéáöÝñïõí4 ãåíéÝò.Èá ìðïñïýóáìå íá åðåê�åßíïõìå �ïí ïñéóìü �ïõ prede essor ðñïóèÝ�ïí�áò êáéÜëëïõò êáíüíåò. Ùó�üóï ðÜí�ï�å èá õðÞñ÷å Ýíá óýíïëï ãåãïíü�ùí ç ðñüóèåóç�ùí ïðïßùí ó�ï ðñüãñáììá, èá êáèéó�ïýóå �ïí ïñéóìü �ïõ prede essor åëëéðÞ.Ç óùó�Þ ðñïóÝããéóç åßíáé íá ïñßóïõìå �ï prede essor áíáäñïìéêÜ ó�çñéæüìå-íïé ó�çí ðáñáêÜ�ù ðáñá�Þñçóç: Ï X åßíáé ðñïãïíïò �ïõ Y ìå äéáöïñÜ 1 ãåíéÜ, áíï X åßíáé ãïíÝáò �ïõ Y. Åðßóçò, ï X åßíáé ðñïãïíïò �ïõ Y ìå äéáöïñÜ n+1 ãåíéÝò,áí ï X åßíáé ãïíÝáò êÜðïéïõ Z, ï ïðïßïò åßíáé ðñüãïíïò �ïõ Y ìå äéáöïñÜ n ãåíéÝò.Ó�ïí ðáñáêÜ�ù ïñéóìü ðáñáëåßðå�áé �ï ðëÞèïò �ùí ãåíåþí:prede essor(X,Y) :- parent(X,Y).prede essor(X,Y) :- parent(X,Z),prede essor(Z,Y).Åíáëëáê�éêÜ èá ìðïñïýóáìå íá ÷ñçóéìïðïéÞóïõìå áíáäñïìÞ áñéó�åñÜ ó�ï óþìá�ïõ êáíüíá:prede essor1(X,Y) :- parent(X,Y).prede essor1(X,Y) :- prede essor1(X,Z),parent(Z,Y).Åðßóçò ìðïñåß íá ÷ñçóéìïðïéçèåß äéðëÞ áíáäñïìÞ:prede essor2(X,Y) :- parent(X,Y).prede essor2(X,Y) :- prede essor2(X,Z),prede essor2(Z,Y).. 14

1.9 Óõí�áê�éêïß êáíüíåòÏé ìå�áâëç�Ýò ó�çí Prolog åßíáé áêïëïõèßåò ÷áñáê�Þñùí ðïõ ó÷çìá�ßæïí�áé áðüãñÜììá�á �ïõ ëá�éíéêïý áëöáâÞ�ïõ, øçößá êáé �ï ÷áñáê�Þñá _ (÷áñáê�Þñáò õðï-ãñÜììéóçò), ïé ïðïßåò áñ÷ßæïõí ìå êåöáëáßï ãñÜììá Þ _.Ôá Ü�ïìá, �á êá�çãïñÞìá�á êáé �á óõíáñ�çóéáêÜ óýìâïëá åðé�ñÝðå�áé íá Ý÷ïõíìßá áðü �éò ðáñáêÜ�ù ìïñöÝò:• áêïëïõèßåò ÷áñáê�Þñùí ðïõ ó÷çìá�ßæïí�áé áðü ãñÜììá�á �ïõ ëá�éíéêïý áë-öáâÞ�ïõ, øçößá êáé �ï ÷áñáê�Þñá _, ïé ïðïßåò áñ÷ßæïõí ìå ìéêñü ãñÜììá.• áêïëïõèßá åéäéêþí ÷áñáê�Þñùí ðïõ åßíáé ïé ðáñáêÜ�ù:+ - * / < > = : . & _ ~• ïðïéáäÞðï�å áêïëïõèßá ÷áñáê�Þñùí êëåéóìÝíç ìÝóá óå åéóáãùãéêÜ.¸íá êá�çãüñçìá Þ Ýíá óõíáñ�çóéêü óýìâïëï áêïëïõèåß�áé áðü �á ïñßóìá�Ü �ïõêëåéóìÝíá óå ðáñåíèÝóåéò êáé ÷ùñéóìÝíá ìå êüììá. Ç áñéó�åñÞ ðáñÝíèåóç èá ðñÝ-ðåé íá ãñÜöå�áé áìÝóùò ìå�Ü �ï êá�çãüñçìá Þ �ï óõíáñ�çóéêü óýìâïëï, ÷ùñßò íáðáñåìâÜëå�áé êåíü.Ó�ï �Ýëïò êÜèå ãåãïíü�ïò, êáíüíá Þ åñþ�çóçò ðñÝðåé íá õðÜñ÷åé �åëåßá.Ó�ç Prolog ìðïñïýìå íá ãñÜøïõìå ó÷üëéá êëåßíïí�Üò �á áíÜìåóá ó�á óýìâïëá/* êáé */. Åíáëëáê�éêÜ �á ó÷üëéá ìðïñïýí íá îåêéíÞóïõí ìå �ï óýìâïëï %. Óåáõ�Þ �çí ðåñßð�ùóç åê�åßíïí�áé ìÝ÷ñé �ï �Ýëïò �çò ãñáììÞò.1.10 Ôáõ�ïðïßçóçÔï åðéèõìç�ü áðï�Ýëåóìá ó�çí Prolog åðé�õã÷Üíå�áé äßíïí�áò ó�ï äéåñìçíÝá ìßáåñþ�çóç ç ïðïßá áðï�åëåß�áé ìßá ðñü�áóç �çí ïðïßá ç Prolog ðñïóðáèåß íá áðïäåß-îåé ìå âÜóç �ï ðñüãñáììá (Þ áêñéâÝó�åñá ìå âÜóç �éò ðñï�Üóåéò ðïõ Ý÷åé öïñ�þóåéó�ç âÜóç äåäïìÝíùí �çò). Ó�ç óõíÝ÷åéá èá äïýìå �ï ìç÷áíéóìü �ïí ïðïßï ç Prolog÷ñçóéìïðïéåß ãéá íá áðáí�Þóåé óå ìßá åñþ�çóç. Ó�ï ìç÷áíéóìü áõ�ü ðïëý óçìá-í�éêÞ åßíáé ç Ýííïéá �çò �áõ�ïðïßçóçò.Ìßá éóü�ç�á �çò ìïñöÞò V = t, üðïõ V åßíáé ìå�áâëç�Þ êáé t åßíáé üñïò ïíï-ìÜæå�áé äÝóìåõóç �çò ìå�áâëç�Þò V .Èá ÷ñçóéìïðïéïýìå �ï üñï Ýêöñáóç ãéá êÜ�é ðïõ åßíáé åß�å üñïò åß�å á�ïìéêÞ ðñü-�áóç.Äýï åêöñÜóåéò ïíïìÜæïí�áé �áõ�ïðïéÞóéìåò áí ìðïñïýí íá ãßíïõí ßäéåò ìå åíäå-÷üìåíç áí�éêá�Üó�áóç êÜðïéùí áðü �éò ìå�áâëç�Ýò ðïõ åìöáíßæïí�áé óå áõ�Ýò, ìåâÜóç Ýíá óýíïëï äåóìåýóåùí. Ôï óýíïëï �ùí äåóìåýóåùí ðïõ �áõ�ïðïéåß äýï åê-öñÜóåéò ïíïìÜæå�áé �áõ�ïðïéç�Þò. 15

Ç áí�éêá�Üó�áóç �ùí ìå�áâëç�þí åßíáé ïìïéüìïñöç êáé �áõ�ü÷ñïíç. Ïìïéüìïñöçóçìáßíåé ü�é õðÜñ÷åé ìßá ìüíï äÝóìåõóç ãéá êÜèå ìå�áâëç�Þ êáé üëåò ïé åìöáíßóåéò�çò ìå�áâëç�Þò êáé ó�éò äýï åêöñÜóåéò áí�éêáèßó�áí�áé áðü �ïí ßäéï üñï. Ôáõ�ü-÷ñïíç óçìáßíåé ü�é ïé áí�éêá�áó�Üóåéò äåí ãßíïí�áé ç ìßá ìå�Ü �çí Üëëç ìå êÜðïéááõèáßñå�ç óåéñÜ ÜëëÜ üëåò ìáæß, Ý�óé þó�å áí êÜðïéïò áðü �ïõò íÝïõò üñïõò ðå-ñéÝ÷åé êÜðïéá ìå�áâëç�Þ áðï áõ�Ýò ðïõ áí�éêá�áó�Üèçêáí, ïé åìöáíßóåéò �çò ðïõðñïÞëèáí áðü �çí åéóáãùãÞ áõ�ïý �ïõ üñïõ íá ìçí åðçñåáó�ïýí.�áñÜäåéãìá 5:• Ïé åêöñÜóåéò south êáé north äåí åßíáé �áõ�ïðïéÞóéìåò, êáèþò äåí åßíáé ßäéåòïý�å ðåñéÝ÷ïõí ìå�áâëç�Ýò ðïõ èá ìðïñïýóáí íá áí�éêá�áó�áèïýí þó�å íáãßíïõí ßäéåò.• Ïé åêöñÜóåéò west êáé west åßíáé �áõ�ïðïéÞóéìåò, êáèþò åßíáé ßäéåò.• Ïé åêöñÜóåéò X êáé 123 åßíáé �áõ�ïðïéÞóéìåò, êáèþò ìðïñïýí íá ãßíïõí ßäéåòáí ç ìå�áâëç�Þ X áí�éêá�áó�áèåß áðü �ï üñï 123.• Ïé åêöñÜóåéò X êáé Y åßíáé �áõ�ïðïéÞóéìåò, êáèþò ìðïñïýí íá ãßíïõí ßäéåò áíïé ìå�áâëç�Ýò X êáé Y áí�éêá�áó�áèïýí áðü �ïí ßäéï üñï.• Ïé åêöñÜóåéò date(D,may,1995) êáé date(1,M,Y) åßíáé �áõ�ïðïéÞóéìåò, áðü�ï óýíïëï äåóìåýóåùí {D = 1, M = may, Y = 1995}, ìå âÜóç �ï ïðïßï ãßíïí�áéêáé ïé äýï date(1,may,1995).• Ïé åêöñÜóåéò time(8,45) êáé point(X,Y) äåí åßíáé �áõ�ïðïéÞóéìåò: üðïéááí�éêá�Üó�áóç ìå�áâëç�þí êáé íá ãßíåé ç ðñþ�ç èá îåêéíÜåé ìå time êáé çäåý�åñç ìå point.• Ïé åêöñÜóåéò ve tor(X,Y,Z) êáé ve tor(A,B) äåí åßíáé �áõ�ïðïéÞóéìåò:üðïéá áí�éêá�Üó�áóç ìå�áâëç�þí êáé íá ãßíåé �ï ve tor ó�ç ðñþ�ç èá Ý÷åé�ñßá ïñßóìá�á êáé ó�ç äåý�åñç äýï.• Ïé åêöñÜóåéò date(X,12,1930) êáé date(4,X,Y) äåí åßíáé �áõ�ïðïéÞóéìåò:ãéá íá ãßíïõí ßäéá �á ðñþ�á ïñßóìá�á �ïõ date ç ìå�áâëç�Þ X èá ðñÝðåé íááí�éêá�áó�áèåß áðü �ï 4. Ùó�üóï óå áõ�Þ �çí ðåñßð�ùóç äåí èá åßíáé ßäéá �áäåý�åñá ïñßóìá�á �ïõ date.• Ïé åêöñÜóåéò f(Y) êáé f(f(X)) åßíáé �áõ�ïðïéÞóéìåò, áðü �ï óýíïëï äåóìåý-óåùí {Y = f(Z), X = Z}, ìå âÜóç �ï ïðïßï ãßíïí�áé êáé ïé äýï f(f(Z)).• Ïé åêöñÜóåéò f(X) êáé f(f(X)) äåí åßíáé �áõ�ïðïéÞóéìåò: áí ç X áí�éêá�á-ó�áèåß ìå Ýíáí üñï ìÞêïõò n ÷áñáê�Þñùí ç Ýêöñáóç ðïõ èá ðñïêýøåé áðü�çí ðñþ�ç ìå�Ü �çí áí�éêá�Üó�áóç èá Ý÷åé ìÞêïò n + 3, åíþ áõ�Þ ðïõ èáðñïêýøåé áðü �ç äåý�åñç èá Ý÷åé ìÞêïò n+ 6.16

.Äýï åêöñÜóåéò ìðïñåß íá Ý÷ïõí ðåñéóóü�åñïõò áðü Ýíáí �áõ�ïðïéç�Ýò.�áñÜäåéãìá 6: Ïé åêöñÜóåéò date(15,M,X) êáé date(D,9,Y) Ý÷ïõí �ïõò ðá-ñáêÜ�ù �áõ�ïðïéç�Ýò:• {D = 15, M = 9, X = Y}• {D = 15, M = 9, X = W, Y = W}• {D = 15, M = 9, X = 1900, Y = 1900}Áðü �ïõò ðáñáðÜíù �áõ�ïðïéç�Ýò, ï �ñß�ïò öáßíå�áé íá äåóìåýåé �éò ìå�áâëç�Ýò X,êáé Y ðåñéóóü�åñï áðü üóï ÷ñåéÜæå�áé þó�å íá åðé�åõ÷èåß ç �áõ�ïðïßçóç. Áí�ßèå�áäåí óõìâáßíåé �ï ßäéï ìå �ïõò äýï ðñþ�ïõò �áõ�ïðïéç�Ýò, ïé ïðïßïé êÜíïõí �çí åëÜ-÷éó�ç äõíá�Þ äÝóìåõóç ðïõ áðáé�åß�áé þó�å ïé åêöñÜóåéò íá ãßíïõí ßäéåò. ÔÝ�ïéïõåßäïõò �áõ�ïðïéç�Ýò ïíïìÜæïí�áé ðéï ãåíéêïß �áõ�ïðïéç�Ýò. .�éï áõó�çñÜ Ýíáò �áõ�ïðïéç�Þò θ �ùí åêöñÜóåùí E1 êáé E2 ïíïìÜæå�áé ðéï ãå-íéêüò �áõ�ïðïéç�Þò áí ç Ýêöñáóç ðïõ ðñïêýð�åé áðü �éò E1 êáé E2 ìå åöáñìïãÞ�ïõ ïðïéïóäÞðï�å �áõ�ïðïéç�Þ γ, ìðïñåß íá ðñïêýøåé ìå ðåñáé�Ýñù áí�éêá�Üó�áóçìå�áâëç�þí ó�çí Ýêöñáóç ðïõ ðñïêýð�åé áðü �éò E1 êáé E2 ìå åöáñìïãÞ �ïõ θ.Ó÷çìá�éêÜ:

E1 E2

θ

γ E

E′

θ

γ

Ç Prolog ÷ñçóéìïðïéåß åê�åíþò �çí �áõ�ïðïßçóç ó�ç äéáäéêáóßá áðÜí�çóçò ìßáòåñþ�çóçò. Åðßóçò äéáèÝ�åé �ïí �åëÝó�Þ = ï ïðïßïò ðñáãìá�ïðïéåß �áõ�ïðïßçóç äýïåêöñÜóåùí:?- date(D,may,1995) = date(1,M,Y).D = 1M = mayY = 1995?- time(8,45) = point(X,Y).no�ñéí ðåñéãñÜøïõìå �ï áëãüñéèìï �áõ�ïðïßçóçò äýï åêöñÜóåùí ðïõ ÷ñçóéìïðïéåß-�áé áðü �çí Prolog, èá åîçãÞóïõìå �ç ÷ñçóéìü�ç�á �çò �áõ�ïðïßçóçò ìå �ç âïÞèåéá17

åíüò ðáñáäåßãìá�ïò.�áñÜäåéãìá 7: ¸ó�ù ï ðáñáêÜ�ù êáíüíáò: ompetition('World Cup',Y) :-member(Y, [1930,1934,1938,1950,1954,1958,1962,1970,1974,1978,1982,1986,1990,1994,1998,2002,2006,2010℄).êáé ç åñþ�çóç?- ompetition(X,2010).Ôï êá�çãüñçìá ompetition óõó÷å�ßæåé ìßá áèëç�éêÞ äéïñãÜíùóç ìå �á Ý�ç äéå-îáãùãÞò �çò.Áò åîå�Üóïõìå �ï êá�Ü ðüóï ï ðáñáðÜíù êáíüíáò ìðïñåß íá ÷ñçóéìåýóåé ó�ïíá áðáí�çèåß ç åñþ�çóç. Ï êáíüíáò áöïñÜ ìßá óõãêåêñéìÝíç äéïñãÜíùóç (�ï'World Cup') êáé åðéâÜëëåé ìßá óõíèÞêç ó�ç ìå�áâëç�Þ Y, Ý�óé þó�å ç �éìÞ �çòíá áðï�åëåß ÷ñïíéÜ äéåîáãùãÞò �çò äéïñãÜíùóçò. Áðü �çí Üëëç ç åñþ�çóç äåíáíáöÝñå�áé óå óõãêåêñéìÝíç äéïñãÜíùóç, áëëÜ áíáæç�Ü ìßá äéïñãÜíùóç × ðïõ íáäéåîÜîå�áé �ï 2010. Ï êáíüíáò èá ìðïñïýóå åéäéêü�åñá íá åöáñìïó�åß ãéá �çí ðåñß-ð�ùóç üðïõ �ï Y åß÷å �çí �éìÞ 2010. Áðü �çí Üëëç ìßá áðÜí�çóç ðïõ èá áöïñïýóå�ç äéïñãÜíùóç 'World Cup' åßíáé óõíáöÞò ìå �çí åñþ�çóç. Ìå Üëëá ëüãéá �ïó�éãìéü�õðï �ïõ êáíüíá ðïõ ðñïêýð�åé èÝ�ïí�áò Y = 2010 ìðïñåß íá äþóåé áðÜ-í�çóç ó�ï ó�éãìéü�õðï �çò åñþ�çóçò ðïõ ðñïêýð�åé èÝ�ïí�áò × = 'World Cup'.�áñá�çñïýìå ü�é ç áí�éêá�Üó�áóç {Y= 2010, ×= 'World Cup'} åßíáé ï ðéï ãåíéêüò�áõ�ïðïéç�Þò �çò ðñü�áóçò ó�çí åñþ�çóç êáé �çò êåöáëÞò �ïõ êáíüíá. Óõíåðþò çäéáäéêáóßá �çò �áõ�ïðïßçóçò ìáò âïçèÜåé íá óõìðåñÜíïõìå áí Ýíáò êáíüíáò ìðïñåßíá ÷ñçóéìåýóåé ó�ï íá áðáí�Þóïõìå ìßá åñþ�çóç êáé õðü ðïéåò ðñïûðïèÝóåéò (ãéáðïéÝò �éìÝò �ùí ìå�áâëç�þí ðïõ åìöáíßæïí�áé ó�ïí êáíüíá êáé ó�çí åñþ�çóç). .Ç Prolog âñßóêåé Ýíáí ðéï ãåíéêü �áõ�ïðïéç�Þ äýï åêöñÜóåùí, ìå �ïí ðáñáêÜ�ùáëãüñéèìï �áõ�ïðïßçóçò:Ï áëãüñéèìïò äÝ÷å�áé ùò åßóïäï äýï åêöñÜóåéò E1 êáé E2, ïé ïðïßåò ðåñéÝ÷ïõí�éò ìå�áâëç�Ýò V1, . . . , Vk, üðïõ k ≥ 0. Êá�Ü �ç äéÜñêåéá �çò åê�ÝëåóÞò �ïõ, äéá-�çñåß �ï óýíïëï ìå �éò �ñÝ÷ïõóåò äåóìåýóåéò ãéá üëåò �éò ðáñáðÜíù ìå�áâëç�Ýò.�éá ïìïéïìïñößá, ðáñéó�Üíïõìå �çí Ýëëåéøç äÝóìåõóçò ãéá ìßá ìå�áâëç�Þ Vi þò ìßáäÝóìåõóç �çò ìïñöÞò Vi = Vi.Áñ÷éêÜ üëåò ïé ìå�áâëç�Ýò åßíáé áäÝóìåõ�åò, óõíåðþò �ï óýíïëï äåóìåýóåùí åßíáé{V1 = V1, . . . , Vk = Vk}.Ìå�Ü áðü �çí áñ÷éêïðïßçóç �ïõ óõíüëïõ �ùí äåóìåýóåùí, ï áëãüñéèìïò åê�å-ëåß Ýíá ðëÞèïò áðü âÞìá�á, óå êáèÝíá áðü �á ïðïßá åß�å áí�éêáèéó�Ü ìßá ìå�áâëç�Þ18

ìå Ýíáí üñï Þ �åñìá�ßæåé åðéó�ñÝöïí�áò �ï áðï�Ýëåóìá. �éï óõãêåêñéìÝíá óå êÜèåâÞìá ãßíïí�áé �á ðáñáêÜ�ù:• ¸ó�ù ü�é ó�ç áñ÷Þ �ïõ âÞìá�ïò �ï óýíïëï �ùí äåóìåýóåùí åßíáé {V1 =

b1, . . . , Vk = bk}.• Åîå�Üæïí�áé ïé åêöñÜóåéò E1 êáé E2 áðü áñéó�åñÜ ðñïò �á äåîéÜ ìÝ÷ñé íáâñåèåß �ï ðñþ�ï óçìåßï ó�ï ïðïßï äéáöÝñïõí óõí�áê�éêÜ.• Áí ïé åêöñÜóåéò äåí äéáöÝñïõí óå êáíÝíá óçìåßï �ü�å åßíáé ßäéåò êáé åðéó�ñÝ-öå�áé ç ëßó�á ìå �éò �ñÝ÷ïõóåò äåóìåýóåéò, ç ïðïßá áðï�åëåß Ýíáí ðéï ãåíéêü�áõ�ïðïéç�Þ.• Áëëéþò áí ó�ï óçìåßï äéáöïñïðïßçóçò îåêéíïýí äýï üñïé t1 êáé t2 �ü�å{ Áí ï t2 åßíáé ìßá ìå�áâëç�Þ �ü�å áõ�Þ áí�éêáèßó�á�áé ìå t1 ó�éò åêöñÜóåéò

E1 êáé E2 êáé ó�ïõò üñïõò b1, . . . , bk.{ Áëëéþò, áí ï t1 åßíáé ìßá ìå�áâëç�Þ áõ�Þ áí�éêáèßó�á�áé ìå t2 ó�éò åê-öñÜóåéò E1 êáé E2 êáé êáé ó�ïõò üñïõò b1, . . . , bk.{ Áëëéþò (áí êáíÝíáò üñïò äåí åßíáé ìå�áâëç�Þ) åðéó�ñÝöå�áé áðï�õ÷ßá.• Áëëéþò (áí ó�ï óÞìåßï ðïõ äéáöÝñïõí ïé åêöñÜóåéò äåí îåêéíïýí äýï üñïé)åðéó�ñÝöå�áé áðï�õ÷ßá.�áñÜäåéãìá 8: ¸ó�ù ïé åêöñÜóåéò E1 = p(X,Y,Z) êáé E2 = p(f(Y),3,X). Çåê�Ýëåóç �ïõ áëãüñéèìïõ �áõ�ïðïßçóçò ìå åßóïäï áõ�Ýò �éò åêöñÜóåéò öáßíå�áé ðá-ñáêÜ�ù, üðïõ äßíå�áé ç �ñÝ÷ïõóá ìïñöÞ �ùí åêöñÜóåùí êáé ïé �ñÝ÷ïõóåò äåóìåýóåéòó�çí áñ÷Þ �çò åê�Ýëåóçò êáèå âÞìá�ïò. Ïé üñïé ðïõ îåêéíïýí ó�ï áñéó�åñü�åñïóçìåßï ó�ï ïðïßï äéáöÝñïõí ïé åêöñÜóåéò åìöáíßæïí�áé ìÝóá óå ðëáßóéï.âÞìá E1 E2 äåóìåýóåéò1 p( X ,Y,Z) p( f(Y) ,3,X) {X = X, Y = Y, Z = Z}2 p(f(Y), Y ,Z) p(f(Y), 3 ,f(Y)) {X = f(Y), Y = Y, Z = Z}3 p(f(3),3, Z ) p(f(3),3, f(3) ) {X = f(3), Y = 3, Z = Z}4 p(f(3),3,f(3)) p(f(3),3,f(3)) {X = f(3), Y = 3, Z = f(3)}Ó�ç áñ÷Þ �ïõ �Ý�áñ�ïõ âÞìá�ïò ïé �ñÝ÷ïõóåò ìïñöÝò �ùí äýï åêöñÜóåùí åßíáé ßóåò.Óõíåðþò �ï �ñÝ÷ïí óýíïëï äåóìåýóåùí {X = f(3), Y = 3, Z = f(3)} áðï�åëåß Ýíáíðéü ãåíéêü �áõ�ïðïéç�Þ �ùí áñ÷éêþí åêöñÜóåùí p(X,Y,Z) êáé p(f(Y),3,X). .�áñÜäåéãìá 9: �áñáêÜ�ù öáßíå�áé ç åê�Ýëåóç �ïõ áëãüñéèìïõ �áõ�ïðïßçóçò ãéá�éò åêöñÜóåéò E1 = p(X,1,Y) êáé E2 = p(a,Y,X).âÞìá E1 E2 äåóìåýóåéò

1 p( X ,1,Y) p( a ,Y,X) {X = X, Y = Y}2 p(a, 1 ,Y) p(a, Y ,a) {X = a, Y = Y}3 p(a,1, 1 ) p(a,1, a ) {X = a, Y = 1}19

Ó�ç áñ÷Þ �ïõ �ñß�ïõ âÞìá�ïò ïé �ñÝ÷ïõóåò ìïñöÝò �ùí äýï åêöñÜóåùí äéáöÝñïõíóå Ýíá óçìåßï ó�ï ïðïßï îåêéíïýí äýï üñïé êáíÝíáò áðü �ïõò ïðïßïõò äåí åßíáéìå�áâëç�Þ. Óõíåðþò ïé áñ÷éêÝò åêöñÜóåéò p(X,1,Y) êáé p(a,Y,X) äåí åßíáé �áõ-�ïðïéÞóéìåò. .�áñÜäåéãìá 10: �áñáêÜ�ù öáßíå�áé ç åê�Ýëåóç �ïõ áëãüñéèìïõ �áõ�ïðïßçóçòãéá �éò åêöñÜóåéò E1 = q(Z,4) êáé E2 = q(f(W)).âÞìá E1 E2 äåóìåýóåéò1 q( Z ,4) q( f(W) ) {Z = Z, W = W}2 q(f(W) , 4) q(f(W) ) {Z = f(W), W = W}Ó�ç áñ÷Þ �ïõ äåý�åñïõ âÞìá�ïò ïé �ñÝ÷ïõóåò ìïñöÝò �ùí äýï åêöñÜóåùí äéáöÝ-ñïõí óå Ýíá óçìåßï ó�ï ïðïßï äåí îåêéíïýí äýï üñïé. Óõíåðþò ïé áñ÷éêÝò åêöñÜóåéòq(Z,4) êáé q(f(W)) äåí åßíáé �áõ�ïðïéÞóéìåò. .�áñÜäåéãìá 11: �áñáêÜ�ù öáßíå�áé ç åê�Ýëåóç �ïõ áëãüñéèìïõ �áõ�ïðïßçóçòãéá �éò åêöñÜóåéò E1 = f(X) êáé E2 = f(f(X)).âÞìá E1 E2 äåóìåýóåéò

1 f( X ) f( f(X) ) {X = X}2 f(f( X )) f(f( f(X) )) {X = f(X)}3 f(f(f( X ))) f(f(f( f(X) ))) {X = f(f(X))}4 f(f(f(f( X )))) f(f(f(f( f(X) )))) {X = f(f(f(X)))}5 f(f(f(f(f( X ))))) f(f(f(f(f( f(X) ))))) {X = f(f(f(f(X))))}. . . . . . . . . . . .�áñü�é, üðùò åßäáìå ó�ï ðáñÜäåéãìá 5, ïé äýï åêöñÜóåéò äåí åßíáé �áõ�ïðïéÞóéìåò,ï áëãüñéèìïò èá åê�åëÝóåé Üðåéñá âÞìá�á, ðñïóðáèþí�áò íá �éò �áõ�ïðïéÞóåé êáéäåí èá åðéó�ñÝøåé áðÜí�çóç. .Ôï ðáñáðÜíù ðáñÜäåéãìá äåß÷íåé ü�é ï áëãüñéèìïò �áõ�ïðïßçóçò äåí ëåé�ïõñãåßóùó�Ü ãéá üëåò �éò åêöñÜóåéò.Ç ïñèü�ç�á �ïõ áëãïñßèìïõ èá ìðïñïýóå íá åîáóöáëéó�åß ìßá áðëÞ �ñïðïðïßçóç:ü�áí ðñüêåé�áé íá ãßíåé áí�éêá�Üó�áóç �çò ìå�áâëç�Þò V áðü �ïí üñï t, èá ðñÝðåéíá ãßíåé Ýëåã÷ïò ãéá �ï áí ç V åìöáíßæå�áé ó�ïí t. Áí êÜ�é �Ý�ïéï éó÷ýåé (üðùòó�ï ðáñÜäåéãìá 11) ï áëãüñéèìïò èá ðñÝðåé íá ìçí êÜíåé áí�éêá�Üó�áóç áëëÜ íáåðéó�ñÝöåé Üìåóá áñíç�éêÞ áðÜí�çóç.Ç Prolog óêüðéìá áðïöåýãåé �ïí ðáñáðÜíù Ýëåã÷ï åìöÜíéóçò åðåéäÞ áõ�üò åðé-âáñýíåé �ï óõíïëéêü ÷ñüíï ðïõ áðáé�åß�áé ãéá íá áðáí�çèåß ìßá åñþ�çóç, êáèþò ü�éï áëãüñéèìïò �áõ�ïðïßçóçò åê�åëåß�áé ðÜñá ðïëý óõ÷íÜ. Èá ðñÝðåé íá óçìåéùèåßü�é �ï ðáñáðÜíù óåíÜñéï äåí åìöáíßæå�áé óõ÷íÜ ó�á ðñïãñÜììá�á êáé ç áðïöõãÞ�ïõ åðáößå�áé ó�ïí ðñïãñáììá�éó�Þ. 20

Óå ðïëëÝò õëïðïéÞóåéò �çò Prolog ç Ýëëåéøç äÝóìåõóçò ãéá ìßá ìå�áâëç�Þ èåùñåß-�áé éóïäýíáìç ùò äÝóìåõóç óå ìßá íÝá ìå�áâëç�Þ ðïõ äåí ÷ñçóéìïðïéåß�áé ðïõèåíÜáëëïý (�ï ïðïßï äåí åðéâÜëëåé êáíÝíáí ðåñéïñéóìü ó�çí �éìÞ �çò ìå�áâëç�Þò). Áõ�üåîçãåß �ï ðáñáêÜ�ù áðï�Ýëåóìá ó�çí õëïðïßçóç C-Prolog:?- f(A,B,C) = X.A = _0B = _1C = _2X = f(_0,_1,_2)1.11 Äéáäéêáóßá áðÜí�çóçò óå åñþ�çóç¸÷ïí�áò ðåñéãñÜøåé �çí Ýííïéá �çò �áõ�ïðïßçóçò ìðïñïýìå íá ðåñéãñÜøïõìå �ïìç÷áíéóìü ìå �ïí ïðïßï ç Prolog áðáí�Üåé ó�éò åñù�Þóåéò. ÎåêéíÜìå ìå ïñéóìÝíááðëÜ ðáñáäåßãìá�á, ó�á ïðïßá ðáñïõóéÜæïí�áé �á âáóéêÜ ó�ïé÷åßá �ïõ ìç÷áíéóìïý.�áñÜäåéãìá 12: Ó�ï ðáñÜäåéãìá 7 åßäáìå ü�é ï êáíüíáò ìå êåöáëÞ ompetition('World Cup',Y)ìðïñåß íá ÷ñçóéìïðïéçèåß ãéá íá áðáí�çèåß ç åñþ�çóç?- ompetition(×,2010).�éá íá êá�áëÞîïõìå ó�ï óõìðÝñáóìá áõ�ü ÷ñåéÜó�çêå íá �áõ�ïðïéÞóïõìå �éò äýïåêöñÜóåéò. Ï ðéï ãåíéêüò �áõ�ïðïéç�Þò �ïõò åßíáé {X = 'World Cup', Y = 2010}.Áò õðïèÝóïõìå �þñá ü�é ó�çí åñþ�çóç ÷ñçóéìïðïéïýìå �ç ìå�áâëç�Þ Y áí�ß �çòX. Ôü�å ç ðñïóðÜèåéá �áõ�ïðïßçóçò �ùí åêöñÜóåùí ompetition(Y,2010) êáé ompetition('World Cup',Y) èá áðï�ý÷åé! Áõ�ü äåí åßíáé åðéèõìç�ü áðï�Ýëåóìáãéá äýï ëüãïõò: ðñþ�ïí ç ÷ñÞóç äéáöïñå�éêÞò ìå�áâëç�Þò ó�çí åñþ�çóç äåí äéá-öïñïðïéåß �çí åñþ�çóç êáé äåý�åñïí ç ÷ñÞóç �çò ßäéáò ìå�áâëç�Þò ó�çí åñþ�çóçêáé ó�ïí êáíüíá åßíáé óõìð�ùìá�éêÞ. .Ç Prolog ãéá íá áðïöýãåé �Ý�ïéïõ åßäïõò óåíÜñéá, ðñéí åê�åëÝóåé �ïí áëãüñéèìï�áõ�ïðïßçóçò, ìå�ïíïìÜæåé üëåò �éò ìå�áâëç�Ýò �ïõ êáíüíá, ÷ñçóéìïðïéþí�áò íÝáïíüìá�á ðïõ äåí åìöáíßæïí�áé ó�çí åñþ�çóç ïý�å Ý÷ïõí ÷ñçóéìïðïéçèåß ðñïçãïõ-ìÝíùò áðü �ç äéáäéêáóßá áðÜí�çóçò �çò åñþ�çóçò. Ôá íÝá ïíüìá�á äçìéïõñãïýí�áéáõ�üìá�á áðü ìßá äéáäéêáóßá ðïõ åîáñ�Ü�áé áðü �çí õëïðïßçóç.Ó�ï ðëáßóéï �ùí óçìåéþóåùí ü�áí áðáé�åß�áé íá ìå�ïíïìáó�ïýí ïé ìå�áâëç�Ýò åíüòêáíüíá, èá ÷ñçóéìïðïéïýìå Ýíá üíïìá �ï ïðïßï ðñïêýð�åé áðü �ï áñ÷éêü üíïìá �çòìå�áâëç�Þò ó�ïí êáíüíá ìå ðñïóèÞêç áñéèìç�éêþí øçößùí ó�ï �Ýëïò �ïõ. Ôïíß-æå�áé ü�é áõ�Þ ç ðñïóÝããéóç õéïèå�åß�áé ãéá ëüãïõò áíáãíùóéìü�ç�áò êáé äåí åßíáéáðáñáß�ç�á ç ßäéá ðïõ áêïëïõèåß�áé ó�éò õëïðïéÞóåéò.21

Ç Prolog ãéá íá áðáí�Þóåé ìßá åñþ�çóç ó�çí ïðïßá êáëåß�áé íá áðïäåßîåé ìßáðñü�áóç-ó�ü÷ï, ðñïóðáèåß íá äçìéïõñãÞóåé ìßá áêïëïõèßá áðü ó�ü÷ïõò, áí�éêá-èéó�þí�áò Þ äéáãñÜöïí�áò êÜèå öïñÜ �çí ðñþ�ç ðñü�áóç ó�ïí �ñÝ÷ïí�á ó�ü÷ï.Ó�ç äéÜñêåéá �çò áðïäåéê�éêÞ äéáäéêáóßáò êñá�Üåé ìßá ëßó�á ìå �éò ìå�áâëç�Ýò ðïõåìöáíßæïí�áé ó�çí åñþ�çóç ìáæß ìå �éò �ñÝ÷ïõóåò äåóìåýóåéò �ïõò.�áñÜäåéãìá 13: Áò õðïèÝóïõìå ü�é Ý÷ïõìå öïñ�þóåé �ï ðñüãñáììáparent(tantalos,pelopas). % 1parent(dioni,pelopas). % 2parent(dioni,niovi). % 3parent(tantalos,niovi). % 4parent(pelopas,atreas). % 5male(tantalos). % 6male(pelopas). % 7male(atreas). % 8female(dioni). % 9female(niovi). % 10father(X,Y) :- parent(X,Y), male(X). % 11grandfather(X,Y) :- father(X,Z), parent(Z,Y). % 12êáé êÜíïõìå �çí åñþ�çóç?- grandfather(A,B).H Prolog èá ðñïóðáèÞóåé íá áðïäåßîåé �çí ðñü�áóç-ó�ü÷ï grandfather(A,B) áðï�éò ðñï�Üóåéò ðïõ áðï�åëïýí �ï ðñüãñáììá. �éá �ï óêïðü áõ�ü åîå�Üæåé ìå �çóåéñÜ �éò ðñï�Üóåéò �ïõ ðñïãñÜììá�ïò, ìå�ïíïìÜæïí�áò �éò ìå�áâëç�Ýò �ïõò, ìå÷ñéíá âñåß åß�å Ýíá ãåãïíüò ðïõ �áõ�ïðïéåß�áé ìå �ç grandfather(A,B) Þ Ýíáí êáíüíáç êåöáëÞ �ïõ ïðïßïõ �áõ�ïðïéåß�áé ìå �çí grandfather(A,B).Ç �áõ�ïðïßçóç èá ðå�ý÷åé ü�áí óõíáí�Þóåé �ïí êáíüíá 12, ï ïðïßïò ìå�Ü �çí ìå-�ïíïìáóßá �ùí ìå�áâëç�þí �ïõ ãßíå�áégrandfather(X1,Y1) :- father(X1,Z1), parent(Z1,Y1).Ç êåöáëÞ �ïõ ðáñáðÜíù êáíüíá �áõ�ïðïéÞ�áé ìå �ç ðñü�áóç grandfather(A,B)ìå ðéï ãåíéêü �áõ�ïðïéç�Þ {X1 = A, Y1 = B}.Ç ðñü�áóç grandfather(A,B) áí�éêáèßó�á�áé ìå Ýíáí íÝï ó�ü÷ïfather(A,Z1), parent(Z1,B)ï ïðïßïò ðñïêýð�åé áðü �ï óþìá �ïõ êáíüíá ìå åöáñìïãÞ �ïõ ðéï ãåíéêïý �áõ�ï-ðïéç�Þ. Ó�ç óõíÝ÷åéá ç Prolog ðñïóðáèåß íá áðïäåßîåé �çí ðñþ�ç ðñü�áóç �ïõ íÝïõó�ü÷ïõ (ç Prolog ü�áí Ý÷åé íá áðïäåßîåé Ýíá óýíèå�ï ó�ü÷ï, îåêéíÜåé ðÜí�á áðü�çí ðñþ�ç ðñü�áóç �ïõ). Ç ðñü�áóç father(A,Z1) �áõ�ïðïéåß�áé ìå �çí êåöáëÞ�ïõ êáíüíá father(X2,Y2) :- parent(X2,Y2), male(X2). (ï ïðïßïò ðñïÝêõøå22

ìå�ïíïìÜæïí�áò �ïí êáíüíá 11) ìå ðéï ãåíéêü �áõ�ïðïéç�Þ {X2 = A, Y2 = Z1}.Áêïëïýèùò ó÷çìá�ßæå�áé Ýíáò íÝïò ó�ü÷ïò, ìå áí�éêá�Üó�áóç �çò ðñü�áóçò father(A,Z1)áðü �éò ðñï�Üóåéò parent(A,Æ1), male(A), ïé ïðïßåò ðñïêýð�ïõí áðü �ï óþìá �ïõêáíüíá ìå åöáñìïãÞ �ïõ ðéï ãåíéêïý �áõ�ïðïéç�Þ. Ï íÝïò ó�ü÷ïò ðïõ ðñïóðáèåßíá áðïäåßîåé ç Prolog åßíáéparent(A,Æ1), male(A), parent(Z1,B).Ç ðñü�áóç parent(A,Æ1) �áõ�ïðïéåß�áé ìå �ï ãåãïíüò parent(tantalos,pelopas),ìå ðéï ãåíéêü �áõ�ïðïéç�Þ {A= tantalos, Z1 = pelopas}. Ç ðñü�áóç parent(A,Æ1)äéáãñÜöå�áé áðü �ï ó�ü÷ï (áöïý �áõ�ïðïéÞèçêå ìå ãåãïíüò, �ï ïðïßï áëçèåýåé ÷ù-ñßò ðñïûðïèÝóåéò). Åðßóçò ó�éò ðñï�Üóåéò ðïõ ðáñáìÝíïõí ó�ï ó�ü÷ï ç ìå�áâëç�ÞZ1 áí�éêáèßó�á�áé áðü �ï Ü�ïìï pelopas.Ïé �ñÝ÷ïõóåò äåóìåýóåéò �ùí ìå�áâëç�þí �çò áñ÷éêÞò åñþ�çóçò ãßíïí�áé{A = tantalos, B = B}.Ï íÝïò ó�ü÷ïò åßíáé male(tantalos), parent(pelopas,B). Ç Prolog èá âñåß�ï ãåãïíüò male(tantalos) ó�ï ðñüãñáììá èá äéáãñÜøåé �çí ðñü�áóç áðü �ïíó�ü÷ï. Ï ó�ü÷ïò ãßíå�áé parent(pelopas,B). Ç ìïíáäéêÞ ðñü�áóç ó�ï ó�ü÷ï�áõ�ïðïéåß�áé ìå �ï ãåãïíüò parent(pelopas,atreas), ìå ðéï ãåíéêü �áõ�ïðïé-ç�Þ {B = atreas}. Ïé �ñÝ÷ïõóåò äåóìåýóåéò �ùí ìå�áâëç�þí �çò áñ÷éêÞò åñþ�çóçòãßíïí�áé {A = tantalos, B = atreas}.Óå áõ�ü �ï óçìåßï ç Prolog äéáðéó�þíåé ü�é äåí Ý÷åé �ßðï�á Üëëï íá áðïäåßîåé(êáèþò ï ó�ü÷ïò åßíáé êåíüò) êáé åðéó�ñÝöåé �çí áðÜí�çóçA = tantalosB = atreasÔá âÞìá�á ðïõ åê�åëåß ç Prolog ãéá íá áðáí�Þóåé �çí åñþ�çóç óõíïøßæïí�áé ðá-ñáêÜ�ù. �éá êÜèå âÞìá áíáãñÜöå�áé ï �ñÝ÷ùí ó�ü÷ïò, ïé �ñÝ÷ïõóåò äåóìåýóåéò�ùí ìå�áâëç�þí �çò åñþ�çóçò, ïé ðñï�Üóåéò �ïõ ðñïãñÜììá�ïò ðïõ åîå�Üó�çêáí,ç ðñü�áóç �ïõ ðñïãñÜììá�ïò (ìå�Ü �ç ìå�ïíïìáóßá �ùí ìå�áâëç�þí) ìå �çí ïðïßáÝãéíå ç �áõ�ïðïßçóç (ç ïðïßá åßíáé ç �åëåõ�áßá ðïõ åîå�Üó�çêå), êáé ï ðéï ãåíé-êüò �áõ�ïðïéç�Þò. Ôï EOP óõìâïëßæåé �ï �Ýëïò �ïõ ðñïãñÜììá�ïò. Ï áñéèìüò ðïõäßíå�áé óå áãêýëåò ðñéí áðü êÜèå ó�ü÷ï äåß÷íåé �á åðé�õ÷Þ âÞìá�á ðïõ ïäçãïýíóå áõ�üí îåêéíþí�áò áðü �ïí áñ÷éêü ó�ü÷ï. Ï�áí ï �ñÝ÷ïí ó�ü÷ïò ãßíåé êåíüò(óõìâïëßæå�áé ìå #) äåí õðÜñ÷ïõí ïé �ñåéò �åëåõ�áßåò ðëçñïöïñßåò êáé ç áðÜí�çóçðïõ åê�õðþíå�áé äßíå�áé ìå�Ü �çí ðáñåìâïëÞ ìéá äéá÷ùñéó�éêÞò ãñáììÞò.[0℄ grandfather(A,B){A = A,  = Â}1 --> 12grandfather(X1,Y1) :- father(X1,Z1), parent(Z1,Y1).{X1 = A, Y1 = B} 23

[1℄ father(A,Z1), parent(Z1,B){A = A,  = Â}1 --> 11father(X2,Y2) :- parent(X2,Y2), male(X2).{X2 = A, Y2 = Z1}[2℄ parent(A,Æ1), male(A), parent(Z1,B){A = A,  = Â}1 --> 1parent(tantalos,pelopas){A = tantalos, Z1 = pelopas}[3℄ male(tantalos),parent(pelopas,B){A=tantalos, Â=Â}1 --> 6male(tantalos){}[4℄ parent(pelopas,B){A = tantalos,  = Â}1 --> 5parent(pelopas,atreas){B = atreas}[5℄ #{A = tantalos,  = atreas}--------------------------------------------------------------A = tantalos = atreas.Ó�ï ðñïçãïýìåíï ðáñÜäåéãìá ç Prolog äçìéïýñãçóå ìßá áêïëïõèßá ó�ü÷ùí ðïõ ïäÞãçóåáðåõèåßáò óå åðé�õ÷ßá. Ùó�üóï áõ�ü äåí åßíáé ï ãåíéêüò êáíüíáò. Ó�ç ãåíéêÞ ðåñßð�ùóçç Prolog ÷ñåéÜæå�áé íá ïðéóèïäñïìÞóåé, áêõñþíïí�áò êÜðïéåò äåóìåýóåéò ìå�áâëç�þí êáéäçìéïõñãþí�áò íÝåò.�áñÜäåéãìá 14: Áò õðïèÝóïõìå ü�é Ý÷ïõìå öïñ�þóåé �ï ðñüãñáììá �ïõ ðáñáäåßãìá�ïò13 êáé êÜíïõìå �çí åñþ�çóç?- father(F,niovi).Ç ðñü�óáóç father(F,niovi) �áõ�ïðïéåß�áé ìå �çí êåöáëÞ �ïõ êáíüíáfather(X1,Y1) :- parent(X1,Y1), male(X1).(ï ïðïßïò ðñïÝêõøå ìå�ïíïìÜæïí�áò �ïí êáíüíá 11) ìå ðéï ãåíéêü �áõ�ïðïéç�Þ {X1 = F,Y1 = niovi}.Ï íÝïò ó�ü÷ïò ðïõ ðñïóðáèåß íá áðïäåßîåé ç Prolog åßíáé parent(F,niovi), male(F).Ç ðñü�áóç parent(F,niovi) �áõ�ïðïéåß�áé ìå �ï ãåãïíüò parent(dioni,niovi), ìå24

ðéï ãåíéêü �áõ�ïðïéç�Þ {F = dioni}. Ó�ï óçìåßï áõ�ü äåóìåýå�áé ç ìå�áâëç�Þ F ðïõõðÞñ÷å ó�çí áñ÷éêÞ åñþ�çóç.Ï íÝïò ó�ü÷ïò áðï�åëåß�áé áðü �çí ðñü�áóç male(dioni), ç ïðïßá äåí áðïäåéêíýå�áéáðü �ï ðñüãñáììá, êáèþò äåí �áõ�ïðïéåß�áé ìå êáíÝíá ãåãïíüò Þ êåöáëÞ êáíüíá �ïõðñïãñÜììá�ïò.Ó�ï óçìåßï áõ�ü ç Prolog ÷ñåéÜæå�áé íá ïðéóèïäñïìÞóåé. Áõ�ü óçìáßíåé ü�é ðñÝðåé íáåðáíÝëèåé ó�çí êá�Üó�áóç ðïõ âñéóêü�áí Ýíá âÞìá ðñéí.Ï ó�ü÷ïò ãßíå�áé ðÜëé parent(F,niovi), male(F) êáé ç äÝóìåõóç F = dioni áêõ-ñþíå�áé. Ó�ç óõíÝ÷åéá ç Prolog ðñïóðáèåß íá �áõ�ïðïéÞóåé îáíÜ �ï parent(F,niovi)ìÝ êÜðïéï ãåãïíüò Þ êåöáëÞ êáíüíá, åîå�Üæïí�áò �ï ðñüãñáììá áðü �ï óçìåßï ðïõÝãéíå ç ðñïçãïýìåíç �áõ�ïðïßçóç êáé ìå�Ü. Ìå Üëëá ëüãéá áíáæç�Üåé Ýíáí åíáëëá-ê�éêü �ñüðï áðüäåéîçò �çò ðñü�áóçò parent(F,niovi) áðü �ï ðñüãñáììá. Ç ðñü�áóçparent(F,niovi) �áõ�ïðïéåß�áé ìå �ï ãåãïíüò parent(tantalos,niovi), ìå ðéï ãåíéêü�áõ�ïðïéç�Þ {F = tantalos}. Ó�ï óçìåßï áõ�ü äåóìåýå�áé ç ìå�áâëç�Þ F ðïõ õðÞñ÷åó�çí áñ÷éêÞ åñþ�çóç óå ìßá íÝá �éìÞ.Ï íÝïò ó�ü÷ïò áðï�åëåß�áé áðü �çí ðñü�áóç male(tantalos), ç ïðïßá õðÜñ÷åé ó�ï ðñü-ãñáììá. ÔåëéêÜ ç Prolog ó÷çìá�ßæåé �ïí êåíü ó�ü÷ï êáé åðéó�ñÝöåé �çí áðÜí�çóçF = tantalosÔá âÞìá�á ðïõ åê�åëåß ç Prolog óõíïøßæïí�áé ðáñáêÜ�ù. Ï ó�ü÷ïò ó�ïí ïðïßï ïðéóèï-äñïìåß ç Prolog åßíáé ç ðéï ðñüóöá�ïò ó�ü÷ïò ìå áñßèìçóç êá�Ü Ýíá ìéêñü�åñç óå ó÷Ýóçìå �ï ó�ü÷ï ðïõ áðï�õã÷Üíåé.[0℄ father(F,niovi){F = F}1 --> 11father(X1,Y1) :- parent(X1,Y1), male(X1).{X1 = F, Y1 = niovi}[1℄ parent(F,niovi), male(F){F = F}1 --> 3parent(dioni,niovi){F = dioni}[2℄ male(dioni){F = dioni}1 --> EOPfailure - ba ktra king[1℄ parent(F,niovi), male(F){F = F}4 --> 4parent(tantalos,niovi){F = tantalos} 25

[2℄ male(tantalos){F = tantalos}1 --> 6male(tantalos){}[3℄ #{F = tantalos}--------------------------------------------------------------F = tantalos.Ç Prolog ãéá íá ìðïñåß íá ïðéóèïäñïìåß, ÷ñåéÜæå�áé íá èõìÜ�áé, üëåò �éò åíäéÜìåóåòêá�áó�Üóåéò áðü �éò ïðïßåò ðÝñáóå ãéá íá ö�Üóåé áðü �ïí áñ÷éêü ó�ü÷ï ó�ïí �ñÝ÷ïí�á.�éá �ï ëüãï êÜèå öïñÜ ðïõ äçìéïõñãåß Ýíá íÝï ó�ü÷ï, áðïèçêåýåé �ïí ðñïçãïýìåíï óå ìßáó�ïßâá, ìáæß ìå �ç èÝóç ìÝóá ó�ï ðñüãñáììá �çò ðñü�áóçò ìå �çí ïðïßá Ýãéíå ç �áõ�ïðïß-çóç êáé �éò �ñÝ÷ïõóåò äåóìåýóåéò �ùí ìå�áâëç�þí. ÊÜèå öïñÜ ðïõ ç Prolog áðï�õã÷Üíåéíá �áõ�ïðïéÞóåé �çí ðñþ�ç ðñü�áóç �ïõ ó�ü÷ïõ ìå êÜðïéá ðñü�áóç �ïõ ðñïãñÜììá�ïò,åîÜãå�áé ç ðñïçãïýìåíç êá�Üó�áóç áðü �çí êïñõöÞ �çò ó�ïßâáò êáé óõíå÷ßæå�áé áðü áõ-�Þí ç äéáäéêáóßá.Ìðïñïýìå �þñá íá ðåñéãñÜøïõìå ðëÞñùò �ïí áëãüñéèìï ìå �ïí ïðïßï ç Prolog áðáí�Üåéìßá åñþ�çóç. �éá ëüãïõò óõí�ïìßáò, áí ìßá ðñü�áóç �ïõ ðñïãñÜììá�ïò åßíáé ãåãïíüò,èá êáëïýìå êåöáëÞ �çò ðñü�áóçò �çí á�ïìéêÞ ðñü�áóç ðïõ áðï�åëåß �ï ãåãïíüò.Ï áëãüñéèìïò äÝ÷å�áé ùò åßóïäï Ýíá ó�ü÷ï G ðïõ áðï�åëåß�áé áðü �çí ðåðåñáóìÝíçáêïëïõèßá á�ïìéêþí ðñï�Üóåùí ðïõ ó÷çìá�ßæïõí �çí åñþ�çóç.¼ðùò êáé áëãüñéèìïò �áõ�ïðïßçóçò, ï áëãüñéèìïò ðïõ ðåñéãñÜöïõìå äéá�çñåß ìßá ëß-ó�á ìå �éò �ñÝ÷ïõóåò äåóìåýóåéò ãéá üëåò �éò ìå�áâëç�Ýò �çò åñþ�çóçò åê�üò áðü �çíáíþíõìç ìå�áâëç�Þ. Áí ïé ìå�áâëç�Ýò ðïõ åìöáíßæïí�áé ó�çí åñþ�çóç (äéáöïñå�éêÝò �çòáíþíõìçò) åßíáé ïé V1, . . . , Vk �ü�å �ï óýíïëï �ùí äåóìåýóåùí áñ÷éêÜ åßíáé S = {V1 =V1, . . . , Vk = Vk} (k ≥ 0), ðïõ äçëþíïõí Ýììåóá �çí Ýëëåéøç äÝóìåõóçò. Ïé åìöáíßóåéò�çò áíþíõìçò ìå�áâëç�Þò ó�ï ó�ü÷ï G áí�éêáèßó�áí�áé áðü íÝåò ìå�áâëç�Ýò (ìßá äéáöï-ñå�éêÞ ãéá êÜèå åìöÜíéóç). Ï áëãüñéèìïò ÷ñçóéìïðïéåß ìßá âïçèç�éêÞ ìå�áâëç�Þ i ðïõáñ÷éêÜ Ý÷åé �éìÞ 0. Ç ó�ïßâá åßíáé áñ÷éêÜ êåíÞ.ÊÜèå âÞìá �ïõ áëãïñßèìïõ åê�åëåß �éò ðáñáêÜ�ù åíÝñãåéåò:

• ¸ó�ù ü�é ó�ç áñ÷Þ �ïõ âÞìá�ïò �ï óýíïëï �ùí äåóìåýóåùí åßíáéS = {V1 = b1, . . . , Vk = bk}.

• Áí ï ó�ü÷ïò ðåñéÝ÷åé �ïõëÜ÷éó�ïí ìßá ðñü�áóç �ü�å{ ÅðáíáëáìâÜíïí�áé ïé ðáñáêÜ�ù åíÝñãåéåò:∗ ÁõîÜíå�áé �ç �éìÞ �ïõ i êá�Ü Ýíá.∗ Ó÷çìá�ßæå�áé ìßá ðáñáëëáãÞ C �çò i-ïó�Þò ðñü�áóçò �ïõ ðñïãñÜììá�ïòìå ìå�ïíïìáóßá �ùí ìå�áâëç�þí �çò.26

∗ ÅëÝã÷å�áé áí ç ðñþ�ç ðñü�áóç ó�ï ó�ü÷ï G �áõ�ïðïéåß�áé ìå �çí êåöáëÞ�çò C.Ç åðáíÜëçøç ó�áìá�Üåé ü�áí ðå�ý÷åé ç �áõ�ïðïßçóç Þ åîáí�ëçèïýí ïé ðñï�Ü-óåéò ó�ï ðñüãñáììá.{ Áí ç ðñþ�ç ðñü�áóç ó�ïí G �áõ�ïðïéÞèçêå ìÝ êÜðïéá ðñü�áóç C êáé Θ åßíáéï ðéï ãåíéêüò �áõ�ïðïéç�Þò ðïõ åðéó�ñÜöçêå áðü �ïí áëãüñéèìï �áõ�ïðïßçóçò�ü�å∗ Ôá G, i êáé S áí�éãñÜöïí�áé ó�çí êïñõöÞ �çò ó�ïßâáò.∗ Ç ðñþ�ç ðñü�áóç �ïõ G äéáãñÜöå�áé áðü áõ�üí.∗ Áí ç ðñü�áóç C åßíáé êáíüíáò �ü�å ïé á�ïìéêÝò ðñï�Üóåéò ðïõ áðï�åëïýí�ï óþìá �çò C åéóÜãïí�áé ó�çí áñ÷Þ �ïõ G (ìå �çí ßäéá óåéñÜ åìöÜíéóçòüðùò ó�ç C).∗ �ßíå�áé áí�éêá�Üó�áóç �ùí ìå�áâëç�þí �ïõ G óýìöùíá ìå �ïí �áõ�ï-ðïéç�Þ Θ.∗ Åíçìåñþíå�áé �ï óýíïëï äåóìåýóåùí S, ìå áí�éêá�Üó�áóç �ùí ìå�áâëç-�þí ðïõ åìöáíßæïí�áé ó�á b1, . . . , bk óýìöùíá ìå �ïí �áõ�ïðïéç�Þ Θ.∗ Ôï i ðáßñíåé �çí �éìÞ 0.{ Áëëéþò (áí �ï �ï ðñüãñáììá åîáí�ëÞèçêå ÷ùñßò íá ãßíåé �áõ�ïðïßçóç) �ü�å∗ Áí ç ó�ïßâá äåí åßíáé êåíÞ �ü�å ãßíå�áé áíÜê�çóç �ùí �éìþí �ùí G, i êáé

S áðü �ç ó�ïßâá (ïðéóèïäñüìçóç).∗ Áëëéþò åê�õðþíå�áé no êáé �åñìá�ßæåé ï áëãüñéèìïò.

• Áëëéþò (áí ï ó�ü÷ïò åßíáé êåíüò){ Áí �ï S åßíáé êåíü �ü�å åê�õðþíå�áé yes êáé �åñìá�ßæåé ï áëãüñéèìïò.{ Áëëéþò∗ Åê�õðþíïí�áé ïé äåóìåýóåéò ðïõ ðåñéÝ÷ïí�áé ó�ï óýíïëï S, ìßá óå êÜèåãñáììÞ êáé áíáìÝíå�áé ç ïäçãßá áðü �ïí ÷ñÞó�ç.∗ Áí ï ÷ñÞó�çò ãñÜøåé ; �ü�å ãßíå�áé åðáíáëçð�éêÜ áíÜê�çóç �ùí �éìþí�ùí G, i êáé S áðü �ç ó�ïßâá ìÝ÷ñé íá âñåèåß ó�ï÷ïò ðïõ ðåñéÝ÷åé ìå�á-âëç�Þ (áíáæÞ�çóç Üëëçò áðÜí�çóçò).∗ Áëëéþò (áí ï ÷ñÞó�çò ãñÜøåé .) �ü�å åê�õðþíå�áé yes êáé �åñìá�ßæåé ïáëãüñéèìïò.�áñÜäåéãìá 15: ¸ó�ù �ï ðáñáêÜ�ù ðñüãñáììá:parent(tantalos,pelopas). % 1parent(dioni,pelopas). % 2parent(dioni,niovi). % 3parent(tantalos,niovi). % 4parent(pelopas,atreas). % 5male(tantalos). % 6male(pelopas). % 7male(atreas). % 8female(dioni). % 9female(niovi). % 1027

prede essor(X,Y) :- parent(X,Y). % 11prede essor(X,Y) :- parent(X,Z), % 12prede essor(Z,Y).Áí êÜíïõìå �çí åñþ�çóç?- prede essor(dioni,W),male(W).ç Prolog èá áêïëïõèÞóåé �á ðáñáêÜ�ù âÞìá�á:[0℄ prede essor(dioni,W),male(W){W = W}1 --> 11prede essor(X1,Y1) :- parent(X1,Y1).{X1 = dioni, Y1 = W}[1℄ parent(dioni,W),male(W){W = W}1 --> 2parent(dioni,pelopas).{W = pelopas}[2℄ male(pelopas){W = pelopas}1 --> 7male(pelopas){}[3℄ #{W = pelopas}--------------------------------------------------------------W = pelopas ;--------------------------------------------------------------[2℄ male(pelopas)[1℄ parent(dioni,W),male(W){W = W}3 --> 3parent(dioni,niovi).{W = niovi}[2℄ male(niovi){W = niovi}1 --> EOPfailure - baktra king[1℄ parent(dioni,W),male(W){W = W}4 --> EOPfailure - baktra king 28

[0℄ prede essor(dioni,W),male(W){W = W}12 --> 12prede essor(X2,Y2) :- parent(X2,Z2), prede essor(Z2,Y2).{X2 = dioni, Y2 = W}[1℄ parent(dioni,Z2), prede essor(Z2,W),male(W){W = W}1 --> 2parent(dioni,pelopas).{Z2 = pelopas}[2℄ prede essor(pelopas,W),male(W){W = W}1 --> 11prede essor(X3,Y3) :- parent(X3,Y3).{X3 = pelopas, Y3 = W}[3℄ parent(pelopas,W),male(W){W = W}1 --> 5parent(pelopas,atreas).{W = atreas}[4℄ male(atreas){W = atreas}1 --> 8male(atreas).{}[5℄ #{W = atreas}--------------------------------------------------------------W = atreas.yes--------------------------------------------------------------.�áñÜäåéãìá 16: ¸ó�ù �ï ðáñáêÜ�ù ðñüãñáììá Prolog, ó�ï ïðïßï ðåñéãñÜöå�áé ÝíáãñÜöçìá êáé ïñßæå�áé ç Ýííïéá �ïõ ìïíïðá�éïý. Ôï êá�çãüñçìá egde ïñßæå�áé áðü ÝíáðëÞèïò ãåãü�ùí ðïõ êáèïñßæïõí �éò áêìÝò �ïõ ãñáöÞìá�ïò. Ôï êá�çãüñçìá olor ïñßæå-�áé åðßóçò áðü Ýíá ðëÞèïò ãåãïíü�ùí ðïõ êáèïñßæïõí áí �ï ÷ñþìá ìßá êïñõöÞò åßíáé ìðëåÞ êüêêéíï. ÔÝëïò �ï êá�çãüñçìá path(Á,Â,Í) ïñßæå�áé áíáäñïìéêÜ áðü Ýíá ãåãïíüò êáéÝíáí êáíüíá. Ç ðñü�áóç path(Á,Â,Í) äçëþíåé ü�é õðÜñ÷åé êá�åõèõíüìåíï ìïíïðÜ�é ìå-�áîý A êáé B ìÞêïõò N. Ï áñéèìüò n ðáñé�Üíå�áé áðü �ïí üñï s(s(...s(︸ ︷︷ ︸

n

0)...)).29

edge(a,b). % 1edge(b, ). % 2edge(b,d). % 3edge( ,d). % 4edge( ,e). % 5 olor(a,red). % 6 olor(b,blue). % 7 olor( ,blue). % 8 olor(d,blue). % 9 olor(e,red). % 10path(A,A,0). % 11path(A,B,s(N)) :- edge(A,X), path(X,B,N). % 12Áí èÝëïõìå íá âñïýìå áí õðÜñ÷åé ìïíïðÜ�é ìÞêïõò �ïõëÜ÷éó�ïí äýï ðïõ íá óõíäÝåéêüìâïõò �ïõ ßäéïõ ÷ñþìá�ïò êáíïõìå ó�çí Prolog �çí åñþ�çóç?- olor(A,C),path(A,B,s(s(X))), olor(B,C).Ôá âÞìá�á ðïõ èá áêïëïõèÞóåé ç Prolog ãéá íá áðáí�Þóåé ó�çí åñþ�çóç óõíïøßæïí�áéðáñáêÜ�ù.[0℄ olor(A,C),path(A,B,s(s(X))), olor(B,C){A = A, C = C, B = B, X = X}1 --> 6 olor(a,red).{A = a, C = red}[1℄ path(a,B,s(s(X))), olor(B,red){A = a, C = red, B = B, X = X}1 --> 12path(A1,B1,s(N1)) :- edge(A1,X1), path(X1,B1,N1).{A1 = a, B1 = B, N1 = s(X)}[2℄ edge(a,X1),path(X1,B,s(X)), olor(B,red){A = a, C = red, B = B, X = X}1 --> 1edge(a,b).{X1 = b}[3℄ path(b,B,s(X)), olor(B,red){A = a, C = red, B = B, X = X}1 --> 12path(A2,B2,s(N2)) :- edge(A2,X2), path(X2,B2,N2).{A2 = b, B2 = B, N2 = X}[4℄ edge(b,X2),path(X2,B,X), olor(B,red){A = a, C = red, B = B, X = X}1 --> 2edge(b, ).{X2 = } 30

[5℄ path( ,B,X), olor(B,red){A = a, C = red, B = B, X = X}1 --> 11path(A3,A3,0).{A3 = , B = , X = 0}[6℄ olor( ,red){A = a, C = red, B = , X = 0}1 --> EOPfailure - ba ktra king[5℄ path( ,B,X), olor(B,red){A = a, C = red, B = B, X = X}12 --> 12path(A4,B4,s(N4)) :- edge(A4,X4), path(X4,B4,N4).{A4 = , B4 = B, X = s(N4)}[6℄ edge( ,X4),path(X4,B,N4), olor(B,red){A = a, C = red, B = B, X = s(N4)}1 --> 4edge( ,d).{X4 = d}[7℄ path(d,B,N4), olor(B,red){A = a, C = red, B = B, X = s(N4)}1 --> 11path(A5,A5,0).{A5 = d, B = d, N4 = 0}[8℄ olor(d,red){A = a, C = red, B = B, X = s(0)}1 --> EOPfailure - ba ktra king[7℄ path(d,B,N4), olor(B,red){A = a, C = red, B = B, X = s(N4)}12 --> 12path(A6,B6,s(N6)) :- edge(A6,X6), path(X6,B6,N6).{A6 = d, B6 = B, N4 = s(N6)}[8℄ edge(d,X6),path(X6,B,N6), olor(B,red){A = a, C = red, B = B, X = s(s(N6))}1 --> EOPfailure - ba ktra king[7℄ path(d,B,N4), olor(B,red){A = a, C = red, B = B, X = s(N4)}EOP 31

failure - ba ktra king[6℄ edge( ,X4),path(X4,B,N4), olor(B,red){A = a, C = red, B = B, X = s(N4)}5 --> 5edge( ,e).{X4 = e}[7℄ path(e,B,N4), olor(B,red){A = a, C = red, B = B, X = s(N4)}1 --> 11path(A7,A7,0).{A7 = e, B = e, N4 = 0}[8℄ olor(e,red){A = a, C = red, B = e, X = s(0)}1 --> 10 olor(e,red).{}[9℄ #{A = a, C = red, B = e, X = s(0)}--------------------------------------------------------------A = aC = redB = eX = s(0) ;--------------------------------------------------------------[8℄ olor(e,red)[7℄ path(e,B,N4), olor(B,red){A = a, C = red, B = B, X = s(N4)}12 --> 12path(A8,B8,s(N8)) :- edge(A8,X8), path(X8,B8,N8).{A8 = e, B8 = B, N4 = s(N8)}[8℄ edge(e,X8),path(X8,B,N8), olor(B,red){A = a, C = red, B = B, X = s(s(N8))}1 --> EOPfailure - ba ktra king[7℄ path(e,B,N4), olor(B,red){A = a, C = red, B = B, X = s(N4)}EOPfailure - ba ktra king[6℄ edge( ,X4),path(X4,B,N4), olor(B,red){A = a, C = red, B = B, X = s(N4)}6 --> EOP 32

failure - ba ktra king[5℄ path( ,B,X), olor(B,red){A = a, C = red, B = B, X = X}EOPfailure - ba ktra king[4℄ edge(b,X2),path(X2,B,X), olor(B,red){A = a, C = red, B = B, X = X}3 --> 3edge(b,d).{X2 = d}[5℄ path(d,B,X), olor(B,red){A = a, C = red, B = B, X = X}1 --> 11path(A9,A9,0).{A9 = d, B = d, X = 0}[6℄ olor(d,red){A = a, C = red, B = d, X = 0}1 --> EOPfailure - ba ktra king[5℄ path(d,B,X), olor(B,red){A = a, C = red, B = d, X = X}12 --> 12path(A10,B10,s(N10)) :- edge(A10,X10), path(X10,B10,N10).{A10 = d, B10 = B, X = s(N10)}[6℄ edge(d,X10),path(X10,B,N10), olor(B,red){A = a, C = red, B = d, X = s(N10)}1 --> EOPfailure - ba ktra king[5℄ path(d,B,X), olor(B,red){A = a, C = red, B = d, X = X}EOPfailure - ba ktra king[4℄ edge(b,X2),path(X2,B,X), olor(B,red){A = a, C = red, B = B, X = X}4 --> EOPfailure - ba ktra king[3℄ path(b,B,s(X)), olor(B,red){A = a, C = red, B = B, X = X}EOPfailure - ba ktra king 33

[2℄ edge(a,X1),path(X1,B,s(X)), olor(B,red){A = a, C = red, B = B, X = X}2 --> EOPfailure - ba ktra king[1℄ path(a,B,s(s(X))), olor(B,red){A = a, C = red, B = B, X = X}EOPfailure - ba ktra king[0℄ olor(A,C),path(A,B,s(s(X))), olor(B,C){A = A, C = C, B = B, X = X}7 --> 7 olor(b,blue).{A = b, C = blue}[1℄ path(b,B,s(s(X))), olor(B,blue){A = b, C = blue, B = B, X = X}1 --> 12path(A11,B11,s(N11)) :- edge(A11,X11), path(X11,B11,N11).{A11 = b, B11 = B, N11 = s(X)}[2℄ edge(b,X11),path(X11,B,s(X)), olor(B,blue){A = b, C = blue, B = B, X = X}1 --> 2edge(b, ).{X11 = }[3℄ path( ,B,s(X)), olor(B,blue){A = b, C = blue, B = B, X = X}1 --> 12path(A12,B12,s(N12)) :- edge(A12,X12), path(X12,B12,N12).{A12 = , B12 = B, N12 = X}[4℄ edge( ,X12),path(X12,B,X), olor(B,blue){A = b, C = blue, B = B, X = X}1 --> 4edge( ,d).{X12 = d}[5℄ path(d,B,X), olor(B,blue){A = b, C = blue, B = B, X = X}1 --> 11path(A13,A13,0).{A13 = d, B = d, X = 0}[6℄ olor(d,blue){A = b, C = blue, B = d, X = 0} 34

1 --> 9 olor(d,blue).{}[7℄ #{A = b, C = blue, B = d, X = 0}--------------------------------------------------------------A = bC = blueB = dX = 0.yes--------------------------------------------------------------.1.12 Åíóùìá�ùìÝíç áñéèìç�éêÞÇ õðïó�Þñéîç áñéèìþí êáé áñéèìç�éêþí ðñÜîåùí áðï�åëåß âáóéêÞ áðáß�çóç áðü ìßá ãëþóóáðñïãñáììá�éóìïý, áêüìç êáé áí áõ�Þ äåí ðñïïñßæå�áé ãéá áìéãþò áñéèìç�éêÝò åöáñìïãÝò.Ç Prolog õðïó�çñßæåé áêÝñáéïõò êáé ðñáãìá�éêïýò áñéèìïýò êáé �ïõò �åëåó�Ýò +, -, *, //(áêÝñáéá äéáßñåóç), / (ðñáãìá�éêÞ äéáßñåóç) êáé mod (õðüëïéðï äéáßñåóçò).�éá íá áðï�éìçèåß ìßá ðáñÜó�áóç ðïõ ðåñéÝ÷åé áñéèìç�éêïýò �åëåó�Ýò ÷ñçóéìïðïéåß�áéï �åëåó�Þò is:?- X is 3+5.X = 8?- X is 5//2.X = 2?- X is 5/2.X = 2.5?- X is 16 mod 3.X = 1ÓõíÞèùò áñéó�åñÜ �ïõ �åëåó�Þ is �ïðïèå�åß�áé ìßá ìå�áâëç�Þ ÷ùñßò äÝóìåõóç, ç ïðïßá,ìå�Ü �çí áðï�ßìçóç �çò áñéèìç�éêÞò ðáñÜó�áóçò ðïõ âñßóêå�áé äåîéá �ïõ is, äåóìåýå�áéó�çí �éìÞ �çò ðáñÜó�áóçò. Ùó�üóï ç Prolog åðé�ñÝðåé áñéó�åñÜ �ïõ is íá õðÜñ÷åé ïðïéïó-äÞðï�å üñïò. Ìå�Ü �çí áðï�ßìçóç �çò ðáñÜó�áóçò ãßíå�áé �áõ�ïðïßçóç �ïõ üñïõ ìå �çí�éìÞ ðïõ ðñïêýð�åé áðü �çí áðï�ßìçóç. Åßíáé åýêïëï íá äéáðéó�ùèåß ü�é ç �áõ�ïðïßçóçåðé�õã÷Üíåé ìüíï ü�áí ï üñïò áñéó�åñÜ �ïõ is åßíáé áñéèìç�éêÞ �éìÞ ßóç ìå �çí �éìÞ �çòðáñÜó�áóçò, ìå�áâëç�Þ ðïõ Ý÷åé äåóìåõ�åß óå �éìÞ ßóç ìå �çí �éìÞ �çò ðáñÜó�áóçò Þìå�áâëç�Þ ÷ùñßò äÝóìåõóç. 35

?- 5 is 2+3.yes?- 7 is 4*2.no?- a is 3-1.no?- 2+2 is 3+1.noÓ�çí �åëåõ�áßá åñþ�çóç ç áðÜí�çóç åßíáé no åðåéäÞ �ï is ðñïêáëåß áðï�ßìçóç ìüíï ó�çíðáñÜó�áóç ðïõ âñßóêå�áé äåîéÜ �ïõ.Ïé ðáñáó�Üóåéò äåîéÜ �ïõ is åðé�ñÝðå�áé íá ðåñéÝ÷ïõí ðåñéóóü�åñïõò �ïõ åíüò áñéèìç�é-êïýò �åëåó�Ýò. Ï �åëåó�Þò mod Ý÷åé �ç ìÝãéó�ç ðñï�åñáéü�ç�á, ïé *, // êáé / Ý÷ïõí ìåóáßáðñï�åñáéü�ç�á êáé ïé + êáé - Ý÷ïõí �çí åëÜ÷éó�ç ðñï�åñáéü�ç�á. Ôåëåó�Ýò ìå ßäéá ðñï-�åñáéü�ç�á ðñïóå�áéñßæïí�áé áðü áñéó�åñÜ ðñïò �á äåîéÜ. Ìðïñïýìå íá ÷ñçóéìïðïéïýìåðáñåíèÝóåéò ãéá íá êáèïñßæïõìå �ç óåéñÜ �ùí ðñÜîåùí.?- X is 20//5 mod 3.X = 10?- X is 10-2*3.X = 4?- X is 100//10//5.X = 2?- X is 100//(10//5).X = 50Ïé áðëïß üñïé ðïõ åìöáíßæïí�áé ó�çí ðáñÜó�áóç äåîéÜ �ïõ is èá ðñÝðåé íá åßíáé áñéè-ìïß Þ ìå�áâëç�Ýò ðïõ Ý÷ïõí äåóìåõ�åß óå áñéèìç�éêÝò �éìÝò ðñéí áðü �çí áðï�ßìçóç. Áíó�á äåîéÜ �ïõ is ðåñéÝ÷ïí�áé Ü�ïìá Þ óýíèå�ïé üñïé ðïõ ó÷çìá�ßæïí�áé áðï óõíáñ�ç-óéáêÜ óýìâïëá ðïõ äåí åßíáé �åëåó�Ýò áñéèìç�éêþí ðñÜîåùí Þ ìå�áâëç�Ýò ðïõ äåí åßíáéäåóìåõìÝíåò óå áñéèìç�éêÞ �éìÞ, �ü�å ç áðï�ßìçóç �çò ðáñÜó�áóçò äåí åßíáé äõíá�Þ êáéåìöáíßæå�áé Ýíá ìÞíçìá óöÜëìá�ïò (�ï ïðïßï åîáñ�Ü�áé áðü �çí õëïðïßçóç).?- X is a+1.! Error in arithmeti expression: a is not a number?- X is f(0).! Error in arithmeti expression: f is not an arithmeti operator?- X is Y+1.! Error in arithmeti expression: not a number36

?- Y = 2, X is Y+1.Y = 2X = 3Ôïíßæå�áé ü�é = êÜíåé �áõ�ïðïßçóç áêüìç êáé ó�çí ðåñßð�ùóç ðïõ êÜðïéï üñéóìÜ �ïõ åßíáéáñéèìç�éêÞ ðáñÜó�áóç êáé óå êáìßá ðåñßð�ùóç äåí ðñïêáëåß áðï�ßìçóç.?- X = 3+5.X = 3+5?- 8 = 3+5.no?- 2*4 = 3+5.no?- A+B = 3+5.A = 3B = 5�ñéí åê�åëåó�åß ï áëãüñéèìïò �áõ�ïðïßçóçò, ïé ðáñáó�Üóåéò ìå�á�ñÝðïí�áé óå üñïõò ìå�ç óõíÞèç óýí�áîç, ïé ïðïßïé ðñïêýð�ïõí ÷ñçóéìïðïéþí�áò �ïõò áñéèìç�éêïýò �åëåó�Ýòùò óõíáñ�çóéáêÜ óýìâïëá. Ó�çí ðñáãìá�éêü�ç�á ç äõíá�ü�ç�á ãñáöÞò åíüò �åëåó�ÞáíÜìåóá ó�á ïñßóìá�Ü �ïõ åßíáé ìüíï ìßá óõí�áê�éêÞ äéåõêüëõíóç. Ïé áñéèìç�éêÝò ðá-ñáó�Üóåéò ó�çí Prolog åóù�åñéêÜ ìå�á�ñÝðïí�áé óå óýíèå�ï üñï. �éá ðáñÜäåéãìá ç ðá-ñÜó�áóç 3+5 åóù�åñéêÜ ðáñéó�Üíå�áé ùò +(3,5). Åðßóçò ç ðáñÜó�áóç 3*5*2-25 mod 4åßíáé óõí�áê�éêÞ ðáñáëëáãÞ �ïõ -(*(*(3,5),2),mod(25,4)).?- +(3,5) = 3+5.yes?- -(*(*(3,5),2),mod(25,4)) = 3*5*2-25 mod 4.yesÌðïñïýìå íá óõãêñßíïõìå áñéèìç�éêÝò ðáñáó�Üóåéò ìå �ïõò �åëåó�Ýò =:= (ßóï), <, >, =<,>= êáé =\= (Üíéóï). Ïé �åëåó�Ýò óýãêñéóçò áðï�éìïýí êáé �ïõò äýï üñïõò ðïõ ðáßñíïõí ùòïñßóìá�á, ïé ïðïßïé èá ðñÝðåé íá åßíáé áñéèìç�éêÝò ðáñáó�Üóåéò. Áí ó�ïõò üñïõò áõ�ïýòåìöáíßæïí�áé ìå�áâëç�Ýò èá ðñÝðåé íá Ý÷ïõí äåóìåõ�åß óå áñéèìç�éêÝò �éìÝò:?- 2*4 =:= 3+5.yes?- X =:= 3+5.! Error in arithmeti expression: not a number?- X =< X+1.! Error in arithmeti expression: not a number?- X is 2+4, X =< X+1.X = 6 37

1.13 ×ñÞóç üñùí ãéá áíáðáñÜó�áóç áñéèìþíÌðïñïýìå íá ÷ñçóéìïðïéÞóïõìå óýíèå�ïõò üñïõò ãéá íá ðáñáó�Þóïõìå áñéèìïýò. �éáðáñÜäåéãìá, ï öõóéêüò áñéèìüò n ìðïñåß íá ðáñáó�áèåß ùò s(s(...s(︸ ︷︷ ︸

n

0)...)) (üðùò êÜ-íáìå ó�ï ðáñÜäåéãìá 16). Ó�çí áíáðáñÜó�áóç áõ�Þ ï áñéèìüò 3 ãñÜöå�áé s(s(s(0))).Ìðïñïýìå íá ïñßóïõìå �ï êá�çãüñçìá nat �ï ïðïßï ðáßñíåé Ýíá üñéóìá êáé áëçèåýåéü�áí ç �éìÞ �ïõ ïñßóìá�ïò åßíáé üñïò ðïõ ðáñéó�Üíåé öõóéêü áñéèìü ó�çí áíáðáñÜó�áóçðïõ ðåñéãñÜøáìå:nat(0).nat(s(X)) :- nat(X).�áñÜäåéãìá åñù�Þóåùí ðïõ ÷ñçóéìïðïéïýí �ï nat:?- nat(s(s(s(0)))).yes?- nat(3).noÇ ðáñáðÜíù áíáðáñÜó�áóç åßíáé äõóáíÜãíùó�ç êáé äå âïçèÜåé ó�ç äçìéïõñãßá áðïäï�é-êþí ðñïãñáììÜ�ùí. Áðü �çí Üëëç ðëåõñÜ, �ï ðëåïíÝê�çìá ðïõ Ý÷åé åßíáé ü�é ç ÷ñÞóç�çò åðé�ñÝðåé ó�çí Prolog íá áðáí�Þóåé óå �ýðïõò åñù�Þóåùí, ãéá �éò ïðïßåò ç åíóùìá-�ùìÝíç áñéèìç�éêÞ èá ïäçãïýóå óå óöÜëìá, ëüãù �çò ýðáñîçò �ïõ is (áõ�ü öáßíå�áé ó�ïðáñÜäåéãìá 17 ðáñáêÜ�ù).Ôïíßæå�áé ü�é ìðïñåß êáíåßò íá åðåê�åßíåé �çí ðáñáðÜíù áíáðáñÜó�áóç êáé ãéá áñíç-�éêïýò áñéèìïýò. Åðßóçò åßíáé äõíá�Ýò êáé Üëëåò åíáëëáê�éêÝò áíáðáñáó�Üóåéò áñéèìþíìå ÷ñÞóç üñùí.1.14 Óõíáñ�ÞóåéòÁí f åßíáé ìßá óõíÜñ�çóç ìå n ïñßóìá�á �ü�å ìðïñïýìå íá ïñßóïõìå Ýíá áí�ßó�ïé÷ï êá-�çãüñçìá p ìå n+ 1 ïñßóìá�á �Ý�ïéï þó�å �ï p(x1, x2, . . . , xn, xn+1) íá áëçèåýåé áí êáéìüíï áí xn+1 = f(x1, x2, . . . , xn).Ç Prolog äåí õðïó�çñßæåé Üìåóá óõíáñ�Þóåéò. Áí èÝëïõìå íá ïñßóïõìå ìßá óõíÜñ�çóç f�ü�å èá ðñÝðåé íá ïñßóïõìå �ï áí�ßó�ïé÷ü �çò êá�çãüñçìá p. �éá íá õðïëïãßóïõìå �çí�éìÞ f(x1, x2, . . . , xn), êáíïõìå ìßá åñþ�çóç �çò ìïñöÞò?- p(x1, x2, . . . , xn,Õ).êáé ç æç�ïýìåíç �éìÞ åßíáé ç �éìÞ �çò ìå�áâëç�Þò Õ ó�çí áðÜí�çóç.Óçìåéþíïõìå ü�é Ý÷ïí�áò ïñßóåé �ï êá�çãüñçìá p, ìðïñïýìå íá êÜíïõìå êáé åñù�Þóåéò,ïé ïðïßåò èá ðåñéÝ÷ïõí ìå�áâëç�Ýò ÷ùñßò äÝóìåõóç óå èÝóåéò äéáöïñå�éêÝò �çò �åëåõ�áßáò,åíäå÷ïìÝíùò êáé óå ðåñéóóü�åñåò áðü ìßá. Ôï áí ç Prolog ìðïñåß íá áðáí�Þóåé óå áõ�Ýò�éò åñù�Þóåéò, åîáñ�Ü�áé áðü �ï ðùò õëïðïéåß�áé �ï êá�çãüñçìá.38

�áñÜäåéãìá 17: ðñüóèåóç áêåñáßùí.Áò õðïèÝóïõìå ü�é èÝëïõìå íá ïñßóïõìå ó�çí Prolog �ç óõíÜñ�çóç sum(x, y) = x + y.�éá �ï óêïðü áõ�ü, èá ïñßóïõìå Ýíá êá�çãüñçìá sum(×,Õ,Æ), �ï ïðïßï èá áëçèåýåé áí ç�éìÞ �çò Æ åßíáé �ï Üèñïéóìá �ùí �éìþí �ùí X êáé Y.Õëïðïéïýìå ðñþ�á �ï êá�çãüñçìá sum ÷ùñßò ÷ñÞóç �çò åíóùìá�ùìÝíçò áñéèìç�éêÞò ðá-ñéó�Üíïí�áò �ïõò áñéèìïýò ùò óýíèå�ïõò üñïõò ðïõ ó÷çìá�ßæïí�áé ìå �ï óõíáñ�çóéáêüóýìâïëï s (ãéá ðëçñü�ç�á åðáíáëáìâÜíïõìå �ïí ïñéóìü �ïõ nat):nat(0). % 1nat(s(X)) :- nat(X). % 2sum(X,0,X) :- nat(X). % 3sum(X,s(Y),s(Z)) :- sum(X,Y,Z). % 4�éá íá õðïëïãßóïõìå �ï Üèñïéóìá �ùí áñéèìþí 3 êáé 2 ãñÜöïõìå �çí åñþ�çóç:?- sum(s(s(s(0))),s(s(0)),S).S = s(s(s(s(s(0)))))Èá ìðïñïýóáìå íá ó÷çìá�ßóïõìå ìßá åñþ�çóç ó�çí ïðïßá èá åß÷áìå ùò äåý�åñï üñéóìáìå�áâëç�Þ:?- sum(s(0),D,s(s(s(s(0))))).D = s(s(s(0)))Ìå �çí ðáñáðÜíù åñþ�çóç ó�çí ïõóßá êÜíïõìå áöáßñåóç, ó�çí ïðïßá ï ìåéù�Ýïò åßíáé�ï �ñß�ï üñéóìá êáé ï áöáéñå�Ýïò �ï ðñþ�ï üñéóìá. Èá ìðïñïýóáìå íá êÜíïõìå êáé �çíðáñáêÜ�ù åñþ�çóç ó�çí ïðïßá ÷ñçóéìïðïéïýìå äýï ìå�áâëç�Ýò:?- sum(A,B,s(s(s(0)))).Ç ðáñáðÜíù åñþ�çóç æç�Üåé áðü �çí Prolog íá âñåß äýï áñéèìïýò A êáé  ìå Üèñïéóìá3. Ç Prolog èá áðáí�Þóåé óùó�Ü êáé óå áõ�Þ �çí åñþ�çóç. Ç äõíá�ü�ç�á áõ�Þ ïöåßëå�áéó�ï ü�é �ï ðáñáðÜíù ðñüãñáììá äåí ðåñéãñÜöåé áðëÜ �ï ðþò õðïëïãéæå�áé �ï Üèñïéóìáäýï áñéèìþí, áëëÜ äéá�õðþíåé �éò éêáíÝò êáé áíáãêáßåò óõíèÞêåò ðïõ ðñÝðåé íá ðëçñïýí�ñåéò áñéèìïß, Ý�óé þó�å ï �ñß�ïò íá áðï�åëåß �ï Üèñïéóìá �ùí äýï ðñþ�ùí, ÷ùñßò íáêáèïñßæå�áé ðïéÝò åßíáé ïé åßóïäïé êáé ðïéá åßíáé ç Ýîïäïò. Ôá âÞìá�á ðïõ èá åê�åëÝóåéç Prolog ãéá íá áðáí�Þóåé óå áõ�Þ �çí åñþ�çóç äßíïí�áé ðáñáêÜ�ù. Õðåíèõìßæå�áé ü�éü�áí äþóïõìå ; ìå�Ü áðü áðÜí�çóç, ç Prolog åîÜãåé ó�ü÷ïõò áðü �ç ó�ïßâá ìÝ÷ñé íáâñåß êÜðïéïí ðïõ ðåñéÝ÷åé ìå�áâëç�Þ.[0℄ sum(A,B,s(s(s(0)))){A = A, B = B}1 --> 3sum(X1,0,X1) :- nat(X1).{A = s(s(s(0))), B = 0, X1 = s(s(s(0)))}39

[1℄ nat(s(s(s(0)))){A = s(s(s(0))), B = 0}1 --> 2nat(s(X2)) :- nat(X2).{X2 = s(s(0))}[2℄ nat(s(s(0))){A = s(s(s(0))), B = 0}1 --> 2nat(s(X3)) :- nat(X3).{X3 = s(0)}[3℄ nat(s(0)){A = s(s(s(0))), B = 0}1 --> 2nat(s(X4)) :- nat(X4).{X4 = 0}[4℄ nat(0){A = s(s(s(0))), B = 0}1 --> 1nat(0).{}[5℄ #{A = s(s(s(0))), B = 0}--------------------------------------------------------------A = s(s(s(0)))B = 0 ;--------------------------------------------------------------[4℄ nat(0)[3℄ nat(s(0))[2℄ nat(s(s(0)))[1℄ nat(s(s(s(0))))[0℄ sum(A,B,s(s(s(0)))){A = A, B = B}4 --> 4sum(X5,s(Y5),s(Z5)) :- sum(X5,Y5,Z5).{X5 = A, B = s(Y5), Æ5 = s(s(0))}[1℄ sum(A,Y5,s(s(0))){A = A, B = s(Y5)}1 --> 3sum(X6,0,X6) :- nat(X6).{A = s(s(0)), Y5 = 0, X6 = s(s(0))}40

[2℄ nat(s(s(0))){A = s(s(0)), B = s(0)}1 --> 2nat(s(X7)) :- nat(X7).{X7 = s(0)}[3℄ nat(s(0)){A = s(s(0)), B = s(0)}1 --> 2nat(s(X8)) :- nat(X8).{X8 = 0}[4℄ nat(0){A = s(s(0)), B = s(0)}1 --> 1nat(0).{}[5℄ #{A = s(s(0)), B = s(0)}--------------------------------------------------------------A = s(s(0))B = s(0) ;--------------------------------------------------------------[4℄ nat(0)[3℄ nat(s(0))[2℄ nat(s(s(0)))[1℄ sum(A,Y5,s(s(0))){A = A, B = s(Y5)}4 --> 4sum(X9,s(Y9),s(Z9)) :- sum(X9,Y9,Z9).{X9 = A, Y5 = s(Y9), Æ9 = s(0)}[2℄ sum(A,Y9,s(0)){A = A, B = s(s(Y9))}1 --> 3sum(X10,0,X10) :- nat(X10).{A = s(0), Y9 = 0, X10 = s(0)}[3℄ nat(s(0)){A = s(0), B = s(s(0))}1 --> 2nat(s(X11)) :- nat(X11).{X11 = 0}41

[4℄ nat(0){A = s(0), B = s(s(0))}1 --> 1nat(0).{}[5℄ #{A = s(0), B = s(s(0))}--------------------------------------------------------------A = s(0)B = s(s(0)) ;--------------------------------------------------------------[4℄ nat(0)[3℄ nat(s(0))[2℄ sum(A,Y9,s(0)){A = A, B = s(s(Y9))}4 --> 4sum(X12,s(Y12),s(Z12)) :- sum(X12,Y12,Z12).{X12 = A, Y9 = s(Y12), Æ12 = 0}[3℄ sum(A,Y12,0){A = A, B = s(s(s(Y12)))}1 --> 3sum(X13,0,X13) :- nat(X13).{A = 0, Y12 = 0, X13 = 0}[4℄ nat(0){A = 0, B = s(s(s(0)))}1 --> 1nat(0).{}[5℄ #{A = 0, B = s(s(s(0)))}--------------------------------------------------------------A = 0B = s(s(s(0))) ;--------------------------------------------------------------[4℄ nat(0)[3℄ sum(A,Y12,0){A = A, B = s(s(s(Y12)))}4 --> EOPfailure - ba ktra king[2℄ sum(A,Y9,s(0)){A = A, B = s(s(Y9))}EOPfailure - ba ktra king 42

[1℄ sum(A,Y5,s(s(0))){A = A, B = s(Y5)}EOPfailure - ba ktra king[0℄ sum(A,B,s(s(s(0)))){A = A, B = B}EOPfailure--------------------------------------------------------------noÏñßæïõìå ó�ç óõíÝ÷åéá �ï êá�çãüñçìá sum10 ãéá õëïðïßçóç �çò ðñüóèåóçò ìå ÷ñÞóç �çòåíóùìá�ùìÝíçò áñéèìç�éêÞò �çò Prolog.sum10(X,Y,Z) :- Z is X+Y.�éá íá õðïëïãßóïõìå �ï Üèñïéóìá �ùí áñéèìþí 3 êáé 2 ãñÜöïõìå �çí åñþ�çóç:?- sum10(3,2,S).S = 5Ç ðáñáðÜíù åñþ�çóç ÷ñåéÜæå�áé ëéãü�åñá âÞìá�á ãéá íá áðáí�çèåß, åíþ ç áðÜí�çóç åßíáéóå ðéï áíáãíþóéìç ìïñöÞ. Áí ùó�üóï êÜíïõìå �çí åñþ�çóç?- sum10(Á,Â,3).ç Prolog èá äçìéïõñãÞóåé �ï ó�ü÷ï 3 is A+B ï ïðïßïò èá ðñïêáëÝóåé óöÜëìá ÷ñüíïõåê�Ýëåóçò, êáèþò ç ðáñÜó�áóç äåîéÜ �ïõ is ðåñéÝ÷åé ìå�áâëç�Ýò ÷ùñßò äÝóìåõóç. ÂëÝ-ðïõìå ü�é ç ÷ñÞóç �çò åíóùìá�ùìÝíçò áñéèìç�éêÞò �çò Prolog ó�ïí ïñéóìü êá�çãïñçìÜ-�ùí ìåéþíåé �ç ëåé�ïõñãéêü�ç�Ü �ïõò. Ùó�üóï ãéá ëüãïõò åðßäïóçò êáé áíáãíùóéìü�ç�áòèá �çí åðéëÝîïõìå ó�ç óõíÝ÷åéá ãéá �çí õëïðïßçóç áñéèìç�éêþí óõíáñ�Þóåùí.1.15 Õëïðïßçóç áñéèìç�éêþí óõíáñ�Þóåùí ìå áíá-äñïìÞÓ�ç óõíÝ÷åéá èá ïñßóïõìå áíáäñïìéêÜ êá�çãïñÞìá�á ðïõ õëïðïéïýí áñéèìç�éêÝò óõíáñ-�Þóåéò. Ôá êá�çãïñÞìá�á áõ�Ü èá Ý÷ïõí Ýíá üñéóìá ðåñéóóü�åñï óå óýãêñéóç ìå �éòóõíáñ�Þóåéò ðïõ õëïðïéïýí, �ï ïðïßï èá åßíáé ðÜí�ï�å �ï �åëåõ�áßï. ¼ðùò Ý÷ïõìå ÞäçáíáöÝñåé, áí �ï êá�çãüñçìá p õëïðïéåß ìßá óõíÜñ�çóç f �ü�å èá ðñÝðåé ç áðÜí�çóç ó�çíåñþ�çóç?- p(x1, x2, . . . , xn,Õ)íá äßíåé ùò �éìÞ �çò ìå�áâëç�Þò Y �ï f(x1, x2, . . . , xn).Áí ç n-áäá �éìþí (x1, x2, . . . , xn) äåí áíÞêåé ó�ï ðåäßï ïñéóìïý �çò f ìßá áðüëõ�á óùó�Þõëïðïßçóç �ïõ p èá ðñÝðåé íá åðéó�ñÝöåé �çí áðÜí�çóç no ó�çí ðáñáðÜíù åñþ�çóç. Áõ�üãéá ðáñÜäåéãìá óõìâáßíåé áí ç f ïñßæå�áé ìüíï ãéá èå�éêïýò áêÝñáéïõò êáé êÜðïéï áðü43

�á xi åßíáé áñíç�éêüò áñéèìüò, Ü�ïìï Þ óýíèå�ïò üñïò. Ó�ïõò ïñéóìïýò �ùí êá�çãïñçìÜ-�ùí ðïõ èá ðåñéãñÜøïõìå ó�ç óõíÝ÷åéá ÷áëáñþíïõìå �çí ðáñáðÜíù óõíèÞêç: áí n-áäá(x1, x2, . . . , xn) äåí áíÞêåé ó�ï ðåäßï ïñéóìïý �çò f , �ü�å áðáé�ïýìå íá ìçí åðéó�ñÝöå�áé�éìÞ ãéá �ç ìå�áâëç�Þ Õ, ÷ùñßò áðáñáß�ç�á íá åðéó�ñÝöå�áé ç áðÜí�çóç no. Áí ãéá ðáñÜ-äåéãìá êÜðïéï üñéóìá äåí åßíáé áñéèìüò �ü�å ìðïñåß íá äéáêïðåß ç äéáäéêáóßá õðïëïãéóìïýìå ìÞíõìá óöÜëìá�ïò, åíþ áí åßíáé áñéèìç�éêÞ �éìÞ ðïõ äåí áíÞêåé ó�ï ðåäßï ïñéóìïý,ìðïñåß �ï ðñüãñáììá íá ðÝö�åé óå Üðåéñï âñü÷ï, ðïõ èá ðñïêáëÝóåé õðåñ÷åßëéóç ó�ïßâáò.Åðßóçò, ìßá áðüëõ�á ïñèÞ õëïðïßçóç �ïõ �ïõ p, èá Ýðñåðå óå ðåñßð�ùóç ðïõ æç�Þóïõìåäåý�åñç �éìÞ ãéá �ç óõíÜñ�çóç (ãñÜöïí�áò ; ìå�Ü �çí ðñþ�ç áðÜí�çóç) íá åðéó�ñÝöåéno. Êáé åäþ ÷áëáñþíïõìå �çí áðáß�çóÞ ìáò åðé�ñÝðïí�áò ó�çí Prolog åß�å íá ðÝóåé óåÜðåéñï âñü÷ï åß�å íá åðéó�ñÝøåé �ç óùó�Þ ëýóç ðåñéóóü�åñåò áðü ìßá öïñÝò. Áñãü�åñáü�áí èá Ý÷ïõìå ðåñéãñÜøåé ïñéóìÝíá ðñïêáèïñéóìÝíá êá�çãïñÞìá�á �çò Prolog, üðùòåðßóçò êáé �ïí Ýëåã÷ï �çò ïðéóèïäñüìçóçò, èá åðáíÝëèïõìå ãéá íá äïýìå ðùò ìðïñïýí�á êá�çãïñÞìá�á íá ïñéó�ïýí ìå áðüëõ�á ïñèü �ñüðï.�áñÜäåéãìá 18: ðáñáãïí�éêü.�éá íá ïñßóïõìå �çí Ýííïéá �ïõ ðáñáãïí�éêïý èá ðñÝðåé íá ïñßóïõìå Ýíá êá�çãüñçìáfa t(N,F) �ï ïðïßï èá áëçèåýåé áí êáé ìüíï áí ç �éìÞ �çò ìå�áâëç�Þò F åßíáé �ï ðáñáãï-í�éêü �çò �éìÞò �çò N. Ôï êá�çãüñçìá áõ�ü ìðïñåß íá ïñéó�åß ìå âÜóç �éò äýï ðáñáêÜ�ùðñï�Üóåéò: (á) áí �ï N åßíáé 0 êáé �ï F åßíáé 1 �ü�å �ï F åßíáé �ï ðáñáãïí�éêü �ïõ Nêáé (â) áí �ï N åßíáé ìåãáëõ�åñï áðü �ï 0, �ï K Ý÷åé �éìÞ N − 1, �ï ðáñáãïí�éêü �ïõK åßíáé G êáé �ï F Ý÷åé �éìÞ N ·G �ü�å �ï F åßíáé �ï ðáñáãïí�éêü �ïõ N . Ïé ðáñáðÜíùðñï�Üóåéò äéá�õðþíïí�áé åýêïëá óå Prolog.fa t(N,F) :- N = 0,F = 1.fa t(N,F) :- N > 0,K is N-1,fa t(K,G),F is N*G.�áñá�çñïýìå ü�é ïé äýï ðñï�Üóåéò ðïõ áðï�åëïýí �ï óþìá �ïõ ðñþ�ïõ êáíüíá ðñïóäéï-ñßæïõí ìå ÷ñÞóç �ïõ �åëåó�Þ = �éò �éìÝò �ùí ìå�áâëç�þí N êáé F. ÓõíÞèùò ó�çí Prologáí�ß íá ãñÜöïõìå �Ý�ïéåò ðñï�Üóåéò, êÜíïõìå áð' åõèåßáò áí�éêá�Üó�áóç �ùí ìå�áâëç�þíìå �éò �éìÝò �ïõò. Áí�ß �ïõ ðáñáðÜíù ïñéóìïý ãéá �ï fa t èá ìðïñïýóáìå íá ãñÜøïõìå:fa t2(0,1).fa t2(N,F) :- N > 0,K is N-1,fa t2(K,G),F is N*G.Ï ðñþ�ïò êáíüíáò ó�ïí ïñéóìü �ïõ fa t áí�éêá�áó�Üèçêå áðü Ýíá ãåãïíüò �ï ïðïßï óåöõóéêÞ ãëþóóá ëÝåé ü�é �ï ðáñáãïí�éêü �ïõ 0 åßíáé �ï 1, ðïõ åßíáé éóïäýíáìï ìå �çíðñü�áóç (á).

44

�éá íá õðïëïãßóïõìå �ï 3! êÜíïõìå �çí åñþ�çóç?- fa t2(3,X).ãéá �çí áðÜí�çóç �çò ïðïßáò ç Prolog åê�åëåß �á ðáñáêÜ�ù âÞìá�á:[0℄ fa t2(3,X){X = X}1 --> 2fa t2(N1,F1) :- N1 > 0, K1 is N1-1, fa t2(K1,G1), F1 is N1*G1.{N1 = 3, F1 = X}[1℄ 3 > 0, K1 is 3-1, fa t2(K1,G1), X is 3*G1{X = X}> : build-in{}[2℄ K1 is 3-1, fa t2(K1,G1), X is 3*G1{X = X}is : build-in{K1 = 2}[3℄ fa t2(2,G1), X is 3*G1{X = X}1 --> 2fa t2(N2,F2) :- N2 > 0, K2 is N2-1, fa t2(K2,G2), F2 is N2*G2.{N2 = 2, F2 = G1}[4℄ 2 > 0, K2 is 2-1, fa t2(K2,G2), G1 is 2*G2, X is 3*G1{X = X}> : build-in{}[5℄ K2 is 2-1, fa t2(K2,G2), G1 is 2*G2, X is 3*G1{X = X}is : build-in{K2 = 1}[6℄ fa t2(1,G2), G1 is 2*G2, X is 3*G1{X = X}1 --> 2fa t2(N3,F3) :- N3 > 0, K3 is N3-1, fa t2(K3,G3), F3 is N3*G3.{N3 = 1, F3 = G2}[7℄ 1 > 0, K3 is 1-1, fa t2(K3,G3), G2 is 1*G3, G1 is 2*G2, X is 3*G1{X = X}> : build-in{} 45

[8℄ K3 is 1-1, fa t2(K3,G3), G2 is 1*G3, G1 is 2*G2, X is 3*G1{X = X}is : build-in{K3 = 0}[9℄ fa t2(0,G3), G2 is 1*G3, G1 is 2*G2, X is 3*G1{X = X}1 --> 1fa t2(0,1).{G3 = 1}[10℄ G2 is 1*1, G1 is 2*G2, X is 3*G1{X = X}is : build-in{G2 = 1}[11℄ G1 is 2*1, X is 3*G1{X = X}is : build-in{G1 = 2}[12℄ X is 3*2{X = X}is : build-in{X = 6}[13℄ #{X = 6}--------------------------------------------------------------X = 6¼ðùò öáßíå�áé êáé áðü �á âÞìá�á �çò ðáñáðÜíù äéáäéêáóßáò, áí ÷ñçóéìïðïéÞóïõìå �ïfa t2 (Þ �ï fa t) ãéá íá õðïëïãßóïõìå �ï ðáñáãïí�éêü åíüò ìç áñíç�éêïý áñéèìïý, �ü�åï Ýëåã÷ïò N > 0 èá áëçèåýåé ðÜí�á ìÝ÷ñé êáé �ç ó�éãìÞ ðïõ èá åê�õðùèåß ç �éìÞ �ïõðáñáãïí�éêïý ùò áðÜí�çóç. Ó�ç ðáñáêÜ�ù õëïðïßçóç ï Ýëåã÷ïò ãéá �ï �çí �éìÞ �ïõ NÝ÷åé ðáñáëçöèåß:fa t3(0,1).fa t3(N,F) :- K is N-1,fa t3(K,G),F is N*G.Ôï fa t3 ü�áí ÷ñçóéìïðïéçèåß óå åñþ�çóç ìå �ï ðñþ�ï üñéóìá íá Ý÷åé ìÞ áñíç�éêÞáêÝñáéá �éìÞ, �ü�å Ý÷åé áêñéâþò �çí ßäéá óõìðåñéöïñÜ ìå �ï fa t2. Ôá äýï êá�çãïñÞìá�áÝ÷ïõí äéáöïñå�éêÞ óõìðåñéöïñÜ ü�áí �ï ðñþ�ï üñéóìá åßíáé áñíç�éêüò áñéèìüò Þ ü�áíæç�Þóïõìå äåý�åñç áðÜí�çóç ãñÜöïí�áò ;. Áí ðñïóðáèÞóïõìå íá ÷ñçóéìïðïéÞóïõìå �ïäåý�åñï üñéóìá ùò åßóïäï ãéá íá õðïëïãßóïõìå �çí áí�ßó�ñïöç óõíÜñ�çóç, äçëáäÞ ãéáíá âñïýìå �ï áñéèìü �ï ðáñáãïí�éêü �ïõ ïðïßïõ éóïý�áé ìå ìßá äåäïìÝíç �éìÞ, �ü�å èáðñïêýøåé óöÜëìá ÷ñüíïõ åê�Ýëåóçò. Áõ�ü ïöåßëå�áé ó�ç ÷ñÞóç �ïõ is ó�ïí áíáäñïìéêüêáíüíá �ï ïðïßï ãéá íá ëåé�ïõñãÞóåé óùó�Ü áðáé�åß ç ìå�áâëç�Þ N íá Ý÷åé äåóìåõ�åß óå46

áñéèìç�éêÞ �éìÞ. Ìðïñïýìå íá ÷ñçóéìïðïéÞóïõìå �ï fa t3 (Þ êÜðïéá áðü �éò ðáñáëëáãÝò�ïõ) ãéá íá åðáëçèåýóïõìå �çí �éìÞ �ïõ ðáñáãïí�éêïý:fa t3(5,120).yes.�áñÜäåéãìá 19: õðïëïãéóìüò äýíáìçò.Ç Prolog äåí ðáñÝ÷åé êÜðïéïí �åëåó�Þ ãéá ýøùóç óå äýíáìç. �éá �ïí õðïëïãéóìü ìßáò ìÞáñíç�éêÞò áêÝñáéáò äýíáìçò åíüò áñéèìïý, èá ïñßóïõìå Ýíá êá�çãüñçìá power(N,K,P)�ï ïðïßï èá áëçèåýåé áí ç �éìÞ �çò ìå�áâëç�Þò P éóïý�áé ìå �çí �éìÞ �çò N õøþìÝíç ó�çí�éìÞ �çò K (ç ïðïßá èá õðïèÝ�ïõìå ü�é åßíáé ìÞ áñíç�éêÞ). Ôï power ìðïñåß íá ïñéó�åß ìåâÜóç �éò ðáñáêÜ�ù ðñï�Üóåéò: (á) �ï N0 éóïý�áé ìå 1, (â) áí �ï K åßíáé èå�éêüò êáéÜñ�éïò áêÝñáéïò, �ï L éóïý�áé ìå �ï ⌊K2⌋, �ï R éóïý�áé ìå �ï NL êáé �ï P éóïý�áé ìå

R2, �ü�å �ï NK éóïý�áé ìå P êáé (ã) áí �ï K åßíáé èå�éêüò êáé ðåñé��üò áêÝñáéïò, �ïL éóïý�áé ìå �ï ⌊K

2⌋, �ï R éóïý�áé ìå �ï NL êáé �ï P éóïý�áé ìå R2 · N , �ü�å �ï NKéóïý�áé ìå P . Ïé ðáñáðÜíù ðñï�Üóåéò ìðïñïýí íá ãñáö�ïýí óå Prolog ìå �ïí ðáñáêÜ�ù�ñüðï:power(N,0,1).power(N,K,P) :- K mod 2 =:= 0,L is K//2,power(N,L,R),P is R*R.power(N,K,P) :- K mod 2 =:= 1,L is K//2,power(N,L,R),P is R*R*N.¸÷ïõìå ðáñáëåßøåé áðü �ïõò áíáäñïìéêïýò êáíüíåò �ïí Ýëåã÷ï K>0. Áõ�ü Ý÷åé þò ðáñå-íÝñãåéá �ï íá ìáò åðéó�ñÝöåé Prolog áðåñéüñéó�åò öïñÝò �çí ßäéá (óùó�Þ) áðÜí�çóç ó�çíðåñßð�ùóç ðïõ �çò æç�Þóïõìå íá âñåß êáé Üëëåò ëýóåéò.�éá ðáñÜäåéãìá, ï õðïëïãéóìüò �ïõ 35 ãßíå�áé ìå �ïí ðáñáêÜ�ù �ñüðï:[0℄ power(3,5,X){X = X}1 --> 2power(N1,K1,P1) :- K1 mod 2 =:= 0, L1 is K1//2,power(N1,L1,R1), P1 is R1*R1.{N1 = 3, K1 = 5, P1 = X}[1℄ 5 mod 2 =:= 0, L1 is 5//2, power(3,L1,R1), X is R1*R1{X = X}=:= : build-infailure - ba ktra king

47

[0℄ power(3,5,X){X = X}3 --> 3power(N2,K2,P2) :- K2 mod 2 =:= 1, L2 is K2//2,power(N2,L2,R2), P2 is R2*R2*N2.{N2 = 3, K2 = 5, P2 = X}[1℄ 5 mod 2 =:= 1, L2 is 5//2, power(3,L2,R2), X is R2*R2*3{X = X}=:= : build-in{}[2℄ L2 is 5//2, power(3,L2,R2), X is R2*R2*3{X = X}is : build-in{L2 = 2}[3℄ power(3,2,R2), X is R2*R2*3{X = X}1 --> 2power(N3,K3,P3) :- K3 mod 2 =:= 0, L3 is K3//2,power(N3,L3,R3), P3 is R3*R3.{N3 = 3, K3 = 2, P3 = R2}[4℄ 2 mod 2 =:= 0, L3 is 2//2, power(3,L3,R3), R2 is R3*R3, X is R2*R2*3{X = X}=:= : build-in{}[5℄ L3 is 2//2, power(3,L3,R3), R2 is R3*R3, X is R2*R2*3{X = X}is : build-in{L3 = 1}[6℄ power(3,1,R3), R2 is R3*R3, X is R2*R2*3{X = X}1 --> 2power(N4,K4,P4) :- K4 mod 2 =:= 0, L4 is K4//2,power(N4,L4,R4), P4 is R4*R4.{N4 = 3, K4 = 1, P4 = R3}[7℄ 1 mod 2 =:= 0, L4 is 1//2, power(3,L4,R4), R3 is R4*R4, R2 is R3*R3,X is R2*R2*3{X = X}=:= : build-infailure - ba ktra king48

[6℄ power(3,1,R3), R2 is R3*R3, X is R2*R2*3{X = X}3 --> 3power(N5,K5,P5) :- K5 mod 2 =:= 1, L5 is K5//2,power(N5,L5,R5), P5 is R5*R5*N5.{N5 = 3, K5 = 1, P5 = R3}[7℄ 1 mod 2 =:= 1, L5 is 1//2, power(3,L5,R5), R3 is R5*R5*3, R2 is R3*R3,X is R2*R2*3{X = X}=:= : build-in{}[8℄ L5 is 1//2, power(3,L5,R5), R3 is R5*R5*3, R2 is R3*R3, X is R2*R2*3{X = X}is : build-in{L5 = 0}[9℄ power(3,0,R5), R3 is R5*R5*3, R2 is R3*R3, X is R2*R2*3{X = X}1 --> 1power(N6,0,1).{N6 = 3, R5 = 1}[10℄ R3 is 1*1*3, R2 is R3*R3, X is R2*R2*3{X = X}is : build-in{R3 = 3}[11℄ R2 is 3*3, X is R2*R2*3{X = X}is : build-in{R2 = 9}[12℄ X is 9*9*3{X = X}is : build-in{X = 243}[13℄ #{X = 243}.--------------------------------------------------------------X = 243Ç ðáñáðÜíù õëïðïßçóç Ý÷åé Ýíá ìåéïíÝê�çìá: ü�áí �ï K mod 2 Ý÷åé �éìÞ 1, �ü�å ç �éìÞáõ�Þ õðïëïãßæå�áé êáé áðü �ïí äåý�åñï êáé áðü �ïí �ñé�ï êáíüíá. Áõ�ü ìðïñåß íá áðïöåõ-÷èåß ìå ÷ñÞóç �çò áðïêïðÞò ðïõ èá äïýìå ðáñáêÜ�ù. ¸íáò åíáëëáê�éêüò �ñüðïò öáßíå�áéó�çí ðáñáêÜ�ù õëïðïßçóç. Ôï âïçèç�éêü êá�çãüñçìá powerHlp ÷ñçóéìïðïéåß�áé ãéá íáõðïëïãéó�åß ìßá êá�Üëëçëç ðïóü�ç�á ç ïðïßá èá ðïëëáðëáóéÜóåé �ï R*R, ç ïðïßá Ý÷åé49

�éìÞ 1 áí �ï K mod 2 Ý÷åé �éìÞ 0, áëëéþò Ý÷åé �éìÞ ßóç ìå K.power2(N,0,1).power2(N,K,P) :- L is K//2,power(N,L,R),M is K mod 2,powerHlp(M,N,Z),P is R*R*Z.powerHlp(0,N,1).powerHlp(1,N,N)..�áñÜäåéãìá 20: õðïëïãéóìüò �ïõ áèñïßóìá�ïò ∑ni=1

ii.�éá �ïí õðïëïãéóìü �ïõ ðáñáðÜíù áèñïßóìá�ïò èá ïñßóïõìå Ýíá êá�çãüñçìá sum1(N,S),ìå�áöñÜæïí�áò ó�ç óýí�áîç �çò Prolog �éò ðáñáêÜ�ù ðñï�Üóåéò: (á) �ï ∑0

i=1ii éóïý�áéìå 0 êáé (â) áí �ï N åßíáé èå�éêüò áêÝñáéïò, �ï K éóïý�áé ìå N − 1, �ï ∑K

i=1ii éóïý�áéìå R, �ï NN éóïý�áé ìå P êáé �ï S éóïý�áé ìå R+ P , �ü�å �ï ∑N

i=1ii éóïý�áé ìå S.sum1(0,0).sum1(N,S) :- K is N-1,sum1(K,R),power(N,N,P),S is R+P.(üðùò êáé ó�á ðñïçãïýìåíá ðáñáäåßãìá�á ðáñáëåßðïõìå �ç óõíèÞêç N > 0 áðü �ïí áíá-äñïìéêü êáíüíá). .�áñÜäåéãìá 21: õðïëïãéóìüò �ïõ ìÝãéó�ïõ êïéíïý äéáéñÝ�ç äýï èå�éêþí áñéèìþí.Ï ìÝãéó�ïò êïéíüò äéáéñÝ�çò (ÌÊÄ) ìðïñåß íá õðïëïãéó�åß ìå �ïí áëãüñéèìï �ïõ Åõ-êëåßäç, ï ïðïßïò âáóßæå�áé ó�éò ðáñáêÜ�ù ðñï�Üóåéò (ïé (â) êáé (ã) åßíáé óõììå�ñéêÝò):(á) áí M = N �ü�å ï ÌÊÄ �ùí M êáé N åßíáé ï N , (â) áí M < N , �ï K éóïý�áé ìå

N −M êáé ï D åßíáé ï ÌÊÄ �ùí M êáé K �ü�å ï D åßíáé ï ÌÊÄ �ùí M êáé N êáé(ã) áí M > N , �ï K éóïý�áé ìå M −N êáé ï D åßíáé ï ÌÊÄ �ùí N êáé K �ü�å ï Dåßíáé ï ÌÊÄ �ùí M êáé N .Ìðïñïýìå íá ãñÜøïõìå �éò ðáñáðÜíù ðñï�Üóåéò óå Prolog:g dEu (N,N,N).g dEu (M,N,D) :- M < N,K is N-M,g dEu (M,K,D).g dEu (M,N,D) :- M > N,K is M-N,g dEu (N,K,D).�éá ðáñÜäåéãìá, ç Prolog èá áðáí�Þóåé ó�çí åñþ�çóç?- g dEu (84,36,X). 50

ìå �ïí ðáñáêÜ�ù �ñüðï:[0℄ g dEu (84,36,X){X = X}1 --> 2g dEu (M1,N1,D1) :- M1 < N1, K1 is N1-M1, g dEu (M1,K1,D1).{M1 = 84, N1 = 36, D1 = X}[1℄ 84 < 36, K1 is 36-84, g dEu (84,K1,X){X = X}< : build-infailure - ba ktra king[0℄ g dEu (84,36,X){X = X}3 --> 3g dEu (M2,N2,D2) :- M2 > N2, K2 is M2-N2, g dEu (N2,K2,D2).{M2 = 84, N2 = 36, D2 = X}[1℄ 84 > 36, K2 is 84-36, g dEu (36,K2,X){X = X}> : build-in{}[2℄ K2 is 84-36, g dEu (36,K2,X){X = X}is : build-in{K2 = 48}[3℄ g dEu (36,48,X){X = X}1 --> 2g dEu (M3,N3,D3) :- M3 < N3, K3 is N3-M3, g dEu (M3,K3,D3).{M3 = 36, N3 = 48, D3 = X}[4℄ 36 < 48, K3 is 48-36, g dEu (36,K3,X){X = X}< : build-in{}[5℄ K3 is 48-36, g dEu (36,K3,X){X = X}is : build-in{K3 = 12}[6℄ g dEu (36,12,X){X = X}1 --> 2g dEu (M4,N4,D4) :- M4 < N4, K4 is N4-M4, g dEu (M4,K4,D4).51

{M4 = 36, N4 = 12, D4 = X}[7℄ 36 < 12, K4 is 12-36, g dEu (36,K4,X){X = X}< : build-infailure - ba ktra king[6℄ g dEu (36,12,X){X = X}3 --> 3g dEu (M5,N5,D5) :- M5 > N5, K5 is M5-N5, g dEu (N5,K5,D5).{M5 = 36, N5 = 12, D5 = X}[7℄ 36 > 12, K5 is 36-12, g dEu (12,K5,X){X = X}> : build-in{}[8℄ K5 is 36-12, g dEu (12,K5,X){X = X}is : build-in{K5 = 24}[9℄ g dEu (12,24,X){X = X}1 --> 2g dEu (M6,N6,D6) :- M6 < N6, K6 is N6-M6, g dEu (M6,K6,D6).{M6 = 12, N6 = 24, D6 = X}[10℄ 12 < 24, K6 is 24-12, g dEu (12,K6,X){X = X}< : build-in{}[11℄ K5 is 24-12, g dEu (12,K6,X){X = X}is : build-in{K6 = 12}[12℄ g dEu (12,12,X){X = X}1 --> 1g dEu (N7,N7,N7).{N7 = 12, X = 12}.[13℄ #{X = 12}--------------------------------------------------------------X = 12 52

Ìðïñïýìå íá �ñïðïðïéÞóïõìå �ïí ðáñáðÜíù ïñéóìü Ý�óé þó�å ðïëëÝò åöáñìïãÝò �ïõßäéïõ êáíüíá ó�éò ïðïßåò ç �éìÞ �ïõ åíüò ïñßóìá�ïò ðáñáìÝíåé ó�áèåñÞ êáé ç �éìÝò �ïõÜëëïõ ðñïêýð�ïõí ìå äéáäï÷éêÝò áöáéñÝóåéò, íá áí�éêá�áó�áèïýí ìå ìßá åöáñìïãÞ êáíüíáó�çí ïðïßá ëáìâÜíå�áé �ï õðüëïéðï äéáßñåóçò �ùí äýï ïñéóìÜ�ùí:g dFast(0,M,M).g dFast(M,N,D) :- M < N,K is N mod M,g dFast(K,M,D).g dFast(M,N,D) :- M >= N,K is M mod N,g dFast(K,N,D)..�áñÜäåéãìá 22: õðïëïãéóìüò �ïõ äéðëïý áèñïßóìá�ïò ∑bi=a

∑dj=c i

j ìå a ≤ b êáé c ≤ d.Ôï Üèñïéóìá õðïëïãßæå�áé ÷ñçóéìïðïéþí�áò �ï ðáñáêÜ�ù áíáäñïìéêü êá�çãüñçìá sumab d,ï ïñéóìüò �ïõ ïðïßïõ âáóßæå�áé ó�éò ðáñáêÜ�ù ðáñá�çñÞóåéò: Áí a = b êáé c = d �ü�å�ï æç�ïýìåíï Üèñïéóìá éóïý�áé ìå ac. Aí a = b, c < d, n = ⌊ c+d2⌋ êáé k = n + 1 �ü�å�ï æç�ïýìåíï Üèñïéóìá éóïý�áé ìå �ï áðï�Ýëåóìá �çò ðñüóèåóçò �ùí äýï ìåñéêþí áèñïé-óìÜ�ùí ∑b

i=a

∑nj=c i

j êáé ∑bi=a

∑dj=k i

j ðïõ ðñïêýð�ïõí äéáìåñßæïí�áò �éò �éìÝò �ïõ jóå äýï óýíïëá. Aí a < b, m = ⌊a+b2⌋ êáé ℓ = m + 1 �ü�å �ï æç�ïýìåíï Üèñïéóìá éóïý-�áé ìå �ï áðï�Ýëåóìá �çò ðñüóèåóçò �ùí äýï ìåñéêþí áèñïéóìÜ�ùí ∑m

i=a

∑dj=c i

j êáé∑b

i=ℓ

∑dj=c i

j .sumab d(A,A,C,C,S) :- power(A,C,S).sumab d(A,A,C,D,S) :- C < D,N is (C+D)//2, K is N+1,sumab d(A,A,C,N,S1),sumab d(A,A,K,D,S2),S is S1+S2.sumab d(A,B,C,D,S) :- A < B,M is (A+B)//2, L is M+1,sumab d(A,M,C,D,S1),sumab d(L,B,C,D,S2),S is S1+S2..�áñÜäåéãìá 23: áêÝñáéï ìÝñïò �çò �å�ñáãùíéêÞò ñßæáò åíüò áñéèìïý.Èá ïñßóïõìå Ýíá êá�çãüñçìá ãéá �ïí õðïëïãéóìü �ïõ ⌊√n⌋ ìå âÜóç �éò ðáñáêÜ�ù ðá-ñá�çñÞóåéò: Éó÷ýåé ü�é 0 ≤ ⌊√n⌋ ≤ n. Åðßóçò, áí ãíùñßæïõìå ü�é a ≤ ⌊√n⌋ ≤ b, üðïõa êáé b ìÞ áñíç�éêïß áêÝñáéïé, êáé c = ⌊a+b+1

2⌋ �ü�å éó÷ýïõí �á ðáñáêÜ�ù: (á) áí a = b�ü�å ïé áíéóü�ç�åò ãßíïí�áé éóü�ç�åò, Üñá ⌊√n⌋ = a, (â) áí a < b êáé c2 > n, �ü�å

a ≤ ⌊√n⌋ ≤ c− 1 êáé (ã) áí a < b êáé c2 ≤ n, �ü�å c ≤ ⌊√n⌋ ≤ b. Ó�éò ðåñéð�þóåéò (â)êáé (ã) ìðïñïýìå óõãêñßíïí�áò �ï c2 ìå �ï n íá ìåéþóïõìå �ïí áñéèìü �ùí õðïøÞöéùí�éìþí ãéá �ï √n ðåñßðïõ ó�ï ìéóü. 53

Ôï êá�çãüñçìá sqrtInt0 õðïëïãßæåé �ï ⌊√n⌋, ÷ñçóéìïðïéþí�áò Ýíá âïçèç�éêü êá�ç-ãüñçìá sqrtHlp0, ï ïñéóìüò �ïõ ïðïßïõ ó�çñßæå�áé ó�éò ðáñáðÜíù ðáñá�çñÞóåéò:sqrtInt0(N,R) :- sqrtHlp0(N,0,N,R).sqrtHlp0(N,A,A,A).sqrtHlp0(N,A,B,R) :- A < B,C is (A+B+1)//2,C*C > N,D is C-1,sqrtHlp0(N,A,D,R).sqrtHlp0(N,A,B,R) :- A < B,C is (A+B+1)//2,C*C =< N,sqrtHlp0(N,C,B,R).Ó�çí ðáñáðÜíù õëïðïßçóç, áí äåí áëçèåýåé ç áíéóü�ç�á C*C > N ó�ï óþìá �ïõ ðñþ�ïõêáíüíá ðïõ �ï ðåñéÝ÷åé, �ü�å ïé ðáñáó�Üóåéò (A+B+1)//2 êáé C*C, áðï�éìïýí�áé îáíÜü�áí åöáñìïó�åß ï äåý�åñïò êáíüíáò. Áõ�ü ìðïñåß íá áðïöåõ÷èåß �ñïðïðïéþí�áò �çísqrtInt0 þó�å íá ÷ñçóéìïðïéåß Ýíá âïçèç�éêü êá�çãüñçìá, �ï ïðïßï èá êáèïñßæåé �á íÝáüñéá �ïõ äéáó�Þìá�ïò áíáæÞ�çóçò (ìÝóù �ùí äýï �åëåõ�áßùí ïñéóìÜ�ùí �ïõ).sqrtInt(N,R) :- sqrtHlp(N,0,N,R).sqrtHlp(N,A,A,A).sqrtHlp(N,A,B,R) :- A < B,C is (A+B+1)//2,K is C*C,newInterval(N,C,K,A,B,Anew,Bnew),sqrtHlp(N,Anew,Bnew,R).newInterval(N,C,K,A,B,A,D) :- K > N, D is C-1.newInterval(N,C,K,A,B,C,B) :- K =< N.Ôá âÞìá�á ãéá �çí áðÜí�çóç ó�çí åñþ�çóç?- sqrtInt(12,×)äßíïí�áé ðáñáêÜ�ù:[0℄ sqrtInt(12,X){X = X}1 --> 1sqrtInt(N1,R1) :- sqrtHlp(N1,0,N1,R1).{N1 = 12, R1 = X}[1℄ sqrtHlp(12,0,12,X){X = X}1 --> 3sqrtHlp(N2,A2,B2,R2) :- A2 < B2, C2 is (A2+B2+1)//2, K2 is C2*C2,newInterval(N2,C2,K2,A2,B2,Anew2,Bnew2),sqrtHlp(N2,Anew2,Bnew2,R2).{N2 = 12, A2 = 0, B2 = 12, R2 = X}54

[2℄ 0 < 12, C2 is (0+12+1)//2, K2 is C2*C2,newInterval(12,C2,K2,0,12,Anew2,Bnew2),sqrtHlp(12,Anew2,Bnew2,X){X = X}< : build-in{}[3℄ C2 is (0+12+1)//2, K2 is C2*C2, newInterval(12,C2,K2,0,12,Anew2,Bnew2),sqrtHlp(12,Anew2,Bnew2,X){X = X}is : build-in{C2 = 6}[4℄ K2 is 6*6, newInterval(12,6,K2,0,12,Anew2,Bnew2),sqrtHlp(12,Anew2,Bnew2,X){X = X}is : build-in{K2 = 36}[5℄ newInterval(12,6,36,0,12,Anew2,Bnew2), sqrtHlp(12,Anew2,Bnew2,X){X = X}1 --> 4newInterval(N3,C3,K3,A3,B3,A3,D3) :- K3 > N3, D3 is C3-1.{N3 = 12, C3 = 6, K3 = 36, A3 = 0, B3 = 12, Anew2 = 0, D3 = Bnew2}[6℄ 36 > 12, Bnew2 is 6-1, sqrtHlp(12,0,Bnew2,X){X = X}> : build-in{}[7℄ Bnew2 is 6-1, sqrtHlp(12,0,Bnew2,X){X = X}is : build-in{Bnew2 = 5}[8℄ sqrtHlp(12,0,5,X){X = X}1 --> 3sqrtHlp(N4,A4,B4,R4) :- A4 < B4, C4 is (A4+B4+1)//2, K4 is C4*C4,newInterval(N4,C4,K4,A4,B4,Anew4,Bnew4),sqrtHlp(N4,Anew4,Bnew4,R4).{N4 = 12, A4 = 0, B4 = 5, R4 = X}[9℄ 0 < 5, C4 is (0+5+1)//2, K4 is C4*C4,newInterval(12,C4,K4,0,5,Anew4,Bnew4),sqrtHlp(12,Anew4,Bnew4,X){X = X}< : build-in{} 55

[10℄ C4 is (0+5+1)//2, K4 is C4*C4, newInterval(12,C4,K4,0,5,Anew4,Bnew4),sqrtHlp(12,Anew4,Bnew4,X){X = X}is : build-in{C4 = 3}[11℄ K4 is 3*3, newInterval(12,3,K4,0,5,Anew4,Bnew4),sqrtHlp(12,Anew4,Bnew4,X){X = X}is : build-in{K4 = 9}[12℄ newInterval(12,3,9,0,5,Anew4,Bnew4), sqrtHlp(12,Anew4,Bnew4,X){X = X}1 --> 4newInterval(N5,C5,K5,A5,B5,A5,D5) :- K5 > N5, D5 is C5-1.{N5 = 12, C5 = 3, K5 = 9, A5 = 0, B5 = 5, Anew4 = 0, D5 = Bnew4}[13℄ 9 > 12, Bnew4 is 3-1, sqrtHlp(12,0,Bnew4,X){X = X}> : build-infailure - ba ktra king[12℄ newInterval(12,3,9,0,5,Anew4,Bnew4), sqrtHlp(12,Anew4,Bnew4,X){X = X}5 --> 5newInterval(N6,C6,K6,A6,B6,C6,B6) :- K6 =< N6.{N6 = 12, C6 = 3, K6 = 9, A6 = 0, B6 = 5, Anew4 = 3, Bnew4 = 5}[13℄ 9 =< 12, sqrtHlp(12,3,5,X){X = X}=< : build-in{}[14℄ sqrtHlp(12,3,5,X){X = X}1 --> 3sqrtHlp(N7,A7,B7,R7) :- A7 < B7, C7 is (A7+B7+1)//2, K7 is C7*C7,newInterval(N7,C7,K7,A7,B7,Anew7,Bnew7),sqrtHlp(N7,Anew7,Bnew7,R7).{N7 = 12, A7 = 3, B7 = 5, R7 = X}[15℄ 3 < 5, C7 is (3+5+1)//2, K7 is C7*C7,newInterval(12,C7,K7,3,5,Anew7,Bnew7),sqrtHlp(12,Anew7,Bnew7,X){X = X}< : build-in{} 56

[16℄ C7 is (3+5+1)//2, K7 is C7*C7, newInterval(12,C7,K7,3,5,Anew7,Bnew7),sqrtHlp(12,Anew7,Bnew7,X){X = X}is : build-in{C7 = 4}[17℄ K7 is 4*4, newInterval(12,4,K7,3,5,Anew7,Bnew7),sqrtHlp(12,Anew7,Bnew7,X){X = X}is : build-in{K7 = 16}[18℄ newInterval(12,4,16,3,5,Anew7,Bnew7), sqrtHlp(12,Anew7,Bnew7,X){X = X}1 --> 4newInterval(N8,C8,K8,A8,B8,A8,D8) :- K8 > N8, D8 is C8-1.{N8 = 12, C8 = 4, K8 = 16, A8 = 3, B8 = 5, Anew2 = 3, D8 = Bnew7}[19℄ 16 > 12, Bnew7 is 4-1, sqrtHlp(12,3,Bnew7,X){X = X}> : build-in{}[20℄ Bnew7 is 4-1, sqrtHlp(12,3,Bnew7,X){X = X}is : build-in{Bnew7 = 3}[21℄ sqrtHlp(12,3,3,X){X = X}1 --> 2sqrtHlp(N9,A9,A9,A9).{N9 = 12, A9 = 3, X = 3}[22℄ #{X = 3}--------------------------------------------------------------X = 3.1.16 Ëßó�åòÏé ëßó�åò ó�çí Prolog ðáñéó�Üíïí�áé ðáñáèÝ�ïí�áò �á ó�ïé÷åßá �ïõò ìÝóá óå áãêýëåò,÷ùñßæïí�Üò �á ìå êüììá. Ìßá ëßó�á åðé�ñÝðå�áé íá ðåñéÝ÷åé üñïõò ïðïéáóäÞðï�å ìïñöÞò,áêüìç êáé ëßó�åò.�éá ðáñÜäåéãìá ïé [a,b, ℄, [1,2,3,4℄ êáé [32, 'Chris', <><><>, X, [a, 1℄, s(0)℄åßíáé áðïäåê�Ýò ëßó�åò. Ç êåíÞ ëßó�á óõìâïëßæå�áé ìå [℄.57

ÏíïìÜæïõìå êåöáëÞ ìéáò ìç êåíÞò ëßó�áò �ï ðñþ�ï ó�ïé÷åßï �çò êáé ïõñÜ �ç ëßó�á ðïõáðïìÝíåé áí äéáãñÜøïõìå �çí êåöáëÞ. Åíáëëáê�éêÜ ãñÜöïõìå [H|T℄ ãéá íá äçëþóïõìå�ç ëßó�á ìå êåöáëÞ H êáé ïõñÜ T.?- [H|T℄ = [a,b, ℄.H = aT = [b, ℄�åíéêü�åñá ãñáöïõìå [X1,X2,...,Xk|T℄ ãéá íá ðáñáó�Þóïõìå �ç ëßó�á ó�çí ïðïßá �áðñþ�á k ó�ïé÷åßá åßíáé �á X1, X2, . . . , Xk êáé ç ëßó�á ðïõ áðïìÝíåé áí äéáãñÜøïõìå �áó�ïé÷åßá áõ�Ü åßíáé ç T?- [X1,X2,X3|T℄ = [1,2,3,4,5℄.X1 = 1X2 = 2X3 = 3T = [4,5℄Óýìöùíá ìå �á ðáñáðÜíù ç ëßó�á [a,b, ,d℄ Ý÷åé �éò ðáñáêÜ�ù åíáëëáê�éêÝò ðåñéãñá-öÝò: [a|[b, ,d℄℄, [a,b|[ ,d℄℄, [a,b, |[d℄℄ êáé [a,b, ,d|[℄℄Ç áíáðáñÜó�áóç �ùí ó�ïé÷åßùí ìßáò ëßó�áò ìÝóá óå áãêýëåò åßíáé ç åîù�åñéêÞ áíáðá-ñÜó�áóç ðïõ ÷ñçóéìïðïéåß�áé áðü �çí Prolog ãéá íá äéáâÜæåé êáé íá åìöáíßæåé �éò ëßó�åò.Åóù�åñéêÜ ìßá ëßó�á ðáñéó�Üíå�áé ùò üñïò ðïõ ó÷çìá�ßæå�áé áðü �ï óõíáñ�çóéáêü óýì-âïëï . �ï ïðïßï ðáßñíåé ùò ïñßóìá�á �çí êåöáëÞ êáé �çí ïõñÜ �çò ëßó�áò. �éá ðáñÜäåéãìáç ëßó�á [a,b, ,d℄ åóù�åñéêá ðáñéó�Üíå�áé ùò: .(a,.(b,.( ,.(d,[℄)))).?- X = .(a,.(b,.( ,.(d,[℄)))).X = [a,b, ,d℄Ç åóù�åñéêÞ áíáðáñÜó�áóç åßíáé äõóáíÜãíùó�ç êáé áõ�üò åßíáé ï ëüãïò ãéá �ïí ïðïßïó�çí Prolog åðéëÝãå�áé äéáöïñå�éêÞ åîù�åñéêÞ áíáðáñÜó�áóç. Áðü �çí Üëëç, ç åóù�åñéêÞáíáðáñÜó�áóç ìßáò ëßó�áò åßíáé üñïò ìå �ç óõíÞèç ìïñöÞ êáé ìðïñåß ãéá ðáñÜäåéãìá íááðï�åëÝóåé åßóïäï ó�ïí áëãüñéèìï �áõ�ïðïßçóçò:�áñÜäåéãìá 24: �éá íá äïýìå áí ïé ëßó�åò [[a,b℄|[×,Õ℄℄ êáé [Z,W|[ ,d℄℄ ìðïñïýííá �áõ�ïðïéçèïýí �éò ìå�á�ñÝðïõìå ó�çí åóù�åñéêÞ �ïõò áíáðáñÜó�áóç êáé åê�åëïýìå�ïí áëãüñéèìï �áõ�ïðïßçóçò:âÞìá E1 / E2 äåóìåýóåéò1 .( .(a,.(b,[℄)) ,.(X,.(Y,[℄))) {X = X, Y = Y,.( Æ ,.(W,.( ,.(d,[℄)))) Z = Z, W = W}2 .(.(a,.(b,[℄)),.( X ,.(Y,[℄))) {X = X, Y = Y,.(.(a,.(b,[℄)),.( W ,.( ,.(d,[℄)))) Z = .(a,.(b,[℄)), W = W}3 .(.(a,.(b,[℄)),.(X,.( Y ,[℄))) {X = X, Y = Y,.(.(a,.(b,[℄)),.(X,.( ,.(d,[℄)))) Z = .(a,.(b,[℄)), W = X}4 .(.(a,.(b,[℄)),.(X,.( , [℄ ))) {X = X, Y = ,.(.(a,.(b,[℄)),.(X,.( , .(d,[℄) ))) Z = .(a,.(b,[℄)), W = X}58

Ç �áõ�ïðïßçóç áðï�õã÷Üíåé. Áõ�ü åßíáé áíáìåíüìåíï êáèþò ç ìßá ëßó�á Ý÷åé �ñßá ó�ïé-÷åßá (áðü �á ïðïßá �ï ðñþ�ï åßíáé ëßó�á) åíþ ç äåý�åñç Ý÷åé �Ýóóåñá ó�ïé÷åßá. .�áñÜäåéãìá 25: �éá íá äïýìå áí ïé ëßó�åò [X,Y|Y℄ êáé [Y,[2℄,Z℄ ìðïñïýí íá �áõ�ï-ðïéçèïýí åê�åëïýìå �ïí áëãüñéèìï �áõ�ïðïßçóçò ìå åßóïäï �éò åóù�åñéêÝò �ïõò áíáðá-ñáó�Üóåéò:âÞìá E1 / E2 äåóìåýóåéò1 .( X ,.(Y,Y)) {X = X, Y = Y,.( Y ,.(.(2,[℄),.(Z,[℄))) Z = Z }

2 .(X,.( X ,X)) {X = X, Y = X,.(X,.( .(2,[℄) ,.(Z,[℄))) Z = Z }

3 .(.(2,[℄),.(.(2,[℄),.( 2 ,[℄))) {X = .(2,[℄), Y = .(2,[℄),.(.(2,[℄),.(.(2,[℄),.( Z ,[℄))) Z = Z }

4 .(.(2,[℄),.(.(2,[℄),.(2,[℄))) {X = .(2,[℄), Y = .(2,[℄),.(.(2,[℄),.(.(2,[℄),.(2,[℄))) Z = 2 }Ó�çí áñ÷Þ �ïõ �Ý�áñ�ïõ âÞìá�ïò ïé åêöñÜóåéò åßíáé ßäéåò, óõíåðþò ïé áñ÷éêÝò ëßó�åò �áõ-�ïðïéïýí�áé ìå ðéï ãåíéêü �áõ�ïðïéç�Þ {X = [2℄, Y = [2℄, Z = 2}. .Ó�ç óõíÝ÷åéá èá ðåñéãñÜøïõìå ïñéóìÝíá êá�çãïñÞìá�á ðïõ ðáßñíïõí ùò ïñßóìá�á ëß-ó�åò. �éá íá åðåîåñãáó�ïýìå �á ó�ïé÷åßá ìßáò ëßó�áò, ÷ñçóéìïðïéïýìå áíáäñïìÞ.�áñÜäåéãìá 26: Ýëåã÷ïò ãéá �ï áí Ýíá ó�ïé÷åßï åìöáíßæå�áé óå ìßá ëßó�á.Ôï êá�çãüñçìá member(X,L) áëçèåýåé áí �ï ó�ïé÷åßï X åìöáíßæå�áé ó�ç ëßó�á L. Áõ�üóõìâáßíåé áí éó÷ýåé Ýíá áðü �á ðáñáêÜ�ù: (á) �ï X åßíáé ç êåöáëÞ �çò ëßó�áò, ðïõ óç-ìáßíåé ü�é ç ëßó�á åßíáé �çò ìïñöÞò [X|T℄ Þ (â) �ï X åìöáíßæå�áé ó�çí ïõñÜ �çò ëßó�áò,ðïõ óçìáßíåé ü�é ç ëßó�á åßíáé �çò ìïñöÞò [H|T℄ êáé áëçèåýåé �ï member(X,T).member(X,[X|T℄).member(X,[H|T℄) :- member(X,T).Áí ç ëßó�á åßíáé êåíÞ �ü�å äåí ãßíå�áé �áõ�ïðïßçóç ìå êáíÝíáí êáíüíá êáé åðéó�ñÝöå�áéno.H Prolog ãéá íá áðáí�Þóåé ó�çí åñþ�çóç?- member(b,[a,b, ℄).èá åê�åëÝóåé �á ðáñáêÜ�ù âÞìá�á:[0℄ member(b,[a,b, ℄){}1 --> 2member(X1,[H1|T1℄) :- member(X1,T1).{X1 = b, H1 = a, T1 = [b, ℄} 59

[1℄ member(b,[b, ℄){}1 --> 1member(X2,[X2|T2℄).{X2 = b, T2 = [ ℄}[2℄ #{}--------------------------------------------------------------yes×ñçóéìïðïéþí�áò �ï êá�çãüñçìá member ìðïñïýìå íá âñïýìå �á ó�ïé÷åßá ìßáò ëßó�áò Þíá âñïýìå �éò ëßó�åò ðïõ ðåñéÝ÷ïõí Ýíá äåäïìÝíï ó�ïé÷åßï:?- member(X,[1, ,[2,3℄,f(2)℄).X = 1 ;X = ;X = [2,3℄ ;X = f(2) ;no?- member(b,L).L = [b|_6℄ ;L = [_5,b|_10℄ ;L = [_5,_9,b|_14℄ ;...Ç áðÜí�çóç ó�çí �åëåõ�áßá åñþ�çóç åðéó�ñÝöåé ìéá ðñïò ìßá üëåò �éò ëßó�åò ðïõ ðåñéÝ-÷ïõí �ï b. Ó�çí áðÜí�çóç õðÜñ÷åé ìßá ëßó�á ãéá êÜèå ðéèáíÞ èÝóç åìöÜíéóçò �ïõ b. Ïéìå�áâëç�Ýò áñéó�åñÜ �ïõ b ðáñéó�Üíïõí �á ó�ïé÷åßá �çò ëßó�áò ðïõ ðñïçãïýí�áé �ïõ bêáé ìðïñåß íá Ý÷ïõí ïðïéáäÞðï�å �éìÞ. Ç ìå�áâëç�Þ äåîéÜ �ïõ b (ìå�Ü �ï |) ðáñéó�Üíåé�ï õðüëïéðï �ìÞìá �çò ëßó�áò �ï ïðïßï ìðïñåß íá Ý÷åé ïðïéïäÞðï�å ìÞêïò êáé íá ðåñéÝ÷åéïðïéáäÞðï�å ó�ïé÷åßá. (Ôá ïíüìá�á �ùí ìå�áâëç�þí ðñïÝñ÷ïí�áé áðü �ç ìå�ïíïìáóßá�ùí ìå�áâëç�þí ó�ïõò êáíüíåò áðü �ï äéåñìçíÝá �çò C-Prolog.) .�áñÜäåéãìá 27: äéáãñáöÞ åíüò äåäïìÝíïõ ó�ïé÷åßïõ áðü ëßó�á.Ôï êá�çãüñçìá delete(X,L1,L2) áëçèåýåé áí ç L2 ðñïêýð�åé ìå äéáãñáöÞ ìßáò ïðïéáó-äÞðï�å åìöÜíéóçò �ïõ X áðü �ç L1. Ï ïñéóìüò �ïõ delete ãßíå�áé ìå âÜóç �éò ðáñáêÜ�ùðáñá�çñÞóåéò: (á) áí �ï ó�ïé÷åßï X ðïõ äéáãñÜöå�áé åßíáé ç êåöáëÞ �çò L1, �ü�å ç L1åßíáé �çò ìïñöÞò [X|T℄ êáé ç ëßó�á L2 ðïõ ðñïêýð�åé �áõ�ßæå�áé ìå �çí T êáé (â) áí �ïó�ïé÷åßï X äéáãñÜöå�áé áðü �çí ïõñÜ �çò L1, �ü�å ïé L1 êáé L2 Ý÷ïõí �çí ßäéá êåöáëÞ Hêáé ç ïõñÜ S �çò L2 ðñïêýð�åé ìå äéáãñáöÞ �ïõ X áðü �çí ïõñÜ T �çò L1.delete(X,[X|T℄,T).delete(X,[H|T℄,[H|S℄) :- delete(X,T,S).�éá íá âñïýìå �éò ëßó�åò ðïõ ðñïêýð�ïõí áðü �çí äéáãñáöÞ �ïõ 4 áðü �ç ëßó�á [7,4,5,4,1℄êÜíïõìå �çí åñþ�çóç?- delete(4,[7,4,5,4,1℄,L) 60

êáé ãñÜöïõìå ; ìå�Ü áðü êÜèå áðÜí�çóç. �éá íá áðáí�çèåß ç åñþ�çóç áõ�Þ åê�åëïýí�áé�á ðáñáêÜ�ù âÞìá�á:[0℄ delete(4,[7,4,5,4,1℄,L){L = L}1 --> 2delete(X1,[H1|T1℄,[H1|S1℄) :- delete(X1,T1,S1).{L = [7|S1℄, X1 = 4, H1 = 7, T1 = [4,5,4,1℄}[1℄ delete(4,[4,5,4,1℄,S1){L = [7|S1℄}1 --> 1delete(X2,[X2|T2℄,T2).{S1 = [5,4,1℄, X2 = 4, T2 = [5,4,1℄}[2℄ #{L = [7,5,4,1℄}--------------------------------------------------------------L = [7,5,4,1℄ ;--------------------------------------------------------------[1℄ delete(4,[4,5,4,1℄,S1){L = [7|S1℄}2 --> 2delete(X3,[H3|T3℄,[H3|S3℄) :- delete(X3,T3,S3).{S1 = [4|S3℄℄, X3 = 4, H3 = 4, T3 = [5,4,1℄}[2℄ delete(4,[5,4,1℄,S3){L = [7,4|S3℄}1 --> 2delete(X4,[H4|T4℄,[H4|S4℄) :- delete(X4,T4,S4).{S3 = [5|S4℄, X4 = 4, H4 = 5, T4 = [4,1℄}[3℄ delete(4,[4,1℄,S4){L = [7,4,5|S4℄}1 --> 1delete(X5,[X5|T5℄,T5).{S4 = [1℄, X5 = 4, T5 = [1℄}[4℄ #{L = [7,4,5,1℄}--------------------------------------------------------------L = [7,4,5,1℄ ;--------------------------------------------------------------[3℄ delete(4,[4,1℄,S4){L = [7,4,5|S4℄}2 --> 2delete(X6,[H6|T6℄,[H6|S6℄) :- delete(X6,T6,S6).{S4 = [4|S6℄℄, X6 = 4, H6 = 4, T6 = [1℄}61

[4℄ delete(4,[1℄,S6){L = [7,4,5,4|S6℄}1 --> 2delete(X7,[H7|T7℄,[H7|S7℄) :- delete(X7,T7,S7).{S6 = [1|S7℄, X7 = 4, H7 = 1, T7 = [℄}[5℄ delete(4,[℄,S7){L = [7,4,5,4,1|S7℄}1 --> EOPfailure - ba ktra hing[4℄ delete(4,[1℄,S6){L = [7,4,5,4|S6℄}EOPfailure - ba ktra hing[3℄ delete(4,[4,1℄,S4){L = [7,4,5|S4℄}EOPfailure - ba ktra hing[2℄ delete(4,[5,4,1℄,S3){L = [7,4|S3℄}EOPfailure - ba ktra hing[1℄ delete(4,[4,5,4,1℄,S1){L = [7|S1℄}EOPfailure - ba ktra hing[0℄ delete(4,[7,4,5,4,1℄,L){L = L}EOPfailure--------------------------------------------------------------no�áñá�çñoýìå ü�é áí ç L2 ðñïêýð�åé ìå äéáãñáöÞ ìßáò åìöÜíéóçò �ïõ X áðü �çí L1, �ü�åç L1 ðñïêýð�åé ìå åéóáãùãÞ �ïõ X óå ìßá ïðïéáäÞðï�å èÝóç �çò L2. �éá íá âñïýìå �éòëßó�åò ðïõ ðñïêýð�ïõí ìå åéóáãùãÞ �ïõ a ó�ç ëßó�á [b, ℄ êÜíïõìå �çí åñþ�çóç| ?- delete(a,L,[b, ℄).L = [a,b, ℄ ;L = [b,a, ℄ ;L = [b, ,a℄ ;no×ñçóéìïðïéþí�áò �ï delete ìðïñïýìå íá åëÝãîïõìå áí ìßá ëßó�á ðñïêýð�åé áðü ìßá Üëëçìå äéáãñáöÞ åíüò ó�ïé÷åßïõ 62

?- delete(_,[a, ,b,a℄,[a,b,a℄).yes?- delete(_,[a, ,b,a℄,[a,b℄).noÌðïñïýìå åðßóçò íá êÜíïõìå åñù�Þóåéò ìå ðåñéóóü�åñåò áðü ìßá ìå�áâëç�Ýò:?- delete(X,L1,L2).X = _0L1 = [_0|_2℄L2 = _2 ;X = _0L1 = [_8,_0|_10℄L2 = [_8|_10℄ ;X = _0L1 = [_8,_15,_0|_17℄L2 = [_8,_15|_17℄ ;....�áñÜäåéãìá 28: ìÞêïò ëßó�áò.Ïñßæïõìå �ï êá�çãüñçìá lengthList(L,N) �ï ïðïßï áëçèåýåé áí �ï ìÞêïò �çò ëßó�áò Låßíáé N. Ôï ìÞêïò �çò êåíÞò ëßó�áò åßíáé 0, åíþ �ï ìÞêïò ìßáò ìç êåíÞò ëßó�áò åßíáé ßóïìå �ï ìÞêïò �çò ïõñÜò �çò áõîçìÝíï êá�Ü 1.lengthList([℄,0).lengthList([H|T℄,N) :- lengthList(T,M),N is M+1.�éá íá âñïýìå �ï ìÞêïò �çò ëßó�áò [a,b, ℄ êÜíïõìå �çí åñþ�çóç?- lengthList([a,b, ℄,N)Ç áðÜí�çóç ó�çí åñþ�çóç áõ�Þ ãßíå�áé åê�åëþí�áò �á ðáñáêÜ�ù âÞìá�á:[0℄ lengthList([a,b, ℄,N){N = N}1 --> 2lengthList([H1|T1℄,N1) :- lengthList(T1,M1), N1 is M1+1.{H1 = a, T1 = [b, ℄, N1 = N}[1℄ lengthList([b, ℄,M1), N is M1+1{N = N}1 --> 2lengthList([H2|T2℄,N2) :- lengthList(T2,M2), N2 is M2+1.63

{H2 = b, T2 = [ ℄, N2 = M1}[2℄ lengthList([ ℄,M2), M1 is M2+1, N is M1+1{N = N}1 --> 2lengthList([H3|T3℄,N3) :- lengthList(T3,M3), N3 is M3+1.{H3 = , T3 = [℄, N3 = M2}[3℄ lengthList([℄,M3), M2 is M3+1, M1 is M2+1, N is M1+1{N = N}1 --> 1lengthList([℄,0).{M3 = 0}[4℄ M2 is 0+1, M1 is M2+1, N is M1+1{N = N}is : build-in{M2 = 1}[5℄ M1 is 1+1, N is M1+1{N = N}is : build-in{M1 = 2}[6℄ N is 2+1{N = N}is : build-in{N = 3}[7℄ #{N = 3}--------------------------------------------------------------N = 3Ç Prolog åðéó�ñÝöåé áðÜí�çóç áêüìç êáé áí êÜíïõìå åñþ�çóç ìå äýï ìå�áâëç�Ýò þòïñßóìá�á �ïõ lengthList(L,N) Ôá âÞìá�á ãéá �çí áðÜí�çóç óå ìéá �Ý�ïéá åñþ�çóçäßíïí�áé ðáñáêÜ�ù:[0℄ lengthList(L,N){L = L, N = N}1 --> 1lengthList([℄,0).{L = [℄, N = 0}[1℄ #{L = [℄, N = 0}--------------------------------------------------------------L = [℄N = 0 ;--------------------------------------------------------------64

[0℄ lengthList(L,N){L = L, N = N}2 --> 2lengthList([H1|T1℄,N1) :- lengthList(T1,M1), N1 is M1+1.{L = [H1|T1℄, N1 = N}[1℄ lengthList(T1,M1), N is M1+1{L = [H1|T1℄, N = N}1 --> 1lengthList([℄,0).{T1 = [℄, M1 = 0}[2℄ N is 0+1{L = [H1℄, N = N}is : build-in{N = 1}[3℄ #{L = [H1℄, N = 1}--------------------------------------------------------------L = [H1℄N = 1 ;--------------------------------------------------------------[2℄ N is 0+1[1℄ lengthList(T1,M1), N is M1+1{L = [H1|T1℄, N = N}2 --> 2lengthList([H2|T2℄,N2) :- lengthList(T2,M2), N2 is M2+1.{T1 = [H2|T2℄, N2 = M1}[2℄ lengthList(T2,M2), M1 is M2+1, N is M1+1{L = [H1,H2|T2℄, N = N}1 --> 1lengthList([℄,0).{T2 = [℄, M2 = 0}[3℄ M1 is 0+1, N is M1+1{L = [H1,H2℄, N = N}is : build-in{M1 = 1}[2℄ N is 1+1{L = [H1,H2℄, N = N}is : build-in{N = 2}[3℄ #{L = [H1,H2℄, N = 2} 65

--------------------------------------------------------------L = [H1,H2℄N = 2 ;--------------------------------------------------------------...ÓõíÞèùò ïé õëïðïéÞóåéò �çò Prolog ðáñÝ÷ïõí Ýíá ðñïêáèïñéóìÝíï êá�çãüñçìá lengthðïõ åßíáé éóïäýíáìï �ïõ lengthList .�áñÜäåéãìá 29: åýñåóç �ïõ n-ïó�ïý ó�ïé÷åßïõ ìéáò ëßó�áò.Ôï êá�çãüñçìá elemList(N,L,X) áëçèåýåé áí �ï N-ïó�ü ó�ïé÷åßï �çò ëßó�áò L åßíáé�ï X. Ôï elemList(N,L,X) ìðïñåß íá áëçèåýåé ìüíï ó�çí ðåñßð�ùóç ðïõ ç ëßó�á åßíáé ìÞêåíÞ, ðïõ åßíáé äçëáäÞ �çò ìïñöÞò [H|T℄. Ôï ðñþ�ï ó�ïé÷åßï �çò [H|T℄ åßíáé ðñïöáíþò�ï H. Ôï N-ïó�ü ó�ïé÷åßï �çò [H|T℄ åßíáé �ï M-ïó�ü ó�ïé÷åßï �çò T, üðïõ ç �éìÞ �ïõ Måßíáé N-1.elemList(1,[H|T℄,H).elemList(N,[H|T℄,X) :- M is N-1,elemList(M,T,X).Áí ç �éìÞ �çò N äåí áí�éó�ïé÷åß óå ó�ïé÷åßï �çò ëßó�áò �ü�å èá ðñïêýøåé ó�ü÷ïò ó�ïíïðïßï �ïõ äåý�åñï üñéóìá �ïõ elemList èá åßíáé ç êåíÞ ëßó�á. Ó�ï óçìåßï áõ�ü ç �áõ-�ïðïßçóç èá áðï�ý÷åé êáé ç áðÜí�çóç èá åßíáé noËüãù �çò ÷ñÞóçò �ïõ is, ç ìå�áâëç�Þ N èá ðñÝðåé íá åßíáé äåóìåõìÝíç óå áñéèìç�éêÞ�éìÞ, áëëéþò èá ðñïêýøåé ìÞíõìá ëÜèïõò.?- elemList(3,[1,9,6,8℄,X).X = 6?- elemList(5,[a,b, ℄,X).no?- elemList(-2,[a,b, ℄,X).no?- elemList(N,[1,9,6,8℄,8).! Error in arithmeti expression: not a number.�áñÜäåéãìá 30: óõíÝíùóç äýï ëéó�þí.Ôï êá�çãüñçìá on (S,L,R) áëçèåýåé ç R åßíáé ëßó�á ðïõ ðñïêýð�åé ìå óõíÝíùóç �ùí Sêáé L. Ï ïñéóìüò �ïõ on ó�çñßæå�áé ó�éò ðáñáêÜ�ù ðáñá�çñÞóåéò: (á) �ï áðï�Ýëåóìá�çò óõíÝíùóçò �çò êåíÞò ëßó�áò ìå �ç ëßó�á L åßíáé ç ßäéá ç L êáé (â) �ï áðï�Ýëåóìá �çòóõíÝíùóçò ìßáò ëßó�áò �çò ìïñöÞò [H|T℄ ìå �çí L åßíáé ç ëßó�á ìå êåöáëÞ �ï H êáé ïõñÜ�çí ëßó�á Q ðïõ ðñïêýð�åé áðü �ç óõíÝíùóç �ùí T êáé L.66

H

T L

Q

... ...

on ([℄,L,L). on ([H|T℄,L,[H|Q℄) :- on (T,L,Q).�éá íá âñïýìå �ç óõíÝíùóç �ùí ëéó�þí [a,b℄ êáé [ ,d,e℄ êÜíïõìå �çí åñþ�çóç:?- on ([a,b℄,[ ,d,e℄,L).L = [a,b, ,d,e℄Åðßóçò ìðïñïýìå íá âñïýìå üëá �á æåýãç ëéó�þí ó�á ïðïßá äéáóðÜ�áé ìßá äåäïìÝíç ëßó�á:?- on (A,B,[a,b, ℄).Ôá âÞìá�á ãéá �çí áðÜí�çóç ó�çí åñþ�çóç áõ�Þ äßíïí�áé ðáñáêÜ�ù:[0℄ on (A,B,[a,b, ℄){A = A, B = B}1 --> 1 on ([℄,L1,L1).{A = [℄, B = [a,b, ℄, L1 = [a,b, ℄}[1℄ #{A = [℄, B = [a,b, ℄}--------------------------------------------------------------A = [℄B = [a,b, ℄ ;--------------------------------------------------------------[0℄ on (A,B,[a,b, ℄){A = A, B = B}2 --> 2 on ([H2|T2℄,L2,[H2|S2℄) :- on (T2,L2,S2).{A = [a|T2℄, H2 = a, L2 = B, S2 = [b, ℄}[1℄ on (T2,B,[b, ℄){A = [a|T2℄, B = B}1 --> 1 on ([℄,L3,L3).{T2 = [℄, B = [b, ℄, L3 = [b, ℄}[2℄ #{A = [a℄, B = [b, ℄}--------------------------------------------------------------A = [a℄B = [b, ℄ ;--------------------------------------------------------------67

[1℄ on (T2,B,[b, ℄){A = [a|T2℄, B = B}2 --> 2 on ([H4|T4℄,L4,[H4|S4℄) :- on (T4,L4,S4).{T2 = [b|T4℄, H4 = b, L4 = B, S4 = [ ℄}[2℄ on (T4,B,[ ℄){A = [a,b|T4℄, B = B}1 --> 1 on ([℄,L5,L5).{T4 = [℄, B = [ ℄, L5 = [ ℄}[3℄ #{A = [a,b℄, B = [ ℄}--------------------------------------------------------------A = [a,b℄B = [ ℄ ;--------------------------------------------------------------[2℄ on (T4,B,[ ℄){A = [a,b|T4℄, B = B}2 --> 2 on ([H6|T6℄,L6,[H6|S6℄) :- on (T6,L6,S6).{T4 = [ |T6℄, H6 = , L6 = B, S6 = [℄}[3℄ on (T6,B,[℄){A = [a,b, |T6℄, B = B}1 --> 1 on ([℄,L7,L7).{T6 = [℄, B = [℄, L7 = [℄}[4℄ #{A = [a,b, ℄, B = [℄}--------------------------------------------------------------A = [a,b, ℄B = [℄ ;--------------------------------------------------------------[3℄ on (T6,B,[℄){A = [a,b, |T6℄, B = B}2 --> EOPfailure - ba ktra king[2℄ on (T4,B,[ ℄){A = [a,b|T4℄, B = B}EOPfailure - ba ktra king[1℄ on (T2,B,[b, ℄){A = [a|T2℄, B = B}EOP 68

failure - ba ktra king[0℄ on (A,B,[a,b, ℄){A = A, B = B}EOPfailure--------------------------------------------------------------no.�áñÜäåéãìá 31: Ýëåã÷ïò ãéá �ï áí ìßá ëßó�á áðï�åëåß õðïëßó�á ìßáò Üëëçò.Ôï êá�çãüñçìá sublist(S,L) áëçèåýåé ç ëßó�á S áðï�åëåß õðïëßó�á �çò L, äçëáäÞ áíüëá �á ó�ï÷åßá �çò S åìöáíßæïí�áé óõíå÷üìåíá êáé ìå �çí ßäéá óåéñÜ ó�çí L. Åßíáé åýêïëïíá äéáðéó�ùèåß ü�é ç S åßíáé õðïëßó�á �çò L, áí õðÜñ÷ïõí äýï ëßó�åò Q êáé R �Ý�ïéåò þó�åç óõíÝíùóç �ùí Q, S êáé R íá äßíåé �çí L.P

L

Q S R

Ôï êá�çãüñçìá sublist ïñßæå�áé áðü �ïí ðáñáêÜ�ù êáíüíá:sublist(S,L) :- on (Q,P,L), on (S,R,P).Ìðïñïýìå íá åëÝãîïõìå áí ìßá ëßó�á åßíáé õðïëßó�á ìßáò Üëëçò Þ íá âñïýìå üëåò �éòõðïëßó�åò ìßáò äåäïìÝíçò ëßó�áò:?- sublist([2,3℄,[1,2,3,4℄).yes?- sublist([2,4℄,[1,2,3,4,5℄).no?- sublist(S,[a,b, ℄).S = [℄ ;S = [a℄ ;S = [a,b℄ ;S = [a,b, ℄ ;S = [℄ ;S = [b℄ ;S = [b, ℄ ;S = [℄ ;S = [ ℄ ;S = [℄ ;no 69

Ç êåíÞ ëßó�á åðéó�ñÝöå�áé ùò �éìÞ �çò L ðïëëÝò öïñÝò ãéá �ï ðáñáêÜ�ù ëüãù: ç ëßó�á[a,b, ℄ ìðïñåß íá äéáóðáó�åß óå äýï ëßó�åò Q êáé P ìå �Ýóóåñåéò äéáöïñå�éêïýò �ñüðïõò,êáé ç P ìðïñåß ðÜí�á íá äéáóðáó�åß �çí êåíÞ êáé �ïí åáõ�ü �çò..�áñÜäåéãìá 32: áí�éó�ñïöÞ ëßó�áò.Ôï êá�çãüñçìá reverse(L,R) áëçèåýåé áí ç R åßíáé ç áí�ßó�ñïöç �çò L. �éá �ïí ïñé-óìü �ïõ reverse ÷ñçóéìïðïéïýìå Ýíá âïçèç�éêü êá�çãüñçìá on Reversed(L,S,R), �ïïðïßï áëçèåýåé áí ç áí ç R åßíáé �ï áðï�Ýëåóìá �çò óõíÝíùóçò �çò áí�ßó�ñïöçò �çò Lìå �çí S. Åßíáé ðñïöáíÝò ü�é �ï reverse(L,R) áëçèåýåé áí êáé ìüíï áí áëçèåýåé �ï on Reversed(L,[℄,R). �éá �ï ïñéóìü �ïõ on Reversed(L,S,R) ðáñá�çñïýìå ü�é ó�çëßó�á ðïõ ðñïêýð�åé áí óõíåíþóïõìå �çí áí�ßó�ñïöç ìßáò ìÞ êåíÞò ëßó�áò [H|T℄ ìå �çíS, �ï H âñßóêå�áé áìÝóùò ðñéí áðü �á ó�ïé÷åßá �çò S, åíþ áñéó�åñÜ �ïõ H âñßóêïí�áé �áó�ïé÷åßá �çò T óå áí�ßó�ñïöç óåéñÜ. Óõíåðþò ç ßäéá ëßó�á ìðïñåß íá ðñïêýøåé áí óõíå-íþóïõìå �çí áí�ßó�ñïöç �çò T ìå �çí [H|S℄L

R

H

S

TRreverse(L,R) :- on Reversed(L,[℄,R). on Reversed([℄,S,S). on Reversed([H|T℄,S,R) :- on Reversed(T,[H|S℄,R).�éá íá âñïýìå �çí áí�ßó�ñïöç �çò ëßó�áò [1,2,3℄ êÜíïõìå �çí åñþ�çóç:?- reverse([1,2,3℄,L).L = [3,2,1℄�áñá�çñïýìå ü�é �ï êá�çãüñçìá reverse åßíáé óõììå�ñéêü: áí ç R åßíáé ç áí�ßó�ñïöç�çò L �ü�å êáé ç áí ç L åßíáé ç áí�ßó�ñïöç �çò R. Óõíåðþò ìðïñïýìå íá âñïýìå �çíáí�ßó�ñïöç �çò ëßó�áò [1,2,3℄ êÜíïí�áò �çí åñþ�çóç:?- reverse(L,[1,2,3℄).L = [3,2,1℄�áñü�é ïé äýï åñù�Þóåéò åßíáé éóïäýíáìåò, �á âÞìá�á ðïõ áêïëïõèåß ç Prolog ãéá íá áðá-í�Þóåé óå êáèåìßá áðü áõ�Ýò åßíáé äéáöïñå�éêÜ. Åðßóçò áí æç�Þóïõìå äåý�åñç áðÜí�çóç,ìå �çí ðñþ�ç åñþ�çóç ç Prolog èá áðáí�Þóåé no, åíþ ìå �ç äåý�åñç èá åê�åëÝóåé ìßáá�Ýñìïíç áêïëïõèßá âçìÜ�ùí, ðïõ èá ðñïêáëÝóåé õðåñ÷åßëéóç ó�ïßâáò. Ôá âÞìá�á ðïõèá åê�åëåó�ïýí ãéá íá áðáí�çèåß ç ðñþ�ç åñþ�çóç åßíáé �á ðáñáêÜ�ù:[0℄ reverse([1,2,3℄,L).{L = L}1 --> 1reverse(L1,R1) :- on Reversed(L1,[℄,R1).70

{L1 = [1,2,3℄, R1 = L}[1℄ on Reversed([1,2,3℄,[℄,L){L = L}1 --> 3 on Reversed([H2|T2℄,L2,R2) :- on Reversed(T2,[H2|L2℄,R2).{H2 = 1, T2 = [2,3℄, L2 = [℄, R2 = L}[2℄ on Reversed([2,3℄,[1℄,L){L = L}1 --> 3 on Reversed([H3|T3℄,L3,R3) :- on Reversed(T3,[H3|L3℄,R3).{H3 = 2, T3 = [3℄, L3 = [1℄, R3 = L}[3℄ on Reversed([3℄,[2,1℄,L){L = L}1 --> 3 on Reversed([H4|T4℄,L4,R4) :- on Reversed(T4,[H4|L4℄,R4).{H4 = 3, T4 = [℄, L4 = [2,1℄, R4 = L}[4℄ on Reversed([℄,[3,2,1℄,L){L = L}1 --> 2 on Reversed([℄,L5,L5).{L = [3,2,1℄, L5 = [3,2,1℄}[5℄ #{L = [3,2,1℄}--------------------------------------------------------------L = [3,2,1℄ ;--------------------------------------------------------------[4℄ on Reversed([℄,[3,2,1℄,L){L = L}3 --> EOPfailure - ba ktra king[3℄ on Reversed([3℄,[2,1℄,L){L = L}EOPfailure - ba ktra king[2℄ on Reversed([2,3℄,[1℄,L){L = L}EOPfailure - ba ktra king[1℄ on Reversed([1,2,3℄,[℄,L){L = L}EOP 71

failure - ba ktra king[0℄ reverse([1,2,3℄,L).{L = L}2 --> EOPfailure--------------------------------------------------------------noÔá âÞìá�á ðïõ èá åê�åëåó�ïýí ãéá íá áðáí�çèåß ç äåý�åñç åñþ�çóç åßíáé �á ðáñáêÜ�ù:[0℄ reverse(L,[1,2,3℄).{L = L}1 --> 1reverse(L1,R1) :- on Reversed(L1,[℄,R1).{L1 = L, R1 = [1,2,3℄}[1℄ on Reversed(L,[℄,[1,2,3℄){L = L}1 --> 3 on Reversed([H2|T2℄,L2,R2) :- on Reversed(T2,[H2|L2℄,R2).{L = [H2|T2℄, L2 = [℄, R2 = [1,2,3℄}[2℄ on Reversed(T2,[H2℄,[1,2,3℄){L = [H2|T2℄}1 --> 3 on Reversed([H3|T3℄,L3,R3) :- on Reversed(T3,[H3|L3℄,R3).{T2 = [H3|T3℄, L3 = [H2℄, R3 = [1,2,3℄}[3℄ on Reversed(T3,[H3,H2℄,[1,2,3℄){L = [H2,H3|T3℄}1 --> 3 on Reversed([H4|T4℄,L4,R4) :- on Reversed(T4,[H4|L4℄,R4).{T3 = [H4|T4℄, L4 = [H3,H2℄, R4 = [1,2,3℄}[4℄ on Reversed(T4,[H4,H3,H2℄,[1,2,3℄){L = [H2,H3,H4|T4℄}1 --> 2 on Reversed([℄,L5,L5).{T4 = [℄, H4 = 1, H3 = 2, H2 = 3, L5 = [1,2,3℄}[5℄ #{L = [3,2,1℄}--------------------------------------------------------------L = [3,2,1℄ ;--------------------------------------------------------------[4℄ on Reversed(T4,[H4,H3,H2℄,[1,2,3℄){L = [H2,H3,H4|T4℄}3 --> 3 on Reversed([H6|T6℄,L6,R6) :- on Reversed(T6,[H6|L6℄,R6).72

{T4 = [H6|T6℄, L6 = [H4,H3,H2℄, R6 = [1,2,3℄}[5℄ on Reversed(T6,[H6,H4,H3,H2℄,[1,2,3℄){L = [H2,H3,H4,H6|T6℄}1 --> 3 on Reversed([H7|T7℄,L7,R7) :- on Reversed(T7,[H7|L7℄,R7).{T6 = [H7|T7℄, L7 = [H6,H4,H3,H2℄, R7 = [1,2,3℄}[6℄ on Reversed(T7,[H7,H6,H4,H3,H2℄,[1,2,3℄){L = [H2,H3,H4,H6,H7|T6℄}1 --> 3 on Reversed([H8|T8℄,L8,R8) :- on Reversed(T8,[H8|L8℄,R8).{T7 = [H8|T8℄, L8 = [H7,H6,H4,H3,H2℄, R8 = [1,2,3℄}[7℄ on Reversed(T8,[H8,H7,H6,H4,H3,H2℄,[1,2,3℄){L = [H2,H3,H4,H6,H7,H8|T6℄}...�áñá�çñïýìå ü�é ãéá íá áðáí�Þóåé ó�ç äåý�åñç åñþ�çóç, ç Prolog ðáñÜãåé �ç ãåíéêÞìïñöÞ ëßó�áò ìÞêïõò n áõîÜíïí�áò óõíå÷þò �ï n êáé �ç óõãêñßíåé ìå �ç äåäïìÝíç ëßó�á.Ìå�Ü �çí ðñþ�ç åðé�õ÷ßá óõíå÷ßæåé íá ðáñÜãåé ëßó�åò ìåãáëý�åñïõ ìÞêïõò, óõíåðþò ç�áõ�ïðïßçóç ìå �ç äåäïìÝíç ëßó�á áðï�õã÷Üíåé óõíå÷þò. .�áñÜäåéãìá 33: �áîéíüìçóç ëßó�áò ìå åéóáãùãÞ.ÈÝëïõìå íá ïñßóïõìå �ï êá�çãüñçìá insSort(L,S) �ï ïðïßï áëçèåýåé áí ç S åßíáé ç�áîéíïìçìÝíç åêäï÷Þ �çò L, äçëáäÞ áí ðåñéÝ÷åé �á ßäéá ó�ïé÷åßá ìå �çí L ìå ßäéï áñéèìüåìöáíßóåùí �ï êáèÝíá, óå áýîïõóá óåéñÜ ùò ðñïò �ïí åíóùìá�ùìÝíç äéÜ�áîç üñùí �çòProlog.Ï ïñéóìüò ó�çñßæå�áé ó�çí ðáñáêÜ�ù ðáñá�Þñçóç: ç �áîéíïìçìÝíç åêäï÷Þ �çò ëßó�áò[H|T℄ åßíáé ç ëßó�á ðïõ ðñïêýð�åé ìå åéóáãùãÞ �çò êåöáëÞò H ó�çí êá�Üëëçëç èÝóç�çò �áîéíïìçìÝíçò åêäï÷Þò �çò ïõñÜò T. �éá �ïí ïñéóìü ÷ñåéáæüìáó�å �ï êá�çãüñçìáinsert(N,P,R) �ï ïðïßï áëçèåýåé áí ç ëßó�á R ðñïêýð�åé ìå åéóáãùãÞ �ïõ N áêñéâþòðñßí áðü �ï ðñþ�ï ó�ïé÷åßï �çò P ðïõ äåí åßíáé ìéêñü�åñü �ïõ, Þ ó�ï �Ýëïò �çò P áí üëá�á ó�ïé÷åßá �çò åßíáé ìéêñü�åñÜ �ïõ. Åéäéêü�åñá áí ç ëßó�á P åßíáé �áîéíïìçìÝíç �ü�å êáéç R åßíáé �áîéíïìçìÝíç.insert(N,[℄,[N℄).insert(N,[H|T℄,[N,H|T℄) :- N �=< H.insert(N,[H|T℄,[H|S℄) :- N �> H,insert(N,T,S).insSort([H|T℄,S) :- insSort(T,R),insert(H,R,S).insSort([℄,[℄).Ïé åíóùìá�ùìÝíïé �åëåó�Ýò óýãêñéóçò �=< êáé �> ðáßñíïõí ùò ïñßóìá�á ïðïéïõóäÞðï�åüñïõò. Áí ùó�üóï ïé üñïé ðåñéÝ÷ïõí åëåýèåñåò ìå�áâëç�Ýò ç ïðïßåò èá äåóìåõ�ïýí óå73

�éìÝò ìå�Ü �ç óýãêñéóç, �á áðï�åëÝóìá�á ìðïñåß íá åßíáé ìç áíáìåíüìåíá (êáèþò çóýãêñéóç èá ãßíåé ãéá �á ïíïìá�á �ùí ìå�áâëç�þí êáé ü÷é �éò �éìÝò ðïõ èá ðÜñïõí, ïéïðïßåò äåí åßíáé ãíùó�Ýò ü�áí ãßíå�áé ç óýãêñéóç). �éá �ï ëüãï áõ�ü �ï ðñþ�ï üñéóìá�çò insSort èá ðñÝðåé íá åßíáé ëßó�á �á ó�ïé÷åßá �çò ïðïßáò èá åßíáé üñïé ÷ùñßò åëåýèåñåòìå�áâëç�Ýò. Ç åñþ�çóç?- insSort([5,3,0℄,S).ìðïñåß íá ÷ñçóéìïðïéçèåß ãéá �áîéíüìçóç �çò ëßó�áò. Ç Prolog ãéá íá áðáí�Þóåé áêïëïõ-èåß �á ðáñáêÜ�ù âÞìá�á:[0℄ insSort([5,3,0℄,S){S = S}1 --> 4insSort([H1|T1℄,S1) :- insSort(T1,R1), insert(H1,R1,S1).{H1 = 5, T1 = [3,0℄, S1 = S}[1℄ insSort([3,0℄,R1), insert(5,R1,S){S = S}1 --> 4insSort([H2|T2℄,S2) :- insSort(T2,R2), insert(H2,R2,S2).{H2 = 3, T2 = [0℄, S2 = R1}[2℄ insSort([0℄,R2), insert(3,R2,R1), insert(5,R1,S){S = S}1 --> 4insSort([H3|T3℄,S3) :- insSort(T3,R3), insert(H3,R3,S3).{H3 = 0, T3 = [℄, S3 = R2}[3℄ insSort([℄,R3), insert(0,R3,R2), insert(3,R2,R1), insert(5,R1,S){S = S}1 --> 5insSort([℄,[℄).{R3 = [℄}[4℄ insert(0,[℄,R2), insert(3,R2,R1), insert(5,R1,S){R = R}1 --> 1insert(N4,[℄,[N4℄).{R2 = [0℄, N4 = 0}[5℄ insert(3,[0℄,R1), insert(5,R1,S){S = S}1 --> 2insert(N5,[H5|T5℄,[N5,H5|T5℄) :- N5 �=< H5.{R1 = [3,0℄, N5 = 3, H5 = 0, T5 = [℄}[6℄ 3 �=< 0, insert(5,[3,0℄,S){S = S}�=< : build-in 74

failure - ba ktra king[5℄ insert(3,[0℄,R1), insert(5,R1,S){S = S}3 --> 3insert(N6,[H6|T6℄,[H6|S6℄) :- N6 �> H6, insert(N6,T6,S6).{R1 = [0|S6℄, N6 = 3, H6 = 0, T6 = [℄}[6℄ 3 �> 0, insert(3,[℄,S6), insert(5,[0|S6℄,S){S = S}�> : build-in{}[7℄ insert(3,[℄,S6), insert(5,[0|S6℄,S){S = S}1 --> 1insert(N7,[℄,[N7℄).{S6 = [3℄, N7 = 3}[8℄ insert(5,[0,3℄,S){S = S}1 --> 2insert(N8,[H8|T8℄,[N8,H8|T8℄) :- N8 �=< H8.{S = [5,0,3℄, N8 = 5, H8 = 0, T8 = [3℄}[9℄ 5 �=< 0{S = [5,0,3℄}�=< : build-infailure - ba ktra king[8℄ insert(5,[0,3℄,S){S = S}3 --> 3insert(N9,[H9|T9℄,[H9|S9℄) :- N9 �> H9, insert(N9,T9,S9).{S = [0|S9℄, N9 = 5, H9 = 0, T9 = [3℄}[9℄ 5 �> 0, insert(5,[3℄,S9){S = [0|S9℄}�> : build-in{}[10℄ insert(5,[3℄,S9){S = [0|S9℄}1 --> 2insert(N10,[H10|T10℄,[N10,H10|T10℄) :- N10 �=< H10.{S9 = [5,3℄, N10 = 5, H10 = 3, T10 = [℄}[11℄ 5 �=< 3{S = [0,5,3℄} 75

�=< : build-infailure - ba ktra king[10℄ insert(5,[3℄,S9){S = [0|S9℄}3 --> 3insert(N11,[H11|T11℄,[H11|S11℄) :- N11 �> H11, insert(N11,T11,S11).{S9 = [3|S11℄, N11 = 5, H11 = 3, T11 = [℄}[11℄ 5 �> 3, insert(5,[℄,S11){S = [0,3|S11℄}�> : build-in{}[12℄ insert(5,[℄,S11){S = [0,3|S11℄}1 --> 1insert(N12,[℄,[N12℄).{S11 = [5℄, N12 = 5}[13℄ #{S = [0,3,5℄}--------------------------------------------------------------S = [0,3,5℄Ìðïñïýìå íá �áîéíïìÞóïõìå ëßó�åò ìå äéÜöïñá åßäç üñùí?- insSort([2,a, hris,n,g(0),f(1,2),1℄,L).L = [1,2,a, hris,n,g(0),f(1,2)℄.�áñÜäåéãìá 34: �áîéíüìçóç ëßó�áò ìå óõã÷þíåóç.Èá ïñßóïõìå �ï êá�çãüñçìá mergeSort �ï ïðïßï åßíáé ëïãéêÜ éóïäýíáìï ìå �ï insSort,ùó�üóï ïñßæå�áé ìå äéáöïñå�éêü �ñüðï, ðïõ ó�çñßæå�áé ó�ïí áëãüñéèìï �áîéíüìçóçò ìåóõã÷þíåõóç. ¸ó�ù ìßá ëßó�á L. Áí ç L ðåñéÝ÷åé �ï ðïëý Ýíá ó�ïé÷åßï �ü�å åßíáé Þäç�áîéíïìçìÝíç. Óå áí�ßèå�ç ðåñßð�ùóç áí L1 êáé L2 åßíáé ïé ëßó�åò ðïõ ðåñéÝ÷ïõí �áó�ïé÷åßá ðïõ âñßóêïí�áé áí�ßó�ïé÷á ó�éò ðåñé��Ýò êáé �éò Üñ�éåò èÝóåéò �çò L, S1 åßíáé ç�áîéíïìçìÝíç åêäï÷Þ �çò L1, S2 åßíáé ç �áîéíïìçìÝíç åêäï÷Þ �çò L2 êáé S åßíáé ç ëßó�áðïõ ðñïêýð�åé ìå óõã÷þíåõóç �ùí S1 êáé S2, �ü�å ç S áðï�åëåß êáé �çí �áîéíïìçìÝíçåêäï÷Þ �çò L.Ï ïñéóìüò �ïõ mergeSort ÷ñçóéìïðïéåß äýï âïçèç�éêÜ êá�çãïñÞìá�á split êáé merge.To split(R,R1,R2) áëçèåýåé áí ç R1 áðï�åëåß�áé áðü �á ó�ïé÷åßá �çò R ðïõ âñßóêïí�áéóå ðåñé��Ýò èÝóåéò êáé ç R2 áðï�åëåß�áé áðü �á ó�ïé÷åßá �çò R ðïõ âñßóêïí�áé óå Üñ�éåòèÝóåéò. To merge(Q1,Q2,Q) ó�çí ðåñßð�ùóç ðïõ ïé Q1 êáé Q2 åßíáé �áîéíïìçìÝíåò ëßó�åò,áëçèåýåé áí ç Q ðñïêýð�åé áðü �ç óõã÷þíåõóÞ �ïõò, äçëáäÞ ðåñéÝ÷åé �á ó�ïé÷åßá êáé �ùíäýï ëéó�þí êáé åßíáé åðßóçò �áîéíïìçìÝíç. Óçìåéþíå�áé ü�é �ï merge(Q1,Q2,Q) ìðïñåßíá áëçèåýåé êáé óå ðåñéð�þóåéò ðïõ êÜðïéá áðü �éò Q1 Þ Q2 äåí åßíáé �áîéíïìçìÝíç, áëëÜáõ�Þ ç ðåñßð�ùóç ìáò åßíáé áäéÜöïñç óå ü�é áöïñÜ �ïí ïñéóìü �ïõ mergeSort.76

merge([H1|T1℄,[H2|T2℄,[H1|L℄) :-H1 �=< H2, merge(T1,[H2|T2℄,L).merge([H1|T1℄,[H2|T2℄,[H2|L℄) :-H1 �> H2, merge([H1|T1℄,T2,L).merge(L,[℄,L).merge([℄,L,L).split([A,B|T℄,[A|L1℄,[B|L2℄) :- split(T,L1,L2).split([X℄,[X℄,[℄).split([℄,[℄,[℄).mergeSort([A,B|T℄,S) :- split([A,B|T℄,L1,L2),mergeSort(L1,S1),mergeSort(L2,S2),merge(S1,S2,S).mergeSort([X℄,[X℄).mergeSort([℄,[℄).Ïðùò Ý÷ïõìå áíáöÝñåé �ï êá�çãüñçìá mergeSort åßíáé éóïäýíáìï ìå �ï insSort:?- mergeSort([2,a, hris,n,g(0),f(1,2),1℄,L).L = [1,2,a, hris,n,g(0),f(1,2)℄.�áñÜäåéãìá 35: ìå�Üèåóç ëßó�áò.ÈÝëïõìå íá ïñßóïõìå Ýíá êá�çãïñçìá perm(L,P) �ï ïðïßï èá áëçèåýåé áí L êáé P åß-íáé ëßó�åò êáé ç P áðï�åëåß ìå�Üèåóç �çò L, äçëáäÞ áí ðåñéÝ÷åé áêñéâþò �á ßäéá ó�ïé÷åßáìå �çí L ìå ßäéï áñéèìü åìöáíßóåùí �ï êáèÝíá, åíäå÷ïìÝíùò óå äéáöïñå�éêÞ óåéñÜ. Èáïñßóïõìå äýï õëïðïéÞóåéò perm1 êáé perm2 �ïõ ðáñáðÜíù êá�çãïñÞìá�ïò.Ï ïñéóìüò �ïõ perm1(L,P) ó�çñßæå�áé ó�çí ðáñáêÜ�ù ðáñá�Þñçóç: ¸ó�ù ü�é L åßíáé�çò ìïñöÞò [H|T℄. Ôü�å ç P èá ðåñéÝ÷åé óå êÜðïéá èÝóç �ï H. ÅðéðëÝïí áí �ï H äéáãñáöåßáðü �çí P, ç ëßó�á Q ðïõ èá ðñïêýøåé èá ðåñéÝ÷åé üëá �á ó�ïé÷åßá �çò T åíäå÷ïìÝíùò óåäéáöïñå�éêÞ óåéñÜ, Üñá èá åßíáé ìßá ìå�Üèåóç �çò T. Óõíåðþò õðÜñ÷åé ìßá ìå�Üèåóç Q �çòïõñÜò T, ç ïðïßá ðñïêýð�åé ìå äéáãñáöÞ �çò êåöáëÞò H áðü �çí P. Óçìåéþíå�áé åðßóçò ü�éç ìïíáäéêÞ ìå�Üèåóç �çò êåíÞò ëßó�áò åßíáé ç êåíÞ ëßó�á.perm1([℄,[℄).perm1([H|T℄,P) :- perm1(T,Q),delete(H,P,Q).Ï ïñéóìüò �ïõ perm2(L,P) áðü �çí Üëëç ó�çñßæå�áé óå ìßá äéáöïñå�éêÞ ðáñá�Þñçóç:¸ó�ù ü�é ç P åßíáé �çò ìïñöÞò [X|R℄. Ôü�å �ï X åßíáé ó�ïé÷åßï �çò L êáé áí äéáãñáöåßáðü �çí L ðñïêýð�åé ìßá ëßó�á S ðïõ Ý÷åé áêñéâþò �á ßäéá ó�ïé÷åßá ìå �çí R åíäå÷ïìÝíùòóå äéáöïñå�éêÞ óåéñÜ. Óõíåðþò ç R åßíáé ìå�Üèåóç �çò S. Ó�çí ðåñßð�ùóç áõ�Þ ðñïöáíþòç ëßó�á L äåí åßíáé êåíÞ, Üñá åßíáé �çò ìïñöÞò [H|T℄.perm2([℄,[℄).perm2([H|T℄,[X|R℄) :- delete(X,[H|T℄,S),perm2(S,R). 77

�éá íá âñïýìå �éò ìå�áèÝóåéò �çò ëßó�áò [a,b, ℄ êÜíïõìå ìßá áðü �éò ðáñáêÜ�ù åñù�Þóåéò(äßíïí�áò ; ìå�Ü áðü êÜèå áðÜí�çóç):?- perm1([a,b, ℄,P).P = [a,b, ℄ ;P = [b,a, ℄ ;P = [b, ,a℄ ;P = [a, ,b℄ ;P = [ ,a,b℄ ;P = [ ,b,a℄ ;no?- perm2([a,b, ℄,P).P = [a,b, ℄ ;P = [a, ,b℄ ;P = [b,a, ℄ ;P = [b, ,a℄ ;P = [ ,a,b℄ ;P = [ ,b,a℄ ;noÇ Prolog ãéá íá áðáí�Þóåé ó�çí ðñþ�ç åñþ�çóç èá âñåß �éò ìå�áèÝóåéò �çò ïõñÜò [b, ℄êáé èá åéóÜãåé óå êÜèå ìßá áðü áõ�Ýò �ï ó�ïé÷åßï a óå üëåò �éò ðéèáíÝò èÝóåéò. Ç ðñþ�çìå�Üèåóç �çò [b, ℄ åßíáé ç ßäéá ç [b, ℄, óõíåðþò ïé �ñåéò ðñþ�åò �éìÝò �çò P ðïõ åðéó�ñÝ-öåé ç Prolog åßíáé ïé [a,b, ℄, [b,a, ℄ êáé [b, ,a℄. Ó�ç óõíÝ÷åéá áðü �çí åéóáãùãÞ�ïõ a ó�çí [ ,b℄ ðñïêýð�ïõí ïé �ñåßò åðüìåíåò �éìÝò [a, ,b℄, [ ,a,b℄ êáé [ ,b,a℄.Áí æç�Þóïõìå êáé Üëëç áðÜí�çóç ç Prolog èá åðéó�ñÝøåé no.Ç Prolog ãéá íá áðáí�Þóåé ó�çí äåý�åñç åñþ�çóç èá äéáãñÜøåé ðñþ�á �ï ó�ïé÷åßï aáðü �çí [a,b, ℄, èá âñåé �éò ìå�áèÝóåéò �çò ëßó�áò [b, ℄ ðïõ åßíáé êá�á óåéñÜ ç [b, ℄êáé [ ,b℄ êáé èá åðéó�ñÝøåé ùò áðáí�Þóåéò �éò ëßó�åò ðïõ ðñïêýð�ïõí ìå �çí ðñïóèÞêç�ïõ a ùò êáöáëÞ ó�éò ìå�áèÝóåéò áõ�Ýò, äçëáäÞ �éò [a,b, ℄ êáé [a, ,b℄. Ó�ç óõíÝ÷åéáèá äéáãñÜøåé �ï b áðü �çí [a,b, ℄, èá âñåé �éò ìå�áèÝóåéò �çò ëßó�áò [a, ℄ êáé èá åðé-ó�ñÝøåé �éò ìå�áèÝóåéò [b,a, ℄ êáé [b, ,a℄. ÔÝëïò èá äéáãñÜøåé �ï áðü �çí [a,b, ℄,èá âñåé �éò ìå�áèÝóåéò �çò ëßó�áò [a,b℄ êáé èá åðéó�ñÝøåé �éò ìå�áèÝóåéò [b,a, ℄ êáé[b, ,a℄. Áí æç�Þóïõìå êáé Üëëç áðÜí�çóç ç Prolog èá åðéó�ñÝøåé no�áñá�çñïýìå ü�é ïé åñù�Þóåéò åßíáé éóïäýíáìåò, ùó�üóï ïé áðáí�Þóåéò ó÷çìá�ßæïí�áéìå äéáöïñå�éêÞ óåéñÜ. Ó�ç óõíÝ÷åéá äßíïí�áé áíáëõ�éêÜ �á âÞìá�á ðïõ åê�åëåß ç Prologãéá íá áðáí�Þóåé óå êÜèå ìßá áðü �éò ðáñáðÜíù åñù�Þóåéò. Áêïëïõèßåò âçìÜ�ùí ïé ïðïßåòåßíáé ðáñüìïéåò ìå ðñïçãïýìåíåò ðáñáëåßðïí�áé (óçìåéþíïí�áé ìå . . . ). Ïé áñéèìïß 1 êáé2 áíáöÝñïí�áé ó�éò ðñï�Üóåéò �ïõ ïñéóìïý �ïõ êá�çãïñÞìá�ïò perm1 Þ perm2, åíþ ïéáñéèìïß 3 êáé 4 ó�éò ðñï�Üóåéò �ïõ ïñéóìïý �ïõ delete. �éá �çí ðñþ�ç åñþ�çóç �á âÞìá�áåßíáé �á ðáñáêÜ�ù:[0℄ perm1([a,b, ℄,P){P = P}1 --> 2perm1([H1|T1℄,P1) :- perm1(T1,Q1),delete(H1,P1,Q1).{H1 = a, T1 = [b, ℄, P1 = P} 78

[1℄ perm1([b, ℄,Q1),delete(a,P,Q1){P = P}1 --> 2perm1([H2|T2℄,P2) :- perm1(T2,Q2),delete(H2,P2,Q2).{H2 = b, T2 = [ ℄, P2 = Q1}[2℄ perm1([ ℄,Q2),delete(b,Q1,Q2),delete(a,P,Q1){P = P}1 --> 2perm1([H3|T3℄,P3) :- perm1(T3,Q3),delete(H3,P3,Q3).{H3 = , T3 = [℄, P3 = Q2}[3℄ perm1([℄,Q3),delete( ,Q2,Q3),delete(b,Q1,Q2),delete(a,P,Q1){P = P}1 --> 1perm1([℄,[℄).{Q3 = }[4℄ delete( ,Q2,[℄),delete(b,Q1,Q2),delete(a,P,Q1){P = P}1 --> 3delete(X4,[X4|T4℄,T4).{Q2 = [ ℄, X4 = , T4 = [℄}[5℄ delete(b,Q1,[ ℄),delete(a,P,Q1){P = P}1 --> 3delete(X5,[X5|T5℄,T5).{Q1 = [b, ℄, X5 = b, T5 = [ ℄}[6℄ delete(a,P,[b, ℄){P = P}1 --> 3delete(X6,[X6|T6℄,T6).{P = [a,b, ℄, X6 = a, T6 = [b, ℄}[7℄ #{P = [a,b, ℄}--------------------------------------------------------------P = [a,b, ℄ ;--------------------------------------------------------------[6℄ delete(a,P,[b, ℄){P = P}4 --> 4delete(X7,[H7|T7℄,[H7|S7℄) :- delete(X7,T7,S7).{P = [b|T7℄, X7 = a, H7 = b, S7 = [ ℄}[7℄ delete(a,T7,[ ℄) 79

{P = [b|T7℄}1 --> 3delete(X8,[X8|T8℄,T8).{T7 = [a, ℄, X8 = a, T8 = [ ℄}[8℄ #{P = [b,a, ℄}--------------------------------------------------------------P = [b,a, ℄ ;--------------------------------------------------------------[7℄ delete(a,T7,[ ℄){P = [b|T7℄}4 --> 4delete(X9,[H9|T9℄,[H9|S9℄) :- delete(X9,T9,S9).{T7 = [ |T9℄, X9 = a, H9 = , S9 = [℄}[8℄ delete(a,T9,[℄){P = [b, |T9℄}1 --> 3delete(X10,[X10|T10℄,T10).{T9 = [a℄, X10 = a, T10 = [℄}{P = [b, ,a℄}[9℄ #--------------------------------------------------------------P = [b, ,a℄ ;--------------------------------------------------------------[8℄ delete(a,T9,[℄){P = [b, |T9℄}4 --> EOPfailure - ba ktra king[7℄ delete(a,T7,[ ℄){P = [b|T7℄}EOPfailure - ba ktra king[6℄ delete(a,P,[b, ℄){P = P}EOPfailure - ba ktra king[5℄ delete(b,Q1,[ ℄),delete(a,P,Q1){P = P}4 --> 4delete(X11,[H11|T11℄,[H11|S11℄) :- delete(X11,T11,S11).{Q1 = [ |T11℄, X11 = b, H11 = , T11 = [℄}[6℄ delete(b,T11,[℄),delete(a,P,[ |T11℄)80

{P = P}1 --> 3delete(X12,[X12|T12℄,T12).{T11 = [b℄, X12 = b, T12 = [℄}[7℄ delete(a,P,[ ,b℄){P = P}...--------------------------------------------------------------P = [a, ,b℄ ;--------------------------------------------------------------...--------------------------------------------------------------P = [ ,a,b℄ ;--------------------------------------------------------------...--------------------------------------------------------------P = [ ,b,a℄ ;--------------------------------------------------------------...[5℄ delete(b,Q1,[ ℄),delete(a,P,Q1){P = P}EOPfailure - ba ktra king[4℄ delete( ,Q2,[℄),delete(b,Q1,Q2),delete(a,P,Q1){P = P}4 --> EOPfailure - ba ktra king[3℄ perm1([℄,Q3),delete( ,Q2,Q3),delete(b,Q1,Q2),delete(a,P,Q1){P = P}2 --> EOPfailure - ba ktra king[2℄ perm1([ ℄,Q2),delete(b,Q1,Q2),delete(a,P,Q1){P = P}3 --> EOPfailure - ba ktra king[1℄ perm1([b, ℄,Q1),delete(a,P,Q1){P = P}3 --> EOPfailure - ba ktra king[0℄ perm1([a,b, ℄,P){P = P}3 --> EOPfailure 81

--------------------------------------------------------------noÔá âÞìá�á ðïõ áêïëïõèÝé ç Prolog ãéá íá áðáí�Þóåé ó�ç äåý�åñç åñþ�çóç åßíáé �á ðáñá-êÜ�ù:[0℄ perm2([a,b, ℄,P){P = P}1 --> 2perm2([H1|T1℄,[X1|R1℄) :- delete(X1,[H1|T1℄,S1),perm2(S1,R1).{P = [X1|R1℄, H1 = a, T1 = [b, ℄}[1℄ delete(X1,[a,b, ℄,S1),perm2(S1,R1){P = [X1|R1℄}1 --> 3delete(X2,[X2|T2℄,T2).{X1 = a, S1 = [b, ℄, X2 = a, T2 = [b, ℄}[2℄ perm2([b, ℄,R1){P = [a|R1℄}1 --> 2perm2([H3|T3℄,[X3|R3℄) :- delete(X3,[H3|T3℄,S3),perm2(S3,R3).{R1 = [X3|R3℄, H3 = b, T3 = [ ℄}[3℄ delete(X3,[b, ℄,S3),perm2(S3,R3){P = [a,X3|R3℄}1 --> 3delete(X4,[X4|T4℄,T4).{X3 = b, S3 = [ ℄, X4 = b, T4 = [ ℄}[4℄ perm2([ ℄,R3){P = [a,b|R3℄}1 --> 2perm2([H5|T5℄,[X5|R5℄) :- delete(X5,[H5|T5℄,S5),perm2(S5,R5).{R3 = [X5|R5℄, H5 = , T5 = [℄}[5℄ delete(X5,[ ℄,S5),perm2(S5,R5){P = [a,b,X5|R5℄}1 --> 3delete(X6,[X6|T6℄,T6).{X5 = , S5 = [℄, X6 = , T6 = [℄}[6℄ perm2([℄,R5){P = [a,b, |R5℄}1 --> 1perm2([℄,[℄).{R5 = [℄}[7℄ #{P = [a,b, ℄} 82

--------------------------------------------------------------P = [a,b, ℄ ;--------------------------------------------------------------[6℄ perm2([℄,R5){P = [a,b, |R5℄}2 --> EOPfailure - ba ktra king[5℄ delete(X5,[ ℄,S5),perm2(S5,R5){P = [a,b,X5|R5℄}4 --> 4delete(X7,[H7|T7℄,[H7|S7℄) :- delete(X7,T7,S7).{X7 = X5, H7 = , T7 = [℄, S5 = [ |S7℄}[6℄ delete(X5,[℄,[ |S7℄),perm2([ |S7℄,R5){P = [a,b,X5|R5℄}1 --> EOPfailure - ba ktra king[5℄ delete(X5,[ ℄,S5),perm2(S5,R5){P = [a,b,X5|R5℄}EOPfailure - ba ktra king[4℄ perm2([ ℄,R3){P = [a,b|R3℄}3 --> EOPfailure - ba ktra king[3℄ delete(X3,[b, ℄,S3),perm2(S3,R3){P = [a,X3|R3℄}4 -> 4delete(X8,[H8|T8℄,[H8|S8℄) :- delete(X8,T8,S8).{X8 = X3, H8 = b, T8 = [ ℄, S3 = [b|S8℄}[4℄ delete(X3,[ ℄,S8),perm2([b|S8℄,R3){P = [a,X3|R3℄}1 -> 3delete(X9,[X9|T9℄,T9).{X3 = , S8 = [℄, X9 = , T9 = [℄}[5℄ perm2([b℄,R3){P = [a, |R3℄}...--------------------------------------------------------------P = [a, ,b℄ ;--------------------------------------------------------------...[3℄ delete(X3,[b, ℄,S3),perm2(S3,R3)83

{P = [a,X3|R3℄}EOPfailure - ba ktra king[2℄ perm2([b, ℄,R1){P = [a|R1℄}3 --> EOPfailure - ba ktra king[1℄ delete(X1,[a,b, ℄,S1),perm2(S1,R1){P = [X1|R1℄}4 --> 4delete(X13,[H13|T13℄,[H13|S13℄) :- delete(X13,T13,S13).{X13 = X1, H13 = a, T13 = [b, ℄, S1 = [a|S13℄}[2℄ delete(X1,[b, ℄,S13),perm2([a|S13℄,R1){P = [X1|R1℄}1 --> 3delete(X14,[X14|T14℄,T14).{X1 = b, S13 = [ ℄, X14 = b, T14 = [ ℄}[3℄ perm2([a, ℄,R1){P = [b|R1℄}...--------------------------------------------------------------P = [b,a, ℄ ;--------------------------------------------------------------...--------------------------------------------------------------P = [b, ,a℄ ;--------------------------------------------------------------...[4℄ perm2([a,b℄,R1){P = [ |R1℄}...--------------------------------------------------------------P = [ ,a,b℄ ;--------------------------------------------------------------...--------------------------------------------------------------P = [ ,b,a℄ ;--------------------------------------------------------------... failure - ba ktra king[1℄ delete(X1,[a,b, ℄,S1),perm2(S1,R1){P = [X1|R1℄}EOP 84

failure - ba ktra king[0℄ perm2[a,b, ℄,P){P = P}3 --> EOPfailure--------------------------------------------------------------no�áñá�çñïýìå ü�é �á êá�çãïñÞìá�á perm1 êáé perm2 åßíáé óõììå�ñéêÜ: áí ç P åßíáé ìå-�Üèåóç �çò L �ü�å êáé ç L åßíáé ìå�Üèåóç �çò P.¸ó�ù ü�é åðé÷åéñïýìå íá âñïýìå �éò ìå�áèÝóåéò �çò ëßó�áò [a,b, ℄ êÜíïí�áò �çí åñþ�çóç?- perm1(P,[a,b, ℄).Ç Prolog ãéá íá áðáí�Þóåé ó�çí åñþ�çóç áõ�Þ ó÷çìá�ßæåé �ï ó�ü÷ïperm1(T1,Q1),delete(H1,[a,b, ℄,Q1)�éá íá éêáíïðïéçèåß áõ�üò ï ó�ü÷ïò èá ðñÝðåé íá âñåèåß ìßá ëßó�á T1 êáé ìßá ìå�ÜèåóÞ�çò Q1, �Ý�ïéåò þó�å ç Q1 íá ðñïêýð�åé áðü �çí äåäïìÝíç ëßó�á [a,b, ℄ ìå äéáãñáöÞ êÜ-ðïéïõ ó�ïé÷åßïõ. Óçìåéþíå�áé ü�é êá�Ü �çí áíáæÞ�çóç �ùí T1 êáé Q1 äåí ÷ñçóéìïðïéåß�áéêáìßá ðëçñïöïñßá ó÷å�éêÞ ìå �ç äåäïìÝíç ëßó�á. Ç Prolog êá�áóêåõÜæåé ëßó�åò äéáñ-êþò áõîáíüìåíïõ ìåãÝèïõò ìå ó�ïé÷åßá åëåýèåñåò ìå�áâëç�Ýò, ó÷çìá�ßæåé �éò ìå�áèÝóåéò�ïõò êáé åëÝã÷åé áí êÜðïéá áðü áõ�Ýò ìðïñåß íá ðñïêýøåé ìå äéáãñáöÞ ó�ïé÷åßïõ áðü �çí[a,b, ℄. Áõ�ü èá ðå�ý÷åé ü�áí ç ëßó�á T1 Ý÷åé ìÞêïò 2, ïðü�å áðü �éò äýï ìå�áèÝóåéòáõ�Þò �çò êáé �ïõò �ñåéò �ñüðïõò äéáãñáöÞò ó�ïé÷åßïõ áðü �çí [a,b, ℄ èá ó÷çìá�éóïýíïé Ýîé ìå�áèÝóåéò �çò [a,b, ℄ (ìå äéáöïñå�éêÞ óåéñÜ óå ó÷Ýóç ìå �éò ðñïçãïýìåíåò åñù-�Þóåéò). Áí ùó�üóï æç�Þóïõìå ìßá áêüìç ëýóç, ç Prolog èá óõíå÷ßóåé íá êá�áóêåõÜæåéüëï êáé ìåãáëý�åò ëßó�åò, ÷ùñßò íá ìðïñÝóåé íá äéáðéó�þóåé ü�é áõ�ü äåí ïäçãåß óå ÜëëçáðÜí�çóç þó�å íá åðéó�ñÝøåé no. ¸�óé �åëéêÜ èá ðñïêëçèåß õðåñ÷åßëéóç ó�ïßâáò.[0℄ perm1(P,[a,b, ℄){P = P}1 --> 2perm1([H1|T1℄,P1) :- perm1(T1,Q1),delete(H1,P1,Q1).{P = [H1|T1℄, P1 = [a,b, ℄}[1℄ perm1(T1,Q1),delete(H1,[a,b, ℄,Q1){P = [H1|T1℄}1 --> 1perm1([℄,[℄).{T1 = [℄, Q1 = [℄}[2℄ delete(H1,[a,b, ℄,[℄){P = [H1℄}1 --> EOPfailure - ba ktra king 85

[1℄ perm1(T1,Q1),delete(H1,[a,b, ℄,Q1){P = [H1|T1℄}2 --> 2perm1([H2|T2℄,P2) :- perm1(T2,Q2),delete(H2,P2,Q2).{T1 = [H2|T2℄, P2 = Q1}[2℄ perm1(T2,Q2),delete(H2,Q1,Q2),delete(H1,[a,b, ℄,Q1){P = [H1,H2|T2℄}1 --> 1perm1([℄,[℄).{T2 = [℄, Q2 = [℄}[3℄ delete(H2,Q1,[℄),delete(H1,[a,b, ℄,Q1){P = [H1,H2℄}3 --> 3delete(X3,[X3|T3℄,T3).{Q1 = [H2℄, X3 = H2, T3 = [℄}[4℄ delete(H1,[a,b, ℄,[H2℄){P = [H1,H2℄}1 --> 4delete(X4,[H4|T4℄,[H4|S4℄) :- delete(X4,T4,S4).{H2 = a, X4 = H1, H4 = a, T4 = [b, ℄, S4 = [℄}[5℄ delete(H1,[b, ℄,[℄){P = [H1,a℄}1 --> EOPfailure - ba ktra king[4℄ delete(H1,[a,b, ℄,[H2℄){P = [H1,H2℄}EOPfailure - ba ktra king[3℄ delete(H2,Q1,[℄),delete(H1,[a,b, ℄,Q1){P = [H1,H2℄}4 --> EOPfailure - ba ktra king[2℄ perm1(T2,Q2),delete(H2,Q1,Q2),delete(H1,[a,b, ℄,Q1){P = [H1,H2|T2℄}2 --> 2perm1([H5|T5℄,P5) :- perm1(T5,Q5),delete(H5,P5,Q5).{T2 = [H5|T5℄, P5 = Q2}[3℄ perm1(T5,Q5),delete(H5,Q2,Q5),delete(H2,Q1,Q2),delete(H1,[a,b, ℄,Q1){P = [H1,H2,H5|T5℄}1 --> 1perm1([℄,[℄). 86

{T5 = [℄, Q5 = [℄}[4℄ delete(H5,Q2,[℄),delete(H2,Q1,Q2),delete(H1,[a,b, ℄,Q1){P = [H1,H2,H5℄}1 --> 3delete(X6,[X6|T6℄,T6).{Q2 = [H5℄, X6 = H5, T6 = [℄}[5℄ delete(H2,Q1,[H5℄),delete(H1,[a,b, ℄,Q1){P = [H1,H2,H5℄}1 --> 3delete(X7,[X7|T7℄,T7).{Q1 = [H2,H5℄, X7 = H2, T7 = [H5℄}[6℄ delete(H1,[a,b, ℄,[H2,H5℄){P = [H1,H2,H5℄}1 --> 3delete(X8,[X8|T8℄,T8).{H1 = a, H2 = b, H5 = , X8 = a, T8 = [b, ℄}[7℄ #{P = [a,b, ℄}--------------------------------------------------------------P = [a,b, ℄ ;--------------------------------------------------------------[6℄ delete(H1,[a,b, ℄,[H2,H5℄){P = [H1,H2,H5℄}4 --> 4delete(X9,[H9|T9℄,[H9|S9℄) :- delete(X9,T9,S9).{H2 = a, X9 = H1, H9 = a, T9 = [b, ℄, S9 = [H5℄}[7℄ delete(H1,[b, ℄,[H5℄){P = [H1,a,H5℄}1 --> 3delete(X10,[X10|T10℄,T10).{H1 = b, H5 = , X10 = b, T10 = [ ℄}[8℄ #{P = [b,a, ℄}--------------------------------------------------------------P = [b,a, ℄ ;--------------------------------------------------------------[7℄ delete(H1,[b, ℄,[H5℄){P = [H1,a,H5℄}4 --> 4delete(X11,[H11|T11℄,[H11|S11℄) :- delete(X11,T11,S11).{H5 = b, X11 = H1, H11 = b, T11 = [ ℄, S11 = [℄}[8℄ delete(H1,[ ℄,[℄) 87

{P = [H1,a,b℄}1 --> 3delete(X12,[X12|T12℄,T12).{H1 = , X12 = , T12 = [℄}[9℄ #{P = [ ,a,b℄}--------------------------------------------------------------P = [ ,a,b℄ ;--------------------------------------------------------------[8℄ delete(H1,[ ℄,[℄){P = [H1,a,b℄}4 --> EOPfailure - ba ktra king[7℄ delete(H1,[b, ℄,[H5℄){P = [H1,a,H5℄}EOPfailure - ba ktra king[6℄ delete(H1,[a,b, ℄,[H2,H5℄){P = [H1,H2,H5℄}EOPfailure - ba ktra king[5℄ delete(H2,Q1,[H5℄),delete(H1,[a,b, ℄,Q1){P = [H1,H2,H5℄}4 --> 4delete(X13,[H13|T13℄,[H13|S13℄) :- delete(X13,T13,S13).{X13 = H2, Q1 = [H5|T13℄, H13 = H5, S13 = [℄}[6℄ delete(H2,T13,[℄),delete(H1,[a,b, ℄,[H5|T13℄){P = [H1,H2,H5℄}1 --> 3delete(X14,[X14|T14℄,T14).{T13 = [H2℄, X14 = H2, T14 = [℄}[7℄ delete(H1,[a,b, ℄,[H5,H2℄){P = [H1,H2,H5℄}...--------------------------------------------------------------P = [a, ,b℄ ;--------------------------------------------------------------...--------------------------------------------------------------P = [b, ,a℄ ;--------------------------------------------------------------...--------------------------------------------------------------88

P = [ ,b,a℄ ;--------------------------------------------------------------... failure - ba ktra king[5℄ delete(H2,Q1,[H5℄),delete(H1,[a,b, ℄,Q1){P = [H1,H2,H5℄}EOPfailure - ba ktra king[4℄ delete(H5,Q2,[℄),delete(H2,Q1,Q2),delete(H1,[a,b, ℄,Q1){P = [H1,H2,H5℄}4 --> EOPfailure - ba ktra king[3℄ perm1(T5,Q5),delete(H5,Q2,Q5),delete(H2,Q1,Q2),delete(H1,[a,b, ℄,Q1){P = [H1,H2,H5|T5℄}2 --> 2perm1([H15|T15℄,P15) :- perm1(T15,Q15),delete(H15,P15,Q15).{T5 = [H15|T15℄, P15 = Q5}[4℄ perm1(T15,Q15),delete(H15,Q5,Q15),delete(H5,Q2,Q5),delete(H2,Q1,Q2),delete(H1,[a,b, ℄,Q1){P = [H1,H2,H5,H15|T15℄}1 --> 1perm1([℄,[℄).{T15 = [℄, Q15 = [℄}[5℄ delete(H15,Q5,Q15),delete(H5,Q2,Q5),delete(H2,Q1,Q2),delete(H1,[a,b, ℄,Q1){P = [H1,H2,H5,H15℄}...Aí åðé÷åéñÞóïõìå íá âñïýìå �éò ìå�áèÝóåéò �çò ëßó�áò [a,b, ℄ êÜíïí�áò �çí åñþ�çóç?- perm2(P,[a,b, ℄).�ü�å �á ðñÜãìá�á åßíáé ÷åéñü�åñá. Ï ïñéóìüò �ïõ perm2 ïäçãåß �çí Prolog ó�ï íá áíá-æç�Þóåé ðñþ�á ëéó�åò ðïõ ðåñéÝ÷ïõí �á a êáé b ùò áñ÷éêÜ ó�ïé÷åßá êáé �ï íá áêïëïõèåßóå ìßá áðü �éò åðüìåíåò èÝóåéò. ÕðÜñ÷åé ìüíï ìßá �Ý�ïéá ìå�Üèåóç (ç [a,b, ℄) áëëÜÜðåéñåò ëßó�åò �çò ðáñáðÜíù ìïñöÞò, êáé ç Prolog åãêëùâßæå�áé óå áõ�Ýò åê�åëþí�áò ìßáá�Ýñìïíç áêïëïõèßá âçìÜ�ùí (ðïõ èá ïäçãÞóåé óå õðåñ÷åßëéóç ó�ïßâáò) ÷ùñßò íá âñåßÜëëç ìå�Üèåóç.[0℄ perm2(P,[a,b, ℄){P = P}1 --> 2perm2([H1|T1℄,[X1|R1℄) :- delete(X1,[H1|T1℄,S1),perm2(S1,R1).{P = [H1|T1℄, X1 = a, R1 = [b, ℄}89

[1℄ delete(a,[H1|T1℄,S1),perm2(S1,[b, ℄){P = [H1|T1℄}1 --> 3delete(X2,[X2|T2℄,T2).{H1 = a, T1 = S1, X2 = a, T2 = S1}[2℄ perm2(S1,[b, ℄){P = [a|S1℄}1 --> 2perm2([H3|T3℄,[X3|R3℄) :- delete(X3,[H3|T3℄,S3),perm2(S3,R3).{S1 = [H3|T3℄, X3 = b, R3 = [ ℄}[3℄ delete(b,[H3|T3℄,S3),perm2(S3,[ ℄){P = [a,H3|T3℄}1 --> 3delete(X4,[X4|T4℄,T4).{H3 = b, T3 = S3, X4 = b, T4 = S3}[4℄ perm2(S3,[ ℄){P = [a,b|S3℄}1 --> 2perm2([H5|T5℄,[X5|R5℄) :- delete(X5,[H5|T5℄,S5),perm2(S5,R5).{S3 = [H5|T5℄, X5 = , R5 = [℄}[5℄ delete( ,[H5|T5℄,S5),perm2(S5,[℄){P = [a,b,H5|T5℄}1 --> 3delete(X6,[X6|T6℄,T6).{H5 = , T5 = S5, X6 = , T6 = S5}[6℄ perm2(S5,[℄){P = [a,b, |S5℄}1 --> 1perm2([℄,[℄).{S5 = [℄}[7℄ #{P = [a,b, ℄}--------------------------------------------------------------P = [a,b, ℄ ;--------------------------------------------------------------[6℄ perm2(S5,[℄){P = [a,b, |S5℄}2 --> EOPfailure - ba ktra king[5℄ delete( ,[H5|T5℄,S5),perm2(S5,[℄){P = [a,b,H5|T5℄}4 --> 4 90

delete(X7,[H7|T7℄,[H7|S7℄) :- delete(X7,T7,S7).{S5 = [H5|S7℄, X7 = , H7 = H5, T7 = T5}[6℄ delete( ,T5,S7),perm2([H5|S7℄,[℄){P = [a,b,H5|T5℄}1 -->3delete(X8,[X8|T8℄,T8).{T5 = [ |S7℄, X8 = , T8 = S7}[7℄ perm2([H5|S7℄,[℄){P = [a,b,H5, |S7℄}1 --> EOPfailure - ba ktra king[6℄ delete( ,T5,S7),perm2([H5|S7℄,[℄){P = [a,b,H5|T5℄}4 --> 4delete(X9,[H9|T9℄,[H9|S9℄) :- delete(X9,T9,S9).{T5 = [H9|T9℄, S7 = [H9|S9℄, X9 = }[7℄ delete( ,T9,S9),perm2([H5,H9|S9℄,[℄){P = [a,b,H5,H9|T9℄}1 -->3delete(X10,[X10|T10℄,T10).{T9 = [ |S9℄, X10 = , T10 = S9}[8℄ perm2([H5,H9|S9℄,[℄){P = [a,b,H5,H9, |S9℄}1 -->EOPfailure - ba ktra king.... Ôá ó�ïé÷åßá ìßáò ëßó�áò åíäÝ÷å�áé íá åßíáé åðßóçò ëßó�åò. ×ñçóéìïðïéþí�áò ëßó�åòáõ�Þò �çò ìïñöÞò ìðïñïýìå íá ðáñáó�Þóïõìå ðßíáêåò. ÊÜèå åóù�åñéêÞ ëßó�á èá ðñÝðåéíá åßíáé ìÞ êåíÞ êáé áí�éó�ïé÷åß óå ìßá ãñáììÞ �ïõ ðßíáêá. ¼ëåò ïé åóù�åñéêÝò ëßó�åòèá ðñÝðåé íá Ý÷ïõí �ï ßäéï ðëÞèïò ó�ïé÷åßùí.�áñÜäåéãìá 36: Ìïíáäéáßïò ðßíáêáò.Èá ïñßóïõìå �ï êá�çãüñçìá unitMatrix(N,M) �ï ïðïßï áëçèåýåé áí M åßíáé ç ëßó�ááðü ëßó�åò ðïõ ðáñéó�Üíåé �ïí ìïíáäéáßï N×N ðßíáêá. Ï ïñéóìüò �ïõ unitMatrix ó�ç-ñßæå�áé ó�çí ðáñáêÜ�ù ðáñá�Þñçóç: ¸ó�ù ü�é N > 1 êáé ü�é �ï K Ý÷åé �çí �éìÞ N-1. Ïìïíáäéáßïò ðßíáêáò K×K ðñïêýð�åé áðü �ïí ìïíáäéáßï ðßíáêá N×N ìå äéáãñáöÞ �çò ðñþ-�çò ãñáììÞò êáé �çò ðñþ�çò ó�Þëçò. Óõíåðþò, áí ï ìïíáäéáßïò K×K ðáñéó�Üíå�áé áðü �çëßó�á S êáé ï ï ìïíáäéáßïò N×N ðáñéó�Üíå�áé áðü �ç ëßó�á [Ç|Ô℄, �ü�å éó÷ýïõí ïé äýïðáñáêÜ�ù óõíèÞêåò: (á) êÜèå ó�ïé÷åßï (ëßó�á) �çò Ô ðñïêýð�åé ìå ðñïóèÞêç �ïõ 0 ó�çíáñ÷Þ �ïõ áí�ßó�ïé÷ïõ ó�ïé÷åßïõ �çò S (åëÝã÷å�áé áðü �ï âïçèç�éêü êá�çãüñçìá expand)êáé (â) �ï Ç åßíáé ç ëßó�á ðïõ Ý÷åé ùò êåöáëÞ �ï 1 êáé ùò ïõñÜ �ç ëßó�á ðïõ áðï�åëåß�áé91

áðü K ìçäåíéêÜ (åëÝã÷å�áé áðü áðü �ï âïçèç�éêü êá�çãüñçìá zeros).unitMatrix(1,[[1℄℄).unitMatrix(N,[[1|R℄|T℄) :- N > 0,K is N-1,unitMatrix(K,S),expand(S,T),zeros(K,R).zeros(0,[℄).zeros(K,[0|T℄) :- I is K-1, zeros(I,T).expand([℄,[℄).expand([L|M℄,[[0|L℄|R℄) :- expand(M,R).�éá íá âñïõìå �ï ìïíáäéáßï 3×3 êÜíïõìå �çí åñþ�çóç:?- unitMatrix(3,M).M = [[1,0,0℄,[0,1,0℄,[0,0,1℄℄.1.17 Ç óåéñÜ �ùí ðñï�ÜóåùíÏ áëãüñéèìïò ðïõ ÷ñçóéìïðïéåß ç Prolog ãéá íá áðáí�Þóåé óå ìßá åñþ�çóç, åîå�Üæåé �éòðñï�Üóåéò ðïõ ïñßæïõí Ýíá êá�çãüñçìá ìå �ç óåéñÜ ðïõ åìöáíßæïí�áé ó�ï ðñüãñáììá (êáéç ïðïßá äéá�çñåß�áé êá�Ü �ç öüñ�ùóç �ïõ ðñïãñÜììá�ïò ó�ç âÜóç äåäïìÝíùí). Åðßóçòóå êÜèå âÞìá åîå�Üæå�áé ç ðñþ�ç á�ïìéêÞ ðñü�áóç �ïõ ó�ü÷ïõ, êÜ�é ðïõ óçìáßíåé ü�éïé ðñï�Üóåéò ó�ï óþìá åíüò êáíüíá åîå�Üæïí�áé áðü áñéó�åñÜ ðñïò �á äåîéÜ. Óõíåðþò,ç óåéñÜ �ùí ðñï�áóåùí óå Ýíá ðñüãñáììá åßíáé óçìáí�éêÞ, êáé áí áëëÜîåé åíäÝ÷å�áé çóõìðåñéöïñÜ �çò Prolog ü�áí áðáí�Üåé ó�çí ßäéá åñþ�çóç ðñéí êáé ìå�Ü �çí áëëáãÞ íáåßíáé äéáöïñå�éêÞ. Ôï ßäéï éó÷ýåé êáé ãéá �ç óåéñÜ �ùí ðñï�Üóåùí ó�ï óþìá åíüò êÜíüíáÞ óå ìßá åñþ�çóç.�áñÜäåéãìá 37: ¸ó�ù �ï ðáñáêÜ�ù ðñüãñáììá:p(0).p(s(X)) :- p(X).p(X) :- p(s(X)).Áí êÜíïõìå �çí åñþ�çóç?- p(s(s(0))).ç Prolog ÷ñçóéìïðïéþí�áò �ïí êáíüíá p(s(X)) :- p(X). èá ó÷çìá�ßóåé �ïõò åíäéÜìå-óïõò ó�ü÷ïõò p(s(0)) êáé p(0), êáé åðåéäÞ ç ðñü�áóç ðïõ áðï�åëåß �ïí �åëåõ�áßï ó�ü÷ïõðÜñ÷åé ó�ï ðñüãñáììá, èá ðñïêýøåé ï êåíüò ó�ü÷ïò êáé èá åðéó�ñáöåß ç áðÜí�çóç yes.Áí �þñá åíáëëÜîïõìå �ç óåéñÜ �ùí äýï êáíüíùí ó�ï ðñáðÜíù ðñüãñáììá, �ü�å ç Prologó�çí ðñïóðÜèåéÜ �çò íá áðáí�Þóåé ó�çí ßäéá åñþ�çóç èá ó÷çìá�ßóåé ÷ñçóéìïðïéþí�áò �ïíêáíüíá p(X) :- p(s(X)). ìßá Üðåéñç áêïëïõèßá áðü ó�ü÷ïõò92

p(s(s(0)))p(s(s(s(0))))p(s(s(s(s(0)))))...ðïõ èá ðñïêáëÝóåé õðåñ÷åßëéóç ìíÞìçò êáé äåí èá åðéó�ñÝøåé áðÜí�çóç. .�áñÜäåéãìá 38: ¸ó�ù �ï ðáñáêÜ�ù ðñüãñáììá:p(X) :- q(X),p(s(X)).Áí êÜíïõìå �çí åñþ�çóç?- p(s(s(0))).ç Prolog èá ó÷çìá�ßóåé �ï ó�ü÷ï q(s(s(0))),p(s(s(s(0)))) ï ïðïßïò ðñïöáíþò èááðï�ý÷åé, êáèþò äåí õðÜñ÷åé ïñéóìüò ãéá �ï q, êáé èá åðéó�ñÝøåé �çí áðÜí�çóç no.Áò õðïèÝóïõìå �ùñá ü�é áëëÜæïõìå �ç óåéñÜ �ùí äýï ðñï�Üóåùí ó�ï óþìá �ïõ êáíüíá:p(X) :- p(s(X)),q(X).Ç Prolog ãéá íá áðáí�Þóåé ó�çí ßäéá åñþ�çóç èá ó÷çìá�ßóåé ìßá Üðåéñç áêïëïõèßá áðüó�ü÷ïõòp(s(s(0)))p(s(s(s(0)))), q(s(s(0)))p(s(s(s(s(0))))), q(s(s(s(0)))), q(s(s(0)))...ðïõ èá ðñïêáëÝóåé õðåñ÷åßëéóç ìíÞìçò êáé äåí èá åðéó�ñÝøåé áðÜí�çóç. .�åíéêÜ áí Ý÷ïõìå äýï ðñïãñÜììá�á ðïõ äåí ðåñéÝ÷ïõí áðïêïðÞ (�çí ïðïßá èá åîá�ÜóïõìåðáñáêÜ�ù) �Ý�ïéá þó�å �ï Ýíá íá ðñïêýð�åé ìå ìå�Üèåóç �ùí ðñï�Üóåùí �ïõ Üëëïõ ç/êáéìå�Üèåóç �ùí ðñï�Üóåùí ó�á óþìá�á �ùí êáíüíùí êáé êÜíïõìå ìßá åñþ�çóç ðïõ äåíðåñéÝ÷åé ìå�áâëç�Ýò �ü�å èá óõìâåß Ýíá áðü �á ðáñáêÜ�ù:• Êáé ãéá �á äýï ðñïãñÜììá�á èá åðéó�ñáöåß ç ßäéá áðÜí�çóç yes Þ no.• �éá êáíÝíá ðñüãñáììá äåí èá åðéó�ñáöåß áðÜí�çóç.• �éá �ï Ýíá ðñüãñáììá ç áðÜí�çóç èá åßíáé yes êáé ãéá �ï Üëëï äåí èá åðéó�ñáöåßáðÜí�çóç.• �éá �ï Ýíá ðñüãñáììá ç áðÜí�çóç èá åßíáé no êáé ãéá �ï Üëëï äåí èá åðéó�ñáöåßáðÜí�çóç.Óå êáìßá ðåñßð�ùóç ðÜí�ùò äåí èá åðéó�ñáöåß äéáöïñå�éêÞ áðÜí�çóç (äçëáäÞ yes ãéá �ïÝíá ðñüãñáììá êáé no ãéá �ï Üëëï). Áõ�ü ìðïñåß íá óõìâåß ìüíï áí �á ðñïãñÜììá�áðåñéÝ÷ïõí áðïêïðÞ. 93

1.18 ÁðïêïðÞÇ ïðéóèïäñüìçóç áðï�åëåß âáóéêü ÷áñáê�çñéó�éêü �çò Prolog êáé ãßíå�áé áõ�üìá�á áðü�ç ãëþóóá. Ï áëãüñéèìïò áðÜí�çóçò óå åñþ�çóç, äçìéïõñãåß ìßá áêïëïõèßá ó�ü÷ùíìÝ÷ñé íá ðñïêýøåé ï êåíüò ó�ü÷ïò, ïðü�å êáé Ý÷åé âñåé ìßá áðÜí�çóç. Áí ùó�üóï óåêÜðïéï óçìåßï äéáðéó�þóåé ü�é äåí õðÜñ÷åé �ñüðïò ãéá íá ó÷çìá�ßóåé �ïí åðüìåíï ó�ü÷ï,ïðéóèïäñïìåß êáé ó÷çìá�ßæåé ìßá åíáëëÜê�éêÞ áêïëïõèßá ó�ü÷ùí.�áñü�é ï ÷åéñéóìüò �çò ïðéóèïäñüìçóçò áðü �ç ßäéá �ç ãëþóóá áðï�åëåß Ýíá áðü �áâáóéêÜ ðëåïíåê�Þìá�á �çò Prolog, õðÜñ÷ïõí ðåñéð�þóåéò ó�éò ïðïßåò ï ðñïãñáììá�éó�Þòãíùñßæåé ü�é ç ïðéóèïäñüìçóç äåí ðñüêåé�áé íá ïäçãÞóåé óå õðïëïãéóìü ìßáò ëýóçò êáéï�é áðëÜ èá óðá�áëÞóåé ÷ñüíï äçìéïõñãþí�áò ó�ü÷ïõò ðïõ �åëéêÜ èá áðï�ý÷ïõí.�áñÜäåéãìá 39: ¸ó�ù �ï ðáñáêÜ�ù ðñüãñáììá õðïëïãéóìïý äýíáìçò, �ï ïðïßï ðñïêý-ð�åé ðñïóèÝ�ùí�áò �ç óõíèÞêç K =\= 0 ó�ïõò áíáäñïìéêïýò êáíüíåò �ïõ êá�çãïñÞìá�ïòpower �ïõ ðáñáäåßãìá�ïò 19.Ìå áõ�Þ �çí ðñïóèÞêç �ï ðñüãñáììá åðéó�ñÝöåé ìßá ìüíï öïñÜ �ç óùó�Þ áðÜí�çóçãéá ìç áñíç�éêü åêèÝ�ç (êáé åîáêïëïõèåß íá åðéó�ñÝöåé ëÜèïò áðï�Ýëåóìá ãéá áñíç�éêüåêèÝ�ç).power3(N,0,1).power3(N,K,P) :- K =\= 0,K mod 2 =:= 0,L is K//2,power3(N,L,R),P is R*R.power3(N,K,P) :- K =\= 0,K mod 2 =:= 1,L is K//2,power3(N,L,R),P is R*R*N.Áò õðïèÝóïõìå ü�é êÜíïõìå �çí åñþ�çóç?- power3(2,0,P), P > 2.Ç Prolog èá õðïëïãßóåé �çí �éìÞ P = 1, ãéá �çí ïðïßá äåí áëçèåýåé ç äåý�åñç ðñü�áóç�ïõ ó�ü÷ïõ. Óõíåðþò ç Prolog èá ïðéóèïäñïìÞóåé êáé èá ðñïóðáèÞóåé íá âñåß êáé Üëëåò�éìÝò �ïõ P, ÷ñçóéìïðïéþí�áò �ïõò äýï áíáäñïìéêïýò êáíüíåò. Ìå áõ�üí �ïí �ñüðï èáóðá�áëÞóåé ÷ñüíï ãéá íá ó÷çìá�ßóåé äýï íÝïõò ó�ü÷ïõò êáé ãéá íá åëÝãîåé äýï öïñÝò �çóõíèÞêç 0 =\= 0 ðïõ äåí åßíáé áëçèÞò. Áõ�ü ïöåßëå�áé ó�ï ü�é ç Prolog äåí ãíùñßæåé ü�é�ï êá�çãüñçìá power3 õðïëïãßæåé ìßá óõíÜñ�çóç, êÜ�é ðïõ ãíùñßæåé ï ðñïãñáììá�éó�ÞòáëëÜ äåí öáßíå�áé ó�ïí ïñéóìü �ïõ êá�çãïñÞìá�ïò. .Ç Prolog ðáñÝ÷åé Ýíáí ìç÷áíéóìü ìå �ïí ïðïßï ï ðñïãñáììá�éó�Þò ìðïñåß íá åëÝãîåé�çí ïðéóèïäñüìçóç êáé íá �çí áðï�ñÝøåé óå ðåñéð�þóåéò ðïõ åßíáé Üóêïðç. Ï Ýëåã÷ïò�çò ïðéóèïäñüìçóçò ãßíå�áé ìå ÷ñÞóç �çò áðïêïðÞò ðïõ óõìâïëßæå�áé ìå !. Ôï ! ìðïñåßíá �ïðïèå�çèåß ó�ï óþìá åíüò êáíüíá óáí ìßá á�ïìéêÞ ðñü�áóç. Ôçí ðñþ�ç öïñÜ ðïõï áëãüñéèìïò áðÜí�çóçò óå åñþ�çóç èá óõíáí�Þóåé ìßá åìöÜíéóç �ïõ ! ùò ç ðñþ�ç ðñü-�áóç �ïõ �ñÝ÷ïí�ïò ó�ü÷ïõ, �ï äéáãñÜöåé (áêñéâþò üðùò èá Ýêáíå êáé ìå Ýíá ãåãïíüò94

ðïõ ðåñéÝ÷å�áé ó�ï ðñüãñáììá) êáé óõíå÷ßæåé ìå �éò õðüëïéðåò ðñï�Üóåéò �ïõ ó�ü÷ïõ. Áíáñãü�åñá ï áëãüñéèìïò óõíáí�Þóåé �çí ßäéá åìöÜíéóç �ïõ !. ìå�Ü áðü ïðéóèïäñüìçóç,�ü�å ðñïêáëåß�áé Üìåóç áðï�õ÷ßá üëùí �ùí ðñïçãïýìåíùí ó�ü÷ùí ìÝ÷ñé êáé �ïí ó�ü÷ïêá�Ü �çí åðåîåñãáóßá �ïõ ïðïßïõ ðñïÝêõøå �ï !.�áñÜäåéãìá 39 (óõíÝ÷åéá): Ôï êá�çãüñçìá power3 ìðïñåß íá �ñïðïðïéçèåß ìå ÷ñÞóçáðïêïðÞò þó�å íá áðïöåýãå�áé ç Üóêïðç ïðéóèïäñüìçóç:power4(N,0,1) :- !.power4(N,K,P) :- K =\= 0,K mod 2 =:= 0,!,L is K//2,power4(N,L,R),P is R*R.power4(N,K,P) :- K =\= 0,K mod 2 =:= 1,L is K//2,power4(N,L,R),P is R*R*N.Áí ç Prolog õðïëïãßóåé �çí ìçäåíéêÞ äýíáìç åíüò áñéèìïý áðü �ïí ðñþ�ï êáíüíá, �ü�å�ï ! èá �çí åìðïäßóåé áðü �ï íá åðé÷åéñÞóåé íá âñåß Üëëåò �éìÝò åîå�Üæïí�áò �ïõò Üëëïõòêáíüíåò. �áñüìïéá áí ç Prolog õðïëïãßóåé �ç äýíáìç åíüò áñéèìïý ãéá Üñ�éï åêèÝ�ç ìåâÜóç �ï äåý�åñï êáíüíá �ïõ ïñéóìïý, �ü�å �ï ! èá �çí áðï�ñÝøåé áðü �ï íá åðé÷åéñÞóåéíá âñåß êáé Üëëåò �éìÝò åöáñìüæïí�áò �ïí �ñß�ï êáíüíá.�áñá�çñïýìå ü�é áí �åëéêÜ ç Prolog åîå�Üóåé �ïí äåý�åñï êáíüíá �ü�å äåí Ý÷åé óõíá-í�Þóåé �ï ! �ïõ ðñþ�ïõ êáíüíá. Áõ�ü üìùò óçìáßíåé ü�é ç ìå�áâëç�Þ K äåí Ý÷åé �éìÞ 0.Óõíåðþò ìðïñïýìå íá ðáñáëåßøïõìå �ç óõíèÞêç K =\= 0 áðü �ï äåý�åñï êáíüíá. Åðßóçòáí ç Prolog åîå�Üóåé �ïí �ñß�ï êáíüíá �ü�å äåí Ý÷åé óõíáí�Þóåé �ï ! óå êáíÝíáí áðü �ïõòäýï ðñïçãïýìåíïõò êáíüíåò. Áõ�ü üìùò óçìáßíåé ü�é ç ìå�áâëç�Þ K äåí Ý÷åé �éìÞ 0 (áöïýäåí óõíÜí�çóå �ï ! ó�ïí ðñþ�ï êáíüíá) êáé åðßóçò ü�é ç óõíèÞêç K mod 2 =:= 0 äåíåßíáé áëçèÞò (áöïý äåí óõíÜí�çóå �ï ! ó�ïí äåý�åñï êáíüíá), ðïõ óõíåðÜãå�áé ü�é éó÷ýåéK mod 2 =:= 1. Áñá ìðïñïýìå íá ðáñáëåßøïõìå �éò äýï ðñþ�åò óõíèÞêåò áðü �ïí �ñß�ïêáíüíá. êáé íá Ý÷ïõìå �ïí ðáñáêÜ�ù áðëïõó�åõìÝíï ïñéóìü:power5(N,0,1) :- !.power5(N,K,P) :- K mod 2 =:= 0,!,L is K//2,power5(N,L,R),P is R*R.power5(N,K,P) :- L is K//2,power5(N,L,R),P is R*R*N.ÕðÜñ÷åé ìßá óçìáí�éêÞ äéáöïñÜ ó�ç ÷ñÞóç �ïõ ! ó�ïõò ïñéóìïýò �ùí power4 êáé power5.Ó�ïí ïñéóìü �ïõ power4 �ï ! äåí áëëÜæåé �çí óçìáóßá �ïõ ðñïãñÜììá�ïò, áðëÜ áðï�ñÝðåé�çí Üóêïðç ïðéóèïäñüìçóç. Áí ðáñáëåéöèåß �ï ! ðñïêýð�åé éóïäýíáìïò ïñéóìüò (áõ�üò95

�ïõ power3, áðü �ïí ïðïßï îåêéíÞóáìå). Áí�ßèå�á áí äéáãñÜøïõìå �ï ! áðü �ïí äåý�åñïêáíüíá �ïõ power5. �ü�å ðñïêýð�åé Ýíá ðñüãñáììá ðïõ äåí åßíáé éóïäýíáìï ìå �ï power5.power6(N,0,1) :- !.power6(N,K,P) :- K mod 2 =:= 0,L is K//2,power6(N,L,R),P is R*R.power6(N,K,P) :- L is K//2,power6(N,L,R),P is R*R*N.Ïé äéáöïñÜ �ùí ðñïãñáìÜ�ùí öáßíå�áé áðü �éò ðáñáêÜ�ù åñù�Þóåéò:?- power5(2,10,P).P = 1024 ;no?- power6(2,10,P).P = 1024 ;P = 16384 ;P = 2048 ;P = 32768 ;noÁõ�ü óõìâáßíåé åðåéäÞ ç óõíèÞêç K mod 2 =:= 1 åßíáé áðáñáß�ç�ç þó�å íá åßíáé óùó�üòï ïñéóìüò, êáé ó�ï power5 ç óõíèÞêç áõ�Þ åîáóöáëßæå�áé ëüãù �çò ÷ñÞóçò �ïõ !. .Ôï ðáñáêÜ�ù �å÷íç�ü ðáñÜäåéãìá ðáñïõóéÜæåé �á âáóéêü�åñá óåíÜñéá ðïõ ðñïêýð�ïõíáðü �ç ÷ñÞóç �ïõ !.�áñÜäåéãìá 40: ¸ó�ù �ï ðáñáêÜ�ù ðñüãñáììá:g(N,K) :- s(N),!,t(N,K),z(K). % 1g(N,K) :- f(K,N). % 2g(N,0) :- z(N). % 3p(a,1). % 4p(b,2). % 5p( ,3). % 6p(d,4). % 7p(e,2). % 8p(e,1). % 9s(2). % 10s(3). % 11s(4). % 12t(3,0). % 13t(3,2). % 14t(4,1). % 15 96

f(5,1). % 16f(4,4). % 17z(1). % 18z(2). % 19r(a,0). % 20r(b,0). % 21r( ,2). % 22r(d,4). % 23r(e,5). % 24Áí êÜíïõìå �çí åñþ�çóç?- p(a,X),g(X,Y),r(a,Y).ç Prolog éêáíïðïéåß �çí ðñþ�ç ðñü�áóç èÝ�ïí�áò X = 1. Ó�ç óõíÝ÷åéá ðñïóðáèåß íá éêá-íïðïéÞóåé �çí ðñï�áóç g(1,Y) îåêéíþí�áò áðü �ï ðñþ�ï êáíüíá. ÅðåéäÞ ç ðñü�áóç s(1)äåí áëçèåýåé, ï ðñþ�ïò êáíüíáò áðï�õã÷Üíåé ðñéí áðü �ï !. Óõíåðþò ç Prolog ïðéóèï-äñïìåß êáíïíéêÜ, êáé ðñïóðáèåß íá éêáíïðïéÞóåé �çí ðñï�áóç g(1,Y) ìå âÜóç �ï äåý�åñïêáíüíá. Áðï �ïí êáíüíá áõ�üí õðïëïãßæåé �çí �éìÞ Y = 5, ùó�üóï ó�ç óõíÝ÷åéá áðï�õã-÷Üíåé, êáèþò ç ðñü�áóç r(a,5) äåí áëçèåýåé. Ç Prolog ïðéóèïäñïìåß îáíÜ, õðïëïãßæåé�çí �éìÞ Y = 0 áðü �ïí �ñß�ï êáíüíá, êáé åðéó�ñÝöåé �åëéêÜ �çí áðÜí�çóç X = 1, Õ = 0,êáèþò ç ðñü�áóç r(a,0) õðÜñ÷åé ó�ï ðñüãñáììá. Áíáëõ�éêÜ:[0℄ p(a,X),g(X,Y),r(a,Y){X = X, Y = Y}1 --> 4p(a,1).{X = 1}[1℄ g(1,Y),r(a,Y){X = 1, Y = Y}1 --> 1g(N1,K1) :- s(N1),!,t(N1,K1),z(K1).{N1 = 1, K1 = Y}[2℄ s(1),!,t(1,Y),z(Y),r(a,Y){X = 1, Y = Y}1 --> EOPfailure - ba ktra king[1℄ g(1,Y),r(a,Y){X = 1, Y = Y}2 --> 2g(N2,K2) :- f(K2,N2).{N2 = 1, K2 = Y}[2℄ f(Y,1),r(a,Y) 97

{X = 1, Y = Y}1 --> 16f(5,1).{Y = 5}[3℄ r(a,5){X = 1, Y = 5}1 --> EOPfailure - ba ktra king[2℄ f(Y,1),r(a,Y){X = 1, Y = Y}17 --> EOPfailure - ba ktra king[1℄ g(1,Y),r(a,Y){X = 1, Y = Y}3 --> 3g(N3,0) :- z(N3).{N3 = 1, Y = 0}[2℄ z(1),r(a,0){X = 1, Y = 0}1 --> 18z(1).{}[3℄ r(a,0){X = 1, Y = 0}1 --> 20r(a,0).{}[4℄ #{X = 1, Y = 0}--------------------------------------------------------------X = 1Y = 0--------------------------------------------------------------Áí êÜíïõìå �çí åñþ�çóç?- p(b,X),g(X,Y),r(b,Y).ç Prolog éêáíïðïéåß �çí ðñþ�ç ðñü�áóç èÝ�ïí�áò X = 2. Ó�ç óõíÝ÷åéá ðñïóðáèåß íáéêáíïðïéÞóåé �çí ðñï�áóç g(2,Y) îåêéíþí�áò áðü �ï ðñþ�ï êáíüíá. Ç ðñü�áóç s(2)õðÜñ÷åé ó�ï ðñüãñáììá êáé ç Prolog óõíáí�Üåé �ï !. Ó�ç óõíÝ÷åéá áðï�õã÷Üíåé íá éêá-íïðïéÞóåé �çí ðñü�áóç t(2,Y) êáé �ï ! åìðïäßæåé �çí ïðéóèïäñüìçóç ãéá éêáíáíïðïßçóç�çò ðñü�áóçò g(2,Y), ç ïðïßá áðï�õã÷Üíåé Üìåóá. ÅðåéäÞ äåí õðÜñ÷ïõí Üëëåò �éìÝò �ïõX ãéá �éò ïðïßåò íá éêáíïðïéåß�áé ç ðñü�áóç p(b,X) ç Prolog åðéó�ñÝöåé no. Áíáëõ�éêÜ:98

[0℄ p(b,X),g(X,Y),r(b,Y){X = X, Y = Y}1 --> 5p(b,2).{X = 2}[1℄ g(2,Y),r(b,Y){X = 2, Y = Y}1 --> 1g(N1,K1) :- s(N1),!,t(N1,K1),z(K1).{N1 = 2, K1 = Y}[2℄ s(2),!,t(2,Y),z(Y),r(b,Y){X = 2, Y = Y}1 --> 10s(2).{}[3℄ !,t(2,Y),z(Y),r(b,Y){X = 2, Y = Y}! : su eeds[4℄ t(2,Y),z(Y),r(b,Y){X = 2, Y = Y}1 --> EOPfailure - ba ktra king[3℄ !,t(2,Y),z(Y),r(b,Y){X = 2, Y = Y}! : ontrols ba ktra king[0℄ p(b,X),g(X,Y),r(b,Y){X = X, Y = Y}6 --> EOPfailure--------------------------------------------------------------no--------------------------------------------------------------Áí êÜíïõìå �çí åñþ�çóç?- p( ,X),g(X,Y),r( ,Y).ç Prolog éêáíïðïéåß �çí ðñþ�ç ðñü�áóç èÝ�ïí�áò X = 3. Ó�ç óõíÝ÷åéá ðñïóðáèåß íáéêáíïðïéÞóåé �çí ðñï�áóç g(3,Y) îåêéíþí�áò áðü �ï ðñþ�ï êáíüíá. Ç ðñü�áóç s(3)õðÜñ÷åé ó�ï ðñüãñáììá êáé ç Prolog óõíáí�Üåé �ï !. Ç ðñü�áóç t(3,Y) áëçèåýåé ãéáY = 0, ùó�üóï äåí áëçèåýåé ç z(0). Ç Prolog ïðéóèïäñïìåß ó�ï ðñïçãïýìåíï ó�ü÷ï÷ùñßò íá óõíáí�Þóåé �ï ! êáé éêáíïðïéåß �ï t(3,Y) èÝ�ïí�áò Y = 2. Ïé ðñï�Üóåéò z(2)êáé r( ,2) áëçèåýïõí, êáé �åëéêÜ åðéó�ñÝöå�áé ç áðÜí�çóç X = 3, Õ = 2.99

Áíáëõ�éêÜ:[0℄ p( ,X),g(X,Y),r( ,Y){X = X, Y = Y}1 --> 6p( ,3).{X = 3}[1℄ g(3,Y),r( ,Y){X = 3, Y = Y}1 --> 1g(N1,K1) :- s(N1),!,t(N1,K1),z(K1).{N1 = 3, K1 = Y}[2℄ s(3),!,t(3,Y),z(Y),r( ,Y){X = 3, Y = Y}1 --> 11s(3).{}[3℄ !,t(3,Y),z(Y),r( ,Y){X = 3, Y = Y}! : su eeds[4℄ t(3,Y),z(Y),r( ,Y){X = 3, Y = Y}1 --> 13t(3,0).{Y = 0}[5℄ z(0),r( ,0){X = 3, Y = 0}1 --> EOPfailure - ba ktra king[4℄ t(3,Y),z(Y),r( ,Y){X = 3, Y = Y}14 --> 14t(3,2).{Y = 2}[5℄ z(2),r( ,2){X = 3, Y = 2}1 --> 19z(2).{}[6℄ r( ,2){X = 3, Y = 2} 100

1 --> 22r( ,2).{}[7℄ #{X = 3, Y = 2}--------------------------------------------------------------X = 3Y = 2--------------------------------------------------------------¸ó�ù �þñá ü�é êÜíïõìå �çí åñþ�çóç?- p(d,X),g(X,Y),r(d,Y).ç Prolog éêáíïðïéåß �çí ðñþ�ç ðñü�áóç èÝ�ïí�áò X = 4 êáé �ç äåý�åñç ðñï�áóç èÝ�ùí�áòY = 1, ìå åöáñìïãÞ �ïõ ðñþ�ïõ êáíüíá. ÅðåéäÞ ç ðñü�áóç r(4,1) äåí áëçèåýåé, ãßíå�áéïðéóèïäñüìçóç ç ïðïßá óõíáí�Üåé �ï !. Áõ�ü áðï�ñÝðåé �çí Prolog áðü �ï åîå�Üóåé �ïäåý�åñï êáé �ïí �ñß�ï êáíüíá ó�ïí ïñéóìü �ïõ g ãéá íá âñåé Üëëåò �éìÝò �çò Y ãéá �éòïðïßåò áëçèåýåé ç ðñü�áóç g(4,Y). ÅðåéäÞ äåí õðÜñ÷ïõí Üëëåò �éìÝò �ïõ X ãéá �éò ïðïßåòíá áëçèåýåé ç ðñü�áóç p(d,X) ç Prolog åðéó�ñÝöåé no.Áíáëõ�éêÜ:[0℄ p(d,X),g(X,Y),r(d,Y){X = X, Y = Y}1 --> 7p(d,4).{X = 4}[1℄ g(4,Y),r(d,Y){X = 4, Y = Y}1 --> 1g(N1,K1) :- s(N1),!,t(N1,K1),z(K1).{N1 = 4, K1 = Y}[2℄ s(4),!,t(4,Y),z(Y),r(d,Y){X = 4, Y = Y}1 --> 12s(4).{}[3℄ !,t(4,Y),z(Y),r(d,Y){X = 4, Y = Y}! : su eeds[4℄ t(4,Y),z(Y),r(d,Y){X = 4, Y = Y}1 --> 15t(4,1). 101

{Y = 1}[5℄ z(1),r(d,1){X = 4, Y = 1}1 --> 18z(1).{}[6℄ r(d,1){X = 4, Y = 1}1 --> EOPfailure - ba ktra king[5℄ z(1),r(d,1){X = 4, Y = 1}19 --> EOPfailure - ba ktra king[4℄ t(4,Y),z(Y),r(d,Y){X = 4, Y = Y}16 --> EOPfailure - ba ktra king[3℄ !,t(4,Y),z(Y),r(d,Y){X = 4, Y = Y}! : ontrols ba ktra king[0℄ p(d,X),g(X,Y),r(d,Y){X = X, Y = Y}8 --> EOPfailure--------------------------------------------------------------no--------------------------------------------------------------¸ó�ù �Ýëïò ç åñþ�çóç?- p(e,X),g(X,Y),r(e,Y).�áñüìïéá ìå �çí åñþ�çóç ãéá �ï b ç Prolog éêáíïðïéåß �çí ðñþ�ç ðñü�áóç èÝ�ïí�áò X = 2.Ó�ç óõíÝ÷åéá ðñïóðáèåß íá éêáíïðïéÞóåé �çí ðñï�áóç g(2,Y) îåêéíþí�áò áðü �ï ðñþ�ïêáíüíá, áðï�õã÷Üíåé íá éêáíïðïéÞóåé �ï t(2,Y) êáé ëüãù �ïõ ! áðï�õã÷Üíåé Üìåóá íáéêáíïðïéÞóåé �ï g(2,Y). Ó�ç óõíÝ÷åéá åðéó�ñÝöåé ó�ïí áñ÷éêü ó�ü÷ï êáé éêáíïðïéåß �ïp(b,X) èÝ�ïí�áò X = 1. ÔåëéêÜ åðéó�ñÝöåé �çí áðÜí�çóç X = 1, Õ = 5. ÂëÝðïõìå ü�é�ï ! äåí åìðïäßæåé �çí áíáæÞ�çóç Üëëùí �éìþí ãéá �ç X þó�å íá áëçèåýåé ç ðñü�áóçp(e,X), áöïý ï Ýëåã÷ïò �çò ïðéóèïäñüìçóçò áöïñÜ ìüíï �ïí ïñéóìü �ïõ g. Áíáëõ�éêÜ:[0℄ p(e,X),g(X,Y),r(e,Y){X = X, Y = Y}1 --> 8 102

p(e,2).{X = 2}[1℄ g(2,Y),r(e,Y){X = 2, Y = Y}1 --> 1g(N1,K1) :- s(N1),!,t(N1,K1),z(K1).{N1 = 2, K1 = Y}[2℄ s(2),!,t(2,Y),z(Y),r(e,Y){X = 2, Y = Y}1 --> 10s(2).{}[3℄ !,t(2,Y),z(Y),r(e,Y){X = 2, Y = Y}! : su eeds[4℄ t(2,Y),z(Y),r(e,Y){X = 2, Y = Y}1 --> EOPfailure - ba ktra king[3℄ !,t(2,Y),z(Y),r(e,Y){X = 2, Y = Y}! : ontrols ba ktra king[0℄ p(e,X),g(X,Y),r(e,Y){X = X, Y = Y}9 --> 9p(e,1).{X = 1}[1℄ g(1,Y),r(e,Y){X = 1, Y = Y}1 --> 1g(N1,K1) :- s(N1),!,t(N1,K1),z(K1).{N1 = 1, K1 = Y}[2℄ s(1),!,t(1,Y),z(Y),r(e,Y){X = 1, Y = Y}1 --> EOPfailure - ba ktra king[1℄ g(1,Y),r(e,Y){X = 1, Y = Y}2 --> 2g(N2,K2) :- f(K2,N2). 103

{N2 = 1, K2 = Y}[2℄ f(Y,1),r(e,Y){X = 1, Y = Y}1 --> 16f(5,1).{Y = 5}[3℄ r(e,5){X = 1, Y = 5}1 --> 24r( ,5).{}[4℄ #{X = 1, Y = 5}--------------------------------------------------------------X = 1Y = 5--------------------------------------------------------------Óçìåéþíå�áé ü�é áí ðáñáëåßðáìå �ï ! �ü�å ç óçìáóßá �ïõ ðñïãñÜììá�ïò èá Þ�áí äéá-öïñå�éêÞ (èá ðáßñíáìå áðÜí�çóç äéáöïñå�éêÞ �ïõ no óå üëåò �éò åñù�Þóåéò). Ôï ßäéï èáóõíÝâáéíå êáé áí äéá�çñÞóïõìå �ï ! êáé ìå�áöÝñáìå �ïí êáíüíá ðïõ �ï ðåñéÝ÷åé ó�ï �Ýëïò�ïõ ïñéóìïý �ïõ êá�çãïñÞìá�ïò g. Óõíåðþò �ï ! åê�üò �ïõ ü�é åëÝã÷åé �çí ïðéóèïäñü-ìçóç, êá�áó�ñÝöåé �ïí äçëù�éêü ÷áñáê�Þñá �çò Prolog. .�áñÜäåéãìá 41: Åýñåóç ðñþ�çò åìöÜíéóçò ó�ïé÷åßïõ óå ëßó�á.Ôï ðáñáêÜ�ù êá�çãüñçìá find(X,L,N) áëçèåýåé áí �ï ó�ïé÷åßï X åìöáíßæå�áé ó�ç èÝóçN �çò ëßó�áò L.find(X,[X|T℄,1).find(X,[H|T℄,N):- find(X,T,K),N is K+1.¸íá ó�ïé÷åßï ìðïñåß íá åìöáíßæå�áé óå ðïëëÝò èÝóåéò ìßáò ëßó�áò:find(1,[5,1,2,3,1,1,2℄,N).N = 2 ;N = 5 ;N = 6 ;noÌðïñïýìå íá ïñßóïõìå Ýíá ðáñüìïéï êáí�çãüñçìá find1(X,L,N) �ï ïðïßï èá áëçèåýåéáí �ï ó�ïé÷åßï X åìöáíßæå�áé ãéá ðñþ�ç öïñÜ ó�ç èÝóç N �çò ëßó�áò L. Ï ïñéóìüò �ïõfind1 ìðïñåß íá ðñïêýøåé ìå ìßá áðëÞ �ñïðïðïßçóç �ïõ ïñéóìïý �ïõ find, åéóÜãïí�áò�ï ! ó�çí ðñþ�ç ðñü�áóç þó�å íá áðïöÝõãå�áé ç ïðéóèïäñüìçóç ðïõ ïäçãåß óå åýñåóçðïëëáðëþí áðáí�Þóåùí.find1(X,[X|T℄,1) :- !.find1(X,[H|T℄,N):- find1(X,T,K),N is K+1. 104

Ïé åñù�Þóåéò ðïõ ó÷çìá�ßæïí�áé ìå �ï find1, åðéó�ñÝöïõí �ï ðïëý ìßá áðÜí�çóç:find1(1,[5,1,2,3,1,1,2℄,N).N = 2 ;nofind1(×,[5,1,2,3,1,1,2℄,N).× = 5N = 1 ;no�áñÜäåéãìá 42: ÄéáãñáöÞ üëùí �ùí åìöáíßóåùí ó�ïé÷åßïõ áðü ëßó�á.Èá ïñßóïõìå �ï êá�çãüñçìá deleteAll(X,S,L) �ï ïðïßï áëçèåýåé áí ç ëßó�á L ðñï-êýð�åé ìå äéáãñáöÞ üëùí �ùí åìöáíßóåùí �ïõ X áðü �çí S. Ï ïñéóìüò ó�çñßæå�áé ó�éòðáñáêÜ�ù ðáñá�çñÞóåéò: (á) áí �ï ó�ïé÷åßï X ðïõ äéáãñÜöå�áé åßíáé ç êåöáëÞ �çò S, �ü�åç S åßíáé �çò ìïñöÞò [X|T℄ êáé ç ëßó�á L ðñïêýð�åé ìå äéáãñáöÞ üëùí �ùí åìöáíßóåùí�çò X áðü �çí T. (â) áí �ï ó�ïé÷åßï X äåí åßíáé ç êåöáëÞ �çò S, �ü�å ç S åßíáé �çò ìïñöÞò[Ç|T℄, ìå H äéÜöïñï �ïõ X, êáé ç L åßíáé �çò ìïñöÞò [Ç|R℄ (Ý÷åé äçëáäÞ �çí ßäéá êåöáëÞìå �çí S), üðïõ R åßíáé ç ëßó�á ðïõ ðñïêýð�åé ìå äéáãñáöÞ üëùí �ùí åìöáíßóåùí �çò Xáðü �çí T.Ó�ïí ðáñáêÜ�ù ïñéóìü ç óõíèÞêç ðïõ áðáé�åß�áé áðü �ï (â) åîáóöáëßæå�áé ìå ÷ñÞóç�ïõ !: áí �ï X åßíáé ç êåöáëÞ �çò ëßó�áò, �ü�å ï ðñþ�ïò áíáäñïìéêüò êáíüíáò èá ö�Üóåéó�ï ! ðïõ èá áðï�ñÝøåé �çí åîÝ�áóç �ïõ �åëåõ�áßïõ êáíüíá. Óõíåðþò áí åîå�áó�åß ï�åëåõ�áßïò êáíüíáò, �ï X äåí èá åßíáé ç êåöáëÞ �çò ëßó�áò êáé èá ðñÝðåé íá óõìðåñéëçöèåßó�ç ëßó�á èá ðñïêýøåé áðü �ç äéáãñáöÞ.deleteAll(X,[℄,[℄).deleteAll(X,[X|T℄,L) :- !,deleteAll(X,T,L).deleteAll(X,[H|T℄,[H|R℄) :- deleteAll(X,T,R)..Ó�á ðáñáðÜíù ðáñáäåßãìá�á öáßíå�áé ç ÷ñÞóç �çò áðïêïðÞò þó�å íá áðïöåýãå�áé çÜóêïðç ïðéóèïäñüìçóç, íá áðïöåýãå�áé ç åýñåóç åíáëëáê�éêþí áðáí�Þóåùí êáé íá áðï-�ñÝðå�áé ç åîÝ�áóç êáíüíùí ðïõ Ýðïí�áé Ýíüò êáíüíá ðïõ ïäçãåß óå åðé�õ÷ßá, ÷ùñßò íááðáé�åß�áé ïé êáíüíåò áõ�ïß íá ðåñéÝ÷ïõí �éò áñíÞóåéò óõíèçêþí ðïõ Þäç Ý÷ïõí åëåã-÷èåß. Ó�ç óõíÝ÷åéá èá äïýìå ðþò ìðïñïýìå íá ÷ñçóéìïðïéÞóïõìå �çí áðïêïðÞ ãéá íáåíóùìá�þóïõìå ó�çí Prolog ìéá ìïñöÞ Üñíçóçò1.19 Áñíçóç ùò Áðï�õ÷ßáÓ�çí Prolog ìðïñïýìå íá äçëþóïõìå Üìåóá ü�é ìßá ðñü�áóç åßíáé áëçèÞò, ùó�üóï äåíìðïñïýìå íá äçëþóïõìå ü�é ìßá ðñü�áóç åßíáé øåõäÞò. Ìéá ðñü�áóç åßíáé øåõäÞò ãéá �çíProlog áí äåí ìðïñåß íá áðïäåßîåé ü�é ðñïêýð�åé áðü �ï ðñüãñáììá. ×ñçóéìïðïéþí�áò�çí áðïêïðÞ ìðïñïýìå íá ïñßóïõìå ìßá ìïñöÞ Üñíçóçò, ç ïðïßá ïíïìÜæå�áé Üñíçóç ùòáðï�õ÷ßá. 105

�áñÜäåéãìá 43: Èá ïñßóïõìå �ï êá�çãüñçìá not_parent(X,Y) �ï ïðïßï áëçèåýåé áíï X äåí åßíáé ãïíÝáò �ïõ Y. Ó�ïí ïñéóìü ÷ñçóéìïðïéïýìå �ï êá�çãüñçìá parent, üðùòåðßóçò êáé �ï åíóùìá�ùìÝíï êá�çãüñçìá fail, �ï ïðïßï áðï�õã÷Üíåé ðÜí�á.not_parent(X,Y) :- parent(X,Y),!,fail.not_parent(X,Y).Áí ï X åßíáé ãïíÝáò �ïõ Y, �ü�å ç ðñü�áóç parent(X,Y) ó�ï óþìá �ïõ êáíüíá áëçèåýåé,ç Prolog óõíáí�Üåé �ï ! êáé ó�ç óõíÝ÷åéá áðï�õã÷Üíåé ëüãù �ïõ fail. Ôï ! áðï�ñÝðåé�çí ïðéóèïäñüìçóç, óõíåðþò �ï not_parent(X,Y) äåí ðñïêýð�åé áðü �ï ðñüãñáììá. Áíáí�ßèå�á ï X äåí åßíáé ãïíÝáò �ïõ Y, �ü�å ç ðñü�áóç parent(X,Y) äåí áëçèåýåé, êáé Üñá�ï not_parent(X,Y) áëçèåýåé ìå âÜóç �ï äåý�åñï êáíüíá. .�áñÜäåéãìá 44: Ìðïñïýìå íá ïñßóïõìå Ýíá êá�çãüñçìá 'Not' (õøçëü�åñçò �Üîçò)�ï ïðïßï èá ðÝñíåé ùò üñéóìá ìßá ðñü�áóç êáé èá áëçèåýåé áí ç ðñü�áóç äåí ðñïêýð�åéëïãéêÜ áðü �ï ðñüãñáììá. Ï ïñéóìüò �ïõ åßíáé ðáñüìïéïò ìå áõ�üí �ïõ not_member(X,L)ó�ï ðñïçãïýìåíï ðáñÜäåéãìá.'Not'(P) :- P,!,fail.'Not'(P).Ìðïñïýìå íá ÷ñçóéìïðïéÞóïõìå �ï 'Not' ãéá íá ó÷çìá�ßóïõìå �çí Üñíçóç êá�çãïñçìÜ-�ùí ðïõ Ý÷ïõìå ïñßóåé:?- 'Not'(member(2,[1,2,3℄)).no?- 'Not'(member(4,[1,2,3℄)).yes?- 'Not'(member(X,[1,2,3℄)).no?- 'Not'(member(X,[℄)).X = _0�áñá�çñïýìå ü�é ü�áí ç åñþ�çóç ðåñéÝ÷åé ìå�áâëç�Ýò, �ü�å áí õðÜñ÷åé Ýó�ù êáé Ýíáòóõíäõáóìüò �éìþí ãéá �éò ìå�áâëç�Ýò áõ�Ýò ãéá �éò ïðïßåò �ï üñéóìá �ïõ 'Not' íá áëç-èåýåé, ç Prolog åðéó�ñÝöåé áðÜí�çóç no, ðáñü�é ãéá êÜðïéåò Üëëåò �éìÝò �ùí ìå�áâëç�þíüñéóìá �ïõ 'Not' ìðïñåß íá ìç áëçèåýåé. Áí �ï üñéóìá �ïõ 'Not' äåí áëçèåýåé ãéá êáìßá�éìÞ �ùí ìå�áâëç�þí �ü�å ç Prolog åðé�õã÷Üíåé, ÷ùñßò üìùò íá äåóìåýåé �éò ìå�áâëç�Ýòðïõ ðåñéÝ÷ïí�áé ó�çí åñþ�çóç. .Ç Prolog äéáèÝ�åé �ïí �åëåó�Þ not, ï ïðïßïò ïñßæå�áé üðùò �ï êá�çãüñçìá 'Not' (áðëÜäåí áðáé�åß �ï üñéóìÜ �ïõ íá êëåßíå�áé óå ðáñáíèÝóåéò). Ï�áí êÜíïõìå ó�ç Prolog ìßáåñþ�çóç �çò ìïñöÞò?- not P.(üðïõ P á�ïìéêÞ ðñü�áóç Þ áêïëïõèßá á�ïìéêþí ðñï�Üóåùí ìÝóá óå ðáñÝíèåóç) ç Prologðñïóðáèåß íá áðïäåßîåé �çí P. Áí ðå�ý÷åé áðáí�Üåé no, áëëéþò åðéó�ñÝöåé èå�éêÞ áðÜí�çóç(yes, Þ �éò ìå�áâëç�Ýò �çò åñþ�çóçò ÷ùñßò äÝóìåõóç).106

Ç Üñíçóç ðïõ ïñßæå�áé ìå �ïí �åëåó�Þ not äéáöÝñåé áðü �ç ëïãéêÞ Üñíçóç. Ç Üñíçóçó�çí Prolog åßíáé Üñíçóç ùò áðï�õ÷ßá: ç ðñü�áóç not P áëçèåýåé ó�çí ðåñßð�ùóç ðïõç P äåí áðïäåéêíýå�áé áðü �ï ðñüãñáììá. Áõ�ü üìùò äåí óçìáßíåé ü�é ç not P áðï�åëåßëïãéêÞ óõíÝðåéá �ïõ ðñïãñÜììá�ïò.�áñÜäåéãìá 45: Ôï ðáñáêÜ�ù ðñüãñáììá áðo�åëåß�áé áðü ðñï�Üóåéò ðïõ áöïñïýí �éòêáèçìåñéíÝò ð�Þóåéò áðü ÁèÞíá ðñïò ÉùÜííéíá êáé áí�ßó�ñïöá:flight('ATHENS','IOANNINA',time(13,15)).flight('ATHENS','IOANNINA',time(15,50)).flight('IOANNINA','ATHENS',time(14,45)).flight('IOANNINA','ATHENS',time(17,20)).Áí êÜíïõìå �çí åñþ�çóç?- not flight('ATHENS', 'IOANNINA', time(8,00)).ç Prolog èá áðáí�Þóåé yes. Ùó�üóï ç ðñü�áóç ó�çí åñþ�çóç äåí ðñïêýð�åé ëïãéêÜ áðü�ï ðñüãñáììá. Ç áðÜí�çóç áõ�Þ ìðïñåß íá èåùñçèåß åýëïãç áí êÜíïõìå �çí õðüèåóç ü�éüëåò ïé ð�Þóåéò ìå�áîý �ùí äýï ðüëåùí åßíáé êá�áãåãñáìÝíåò ó�ï ðñüãñáììá. .¼ðùò öáßíå�áé êáé áðü �ï ðáñáðÜíù ðáñÜäåéãìá ç Prolog èåùñåß øåõäåßò üóåò ðñï�Ü-óåéò äåí ðñïêýð�ïõí áðü �ï ðñüãñáììá êáé óõíåðþò èåùñåß áëçèåßò �éò áñíÞóåéò �ïõò.Áõ�ü ïíïìÜæå�áé `õðüèåóç �ïõ êëåéó�ïý êüóìïõ' ç ïðïßá ìðïñåß íá åöáñìïó�åß óå ðïëëÝòðåñéð�þóåéò, üðùò ó�ï ðáñáðÜíù ðáñÜäåéãìá.ÖõóéêÜ ç õðüèåóç �ïõ êëåéó�ïý êüóìïõ äåí åßíáé êáèïëéêÜ åöáñìüóéìç: áí ãéá ðáñÜ-äåéãìá ó�ï âéâëßï �ùí Äéáêñé�þí Ìáèçìá�éêþí äåí áíáöÝñå�áé �ï �õèáãüñéï èåþñçìá,áõ�ü äåí óçìáßíåé ü�é äåí éó÷ýåé êáé ü�é ìðïñïýìå ó�ï ðëáßóéï �ïõ ìáèÞìá�ïò áõ�ïý íáèåùñïýìå ü�é ç ÜñíçóÞ �ïõ åßíáé áëçèÞò.Ó�ï ðáñáêÜ�ù ðáñÜäåéãìá öáßíå�áé ç äéáöïñÜ �çò Üñíçóçò ó�ç ìáèçìá�éêÞ ëïãéêÞ êáé�çò Üñíçóçò ùò áðï�õ÷ßá.�áñÜäåéãìá 46: Ó�ç ìáèçìá�éêÞ ëïãéêÞ ïé �ñåßò ðáñáêÜ�ù ðñï�Üóåéò åßíáé éóïäýíá-ìåò• male(X) ∨ female(X)

• ¬male(X) → female(X)

• ¬female(X) → male(X)(�ï ∨ óõìâïëßæåé �ï ëïãéêü `Þ' åíþ �ï ¬ �ç ëïãéêÞ Üñíçóç).Ç äåý�åñç ðñü�áóç áí�éó�ïé÷åß ó�ïí ðáñáêÜ�ù êáíüíá Prolog:female(X) :- not male(X).Áí öïñ�þóïõìå �ï ðñüãñáììá ðïõ áðï�åëåß�áé ìüíï áðü �ïí ðáñáðÜíù êáíüíá �ü�åðáßñíïõìå �éò ðáñáêÜ�ù áðáí�Þóåéò: 107

?- male('Lauren e').no?- female('Lauren e').yesÇ �ñß�ç ðñü�áóç áí�éó�ïé÷åß ó�ïí ðáñáêÜ�ù êáíüíá Prolog:male(X) :- not female(X).Áí öïñ�þóïõìå �ï ðñüãñáììá ðïõ áðï�åëåß�áé ìüíï áðü �ïí ðáñáðÜíù êáíüíá �ü�åðáßñíïõìå �éò ðáñáêÜ�ù áðáí�Þóåéò:?- male('Lauren e').yes?- female('Lauren e').no�áñá�çñïýìå ü�é ç ÷ñÞóç �çò Üñíçóçò ùò áðï�õ÷ßá ó�ç èÝóç �çò êëáóéêÞò Üñíçóçò Ý÷åéùò áðï�Ýëåóìá ïé êáíüíåò ðïõ áí�éó�ïé÷ïýí óå äýï éóïäýíáìåò ðñï�Üóåéò �çò ëïãéêÞò íáÝ÷ïõí äéáöïñå�éêÞ óçìáóßá ãéá �çí Prolog. .1.20 Åíóùìá�ùìÝíá Êá�çãïñÞìá�áÇ Prolog äéáèÝ�åé Ýíá ðëÞèïò åíóùìá�ùìÝíùí êá�çãïñçìÜ�ùí ðïõ åðé�ñÝðïõí íá åëÝã-÷ïõìå �ïí `�ýðï' �ùí üñùí:• number: áëçèåýåé áí �ï üñéóìÜ �ïõ åßíáé áñéèìüò Þ ìå�áâëç�Þ äåóìåõìÝíç óå áñéèìü• integer: áëçèåýåé áí �ï üñéóìÜ �ïõ åßíáé áêÝñáéïò Þ ìå�áâëç�Þ äåóìåõìÝíç óåáêÝñáéï• float: áëçèåýåé áí �ï üñéóìÜ �ïõ åßíáé ðñáãìá�éêüò Þ ìå�áâëç�Þ äåóìåõìÝíç óåðñáãìá�éêü• atom: áëçèåýåé áí �ï üñéóìÜ �ïõ åßíáé Ü�ïìï Þ ìå�áâëç�Þ äåóìåõìÝíç óå Ü�ïìï• atomi : áëçèåýåé áí �ï üñéóìÜ �ïõ åßíáé Ü�ïìï Þ áñéèìüò, Þ ìå�áâëç�Þ äåóìåõìÝíçóå Ü�ïìï Þ áñéèìü• ompound: áëçèåýåé áí �ï üñéóìÜ �ïõ åßíáé óýíèå�ïò üñïò Þ ìå�áâëç�Þ äåóìåõìÝíçóå óýíèå�ï üñï• var: áëçèåýåé áí �ï üñéóìÜ �ïõ ìå�áâëç�Þ ÷ùñßò äÝóìåõóç.• nonvar: áëçèåýåé áí �ï üñéóìÜ äåí åßíáé ìå�áâëç�Þ Þ åßíáé äåóìåõìÝíç ìå�áâëç�Þ

108

�áñáäåßãìá�á ÷ñÞóçò �ùí ðáñáðÜíù êá�çãïñçìÜ�ùí:?- integer(1).yes?- integer(X).no?- X = 1, integer(X).X = 1?- atom(a).yes?- atom(0).no?- atomi (a).yes?- atomi (0).yes?- atomi (f(X)).no?- var(X).X = _0?- X = f(X), var(X).no×ñçóéìïðïéþí�áò �á ðáñáðÜíù êá�çãïñÞìá�á ìðïñïýìå åëÝã÷ïõìå �ïí �ýðï �ùí ïñé-óìÜ�ùí ó�ïõò êáíüíåò ðïõ ïñßæïõí Ýíá êá�çãüñçìá, Ý�óé þó�å íá áðïìïíþíïõìå �éòðñïâëçìá�éêÝò ðåñéð�þóåéò.�áñÜäåéãìá 47: Áñéèìç�éêÝò óõíáñ�Þóåéò.×ñçóéìïðïéþí�áò �ï åíóùìá�ùìÝíï êá�çãüñçìá integer êáé �ï ! ìðïñïýìå íá ïñßóïõìå�çí áðüëõ�á ïñèÞ õëïðïßçóç �ïõ êá�çãïñÞìá�ïò ãéá õðïëïãéóìü �ïõ ðáñáãïí�éêïý. Ôïinteger ÷ñçóéìïðïéåß�áé ãéá íá åîáóöáëßóåé ü�é �ï üñéóìá åßíáé áêÝñáéïò áñéèìüò. Ó�çóõíÝ÷åéá ï �åëåó�Þò >= ÷ñçóéìïðïéåß�áé ãéá íá åîáóöáëßóåé �ï ü�é ï áñéèìüò åßíáé ìçáñíç�éêüò. Ôï ! ÷ñçóéìïðïéåß�áé ãéá íá áðïöåýãå�áé ç ÷ñÞóç �ïõ äåý�åñïõ êáíüíá ü�áíæç�çèïýí åíáëëáê�éêÝò �éìÝò ãéá �ï 0!, ÷ùñßò íá áðáé�åß�áé ç óýãêñéóç N > 0 ó�ïí áíá-äñïìéêü êáíüíá:fa tGen(N,F) :- integer(N),N >= 0,fa t4(N,F). 109

fa t4(0,1) :- !.fa t4(N,F) :- K is N-1,fa t4(K,G),F is N*G.Áí �ï ðñþ�ï üñéóìá åßíáé ìç áñíç�éêüò áêÝñáéïò (Þ ìå�áâëç�Þ ðïõ Ý÷åé äåóìåõ�åß óå ìçáñíç�éêü áêÝñáéï) åðéó�ñÝöå�áé ìßá ìüíï áðÜí�çóç ðïõ åßíáé ç óùó�Þ �éìÞ �ïõ ðáñáãï-í�éêïý:?- fa tGen(4,X).X = 24 ;no?- fa tGen(-3,X).no?- fa tGen(N,120).no?- N = 3, fa tGen(N,X).N = 3X = 6?- fa tGen(a,X).noÁí�ßó�ïé÷á ìðïñïýìå íá åéóÜãïõìå Ýëåã÷ï �ýðïõ êáé ïðéóèïäñüìçóçò ó�ïõò ïñéóìïýò�ùí êá�çãïñçìÜ�ùí ãéá õðïëïãéóìü äýíáìçò, ìÝãéó�ïõ êïéíïý äéáéñÝ�ç êëð.powerGen(N,K,P) :- number(N),integer(K),K >= 0,power5(N,K,P).power5(N,0,1) :- !.power5(N,K,P) :- K mod 2 =:= 0,!,L is K//2,power5(N,L,R),P is R*R.power5(N,K,P) :- L is K//2,power5(N,L,R),P is R*R*N.g dEu Gen(M,N,D):- integer(M),integer(N),M > 0,N > 0,g dEu 3(M,N,D).g dEu 3(N,N,N) :- !. 110

g dEu 3(M,N,D) :- M < N,!,K is N-M,g dEu 3(M,K,D).g dEu 3(M,N,D) :- K is M-N,g dEu 3(N,K,D).ÌÝ÷ñé �þñá ãéá íá ðÜñïõìå üëåò �éò äéáöïñå�éêÝò áðáí�Þóåéò óå ìßá åñþ�çóç, ãñÜöáìå; ìå�Ü áðü êÜèå áðÜí�çóç. ÅíäÝ÷å�áé üìùò íá èÝëïõìå íá óõãêåí�ñþóïõìå üëåò �éòáðáí�Þóåéò þó�å íá ìðïñïýìå íá �éò åðåîåñãáó�ïýìå óõíïëéêÜ. Áõ�ü ìðïñåß íá ãßíåé ìå�á åíóùìá�ùìÝíá êá�çãïñÞìá�á bagof êáé setof.Áí X åßíáé ìå�áâëç�Þ êáé Q åßíáé ìßá åñþ�çóç ó�çí ïðïßá ç ìïíáäéêÞ ìå�áâëç�Þ åßíáéç X, �ü�å �ï bagof(X,Q,L) áëçèåýåé áí L åßíáé ç ëßó�á ìå üëåò �éò �éìÝò �çò X ðïõ èáðÝñíáìå ùò áðáí�Þóåéò áí êÜíáìå �çí åñþ�çóç?- Q.�éá ðáñÜäåéãìá ãéá íá âñïýìå �ç ëßó�á ìå üëá �á ðáéäéÜ �çò Äéþíçò êÜíïõìå �çí åñþ�çóç?- bagof(X,parent(dioni,X),L).X = _0L = [pelopas,niovi℄åíþ ãéá íá âñïýìå �ç ëßó�á ìå üëåò �éò ìå�áèÝóåéò �çò [1,2,3℄, êÜíïõìå �çí åñþ�çóç?- bagof(P,perm1([1,2,3℄,P),L).P = _0L = [[1,2,3℄,[2,1,3℄,[2,3,1℄,[1,3,2℄,[3,1,2℄,[3,2,1℄℄Áí ç åñþ�çóç åßíáé óýíèå�ç, �ü�å �çí êëåßíïõìå óå ðáñåíèÝóåéò:?- bagof(X,(prede essor(tantalos,X),male(X)),L).X = _0L = [pelopas,atreas℄Ó�ç ãåíéêÞ ðåñßð�ùóç, �ï ðñþ�ï üñéóìá ìðïñåß íá åßíáé üñïò T ïðïéáóäÞðï�å ìïñöÞò ðïõåíäÝ÷å�áé íá ðåñéÝ÷åé ïðïéïäÞðï�å ðëÞèïò ìå�áâëç�þí. Óå áõ�Þ �çí ðåñßð�ùóç áõ�Þ çëßó�á L áðï�åëåß�áé áðü üëïõò �ïõò üñïõò ðïõ ðñïêýð�ïõí áðü �ïí T ìå áí�éêá�Üó�áóç�ùí ìå�áâëç�þí óýìöùíá ìå �éò äåóìåýóåéò óå êÜèå áðÜí�çóç ãéá �çí Q. Áí ç Q äåíìðïñåß íá éêáíïðïéçèåß �ü�å åðéó�ñÝöå�áé no êáé ü÷é ç êåíÞ ëßó�á.?- bagof(A+B, sum(A,B,s(s(0))),L).A = _0B = _1L = [s(s(0))+0,s(0)+s(0),0+s(s(0))℄?- bagof(A, sum(A,s(s(s(0))),0),L).noÁí ç åñþ�çóç Q ðåñéÝ÷åé ìå�áâëç�Ýò ðïõ äåí åìöáíßæïí�áé ó�ïí üñï T, �ü�å ç Prolog ìáòåðéó�ñÝöåé ìßá îå÷ùñéó�Þ ëßó�á ãéá êÜèå óõíäõáóìü �ùí ðñüóèå�ùí ìå�áâëç�þí ãéá �éòïðïßåò õðÜñ÷åé áðÜí�çóç ó�çí Q 111

?- bagof(X,parent(P,X),L).X = _0P = dioniL = [pelopas,niovi℄ ;X = _0P = pelopasL = [atreas℄ ;X = _0P = tantalosL = [pelopas,niovi℄ ;Ìðïñïýìå íá ðÜñïõìå ìßá óõíïëéêÞ ëßó�á ÷ñçóéìïðïéþí�áò �ïí �åëåó�Þ ^ ï ïðïßïò áðï-�ñÝðåé �ç äÝóìåõóç �çò ìå�áâëç�Þò ðïõ âñßóêå�áé áñéó�åñÜ �ïõ:?- bagof(X,P^parent(P,X),L).X = _0P = _1L = [pelopas,pelopas,niovi,niovi,atreas℄Ìðïñïýìå íá ÷ñçóéìïðïéÞóïõìå �ï bagof ãéá �ïí ïñéóìü Üëëùí êá�çãïñçìÜ�ùí:numOfChildren(X,N) :- bagof(Y,parent(X,Y),L),length(L,N).numOfChildren(X,0) :- male(X),not parent(X,_).numOfChildren(X,0) :- female(X),not parent(X,_).ÊÜíïõìå �éò ðáñáêÜ�ù åñù�Þóåéò:?- numOfChildren(dioni,N).N = 2?- numOfChildren(niovi,N).N = 0?- bagof(X-N,numOfChildren(X,N),L).X = _0N = _1L = [dioni-2,pelopas-1,tantalos-2,atreas-0,niovi-0℄Ôï setof(T,Q,L) ëåé�ïõñãåß ðáñüìïéá ìå �ï bagof ìå �ç äéáöïñÜ ü�é äéáãñÜöåé ðïëëá-ðëÝò åìöáíßóåéò �ïõ ßäéïõ ó�ïé÷åßïõ áðü �çí L êáé åìöáíßæåé �á ó�ïé÷åßá �çò �áîéíïìçìÝíá:?- bagof(S,sublist(S,[3,2,1℄),L).S = _0L = [[℄,[3℄,[3,2℄,[3,2,1℄,[℄,[2℄,[2,1℄,[℄,[1℄,[℄℄?- setof(S,sublist(S,[3,2,1℄),L).S = _0L = [[℄,[1℄,[2℄,[2,1℄,[3℄,[3,2℄,[3,2,1℄℄112

Ï �åëåó�Þò =..÷ñçóéìïðïéåß�áé ãéá íá óõíèÝóåé Ýíá üñï Þ áí�ßó�ñïöá íá áðïóõíèÝóåéÝíáí üñï. Ôï T =.. L áëçèåõåé áí T åßíáé óýíèå�ïò üñïò êáé L ç ëßó�á ìå êåöáëÞ �ïóõíáñ�çóéáêü óýìâïëï ðïõ ó÷çìá�ßæåé �ïí T êáé ïõñÜ �á ïñßóìá�á �ïõ T. Åðßóçò �ïT =.. L áëçèåõåé áí T åßíáé Ü�ïìï Þ áñéèìüò êáé L ç ëßó�á ìå ìïíáäéêü ó�ïé÷åßï �ïÜ�ïìï Þ �ïí áñéèìü áõ�ü.?- f(1,2,g(0)) =.. L.L = [f,1,2,g(0)℄?- T =.. [a,0,1℄.T = a(0,1)?- T =.. [f(0),1,1℄.no?- T =.. [0,a,b℄.no?- [1,2℄ =.. L.L = [.,1,[2℄℄Ôï êá�çãüñçìá all(G) ðñïêáëåß �çí åê�Ýëåóç �ïõ ó�ü÷ïõ G, ï ïðïßïò ìðïñåß íá Ý÷åéäçìéïõñãçèåß äõíáìéêÜ. Ìðïñïýìå íá ÷ñçóéìïðïéÞóïõìå �ïí �åëåó�Þ =.. óå óõíäõáóìüìå �ï G þó�å íá äçìéïõñãÞóïõìå êá�çãïñÞìá�á õøçëü�åñçò �Üîçò.�áñÜäåéãìá 48: õðïëïãéóìüò áèñïßóìá�ïò.Èá ïñßóïõìå Ýíá êá�çãüñçìá ìå �ï ïðïßï èá ìðïñïýìå íá õðïëïãßóïõìå Ýíá Üèñïéóìá�çò ìïñöÞò ∑ni=1

f(i). Ôï êá�çãüñçìá sumF(F,N,S) áëçèåýåé áí ç �éìÞ �çò S åßíáé �ïÜèñïéóìá ∑Ni=1

f(i), üðïõ f ç óõíÜñ�çóç ðïõ ïñßæå�áé áðü �ï êá�çãüñçìá F.sumF(F,0,0).sumF(F,N,S) :- K is N-1,G =.. [F,N,X℄, all(G),sumF(F,K,R),S is R+X.Ìðïñïýìå íá ÷ñçóéìïðïéÞóïõìå �ï sumF ìå ðñþ�ï üñéóìá �ï üíïìá êÜðïéïõ êá�çãïñÞ-ìá�ïò ðïõ õëïðïéåß ìßá áñéèìç�éêÞ óõíÜñ�çóç ìßáò ìå�áâëç�Þò:?- sumF(fa t,4,S).S = 33?- sumF(sqrtInt,10,S).S = 19.�áñÜäåéãìá 49: Áðåéêüíéóç ó�ïé÷åßùí ëßó�áò.113

Ôï ðáñáêÜ�ù êá�çãüñçìá map(P,L,S) áëçèåýåé áí ïé ëßó�åò L êáé S Ý÷ïõí �ï ßäéï ìÞêïòêáé �á ó�ïé÷åßá �ïõò ðïõ âñßóêïí�áé óå áí�ßó�ïé÷åò èÝóåéò óõíäÝïí�áé ìÝóù �ïõ P. Áí �ïP õëïðïéåß ìßá óõíÜñ�çóç f �ü�å �á ó�ïé÷åßá �çò S ðñïêýð�ïõí áðü �á ó�ïé÷åßá �çò L ìåáðåéêüíéóç ìÝóù �çò f .map(P,[℄,[℄).map(P,[H|T℄,[X|S℄) :- G =.. [P,H,X℄, all(G),map(P,T,S).Ìðïñïýìå íá ÷ñçóéìïðïéÞóïõìå �ï map ìå ðñþ�ï üñéóìá �ï üíïìá êÜðïéïõ êá�çãïñÞìá-�ïò (ìå äýï ïñßóìá�á) ðïõ Ý÷ïõìå Þäç ïñßóåé:?- map(fa t,[1,2,3,4,5℄,L).L = [1,2,6,24,120℄?- map(reverse,[[1,2,3℄,[a,b, ,d℄,[f(0),g(1)℄℄,L).L = [[3,2,1℄,[d, ,b,a℄,[g(1),f(0)℄℄?- map(perm1,[[1,2℄,[a,b℄℄,L).L = [[1,2℄,[a,b℄℄ ;L = [[1,2℄,[b,a℄℄ ;L = [[2,1℄,[a,b℄℄ ;L = [[2,1℄,[b,a℄℄ ;no.1.21 ×åéñéóìüò �çò âÜóçò äåäïìÝíùí¼ðùò Ý÷ïõìå Þäç áíáöÝñåé ç Prolog ãéá íá áðáí�Þóåé óå ìßá åñþ�çóç ÷ñçóéìïðïéåß �çâÜóç äåäïìÝíùí, ç ïðïßá ðåñéÝ÷åé Ýíá óýíïëï ðñï�Üóåùí. Ìðïñïýìå íá öïñ�þóïõìå Ýíááñ÷åßï ðñïãñÜììá�ïò ÷ñçóéìïðïéþí�áò �ï åíóùìá�ùìÝíï êá�çãüñçìá onsult. Ïé ðñï-�Üóåéò ðïõ ðåñéÝ÷ïí�áé ó�ï áñ÷åßï ðïõ äßíå�áé ùò üñéóìá ó�ï onsult ðñïóèÝ�ïí�áé ó�ï�Ýëïò �çò âÜóçò äåäïìÝíùí. Ïé ðñï�Üóåéò ðïõ Þ�áí �õ÷üí öïñ�ùìÝíåò ðñßí �ç åê�Ýëåóç�ïõ onsult åîáêïëïõèïýí íá ðáñáìÝíïõí ó�çí âÜóç äåäïìÝíùí.Åíáëëáê�éêÜ ìðïñïýìå íá öïñ�þóïõìå Ýíá áñ÷åßï ðñïãñÜììá�ïò ÷ñçóéìïðïéþí�áò �ïåíóùìá�ùìÝíï êá�çãüñçìá re onsult. Ôï re onsult öïñ�þíåé �éò ðñï�Üóåéò áðü �ïáñ÷åßï ðïõ äßíå�áé ùò üñéóìá ó�ç âÜóç äåäïìÝíùí, áöïý ðñþ�á äéáãñÜøåé ðñï�Üóåéò ðïõïñßæïõí êÜðïéá êá�çãïñÞìá�á �á ïðïßá ïñßæïí�áé êáé ó�ï õðü öüñ�ùóç áñ÷åßï. �ñï�Üóåéòðïõ Þ�áí öïñ�ùìÝíåò ðñßí �ç åê�Ýëåóç �ïõ re onsult êáé ïñßæïõí Üëëá êá�çãïñÞìá�áåîáêïëïõèïýí íá ðáñáìÝíïõí ó�çí âÜóç äåäïìÝíùí.Ôá onsult êáé re onsult åðé�ñÝðå�áé íá ðåñéÝ÷ïí�áé êáé óå ðñï�Üóåéò �ïõ ðñïãñÜì-ìá�ïò. Ìå áõ�üí �ïí �ñüðï ìðïñåß íá �ñïðïðïéåß�áé äõíáìéêÜ ç âÜóç äåäïìÝíùí êá�Ü�çí åê�Ýëåóç �ïõ ðñïãñÜììá�ïò (äçëáäÞ êá�Ü �çí åê�Ýëåóç �çò äéáäéêáóßáò áðÜí�çóçòóå ìßá åñþ�çóç). Ç Prolog ðáñÝ÷åé ïñéóìÝíá ðñüóèå�á êá�çãïñÞìá�á ìå �á ïðïßá ìðïñåß114

íá áëëÜæåé ç âÜóç äåäïìÝíùí äõíáìéêÜ. Ôï êá�çãüñçìá assert(C) åéóÜãåé �çí ðñü�áóçC ó�ç âÜóç äåäïìÝíùí (áí ç ðñü�áóç C åßíáé êáíüíáò èá ðñÝðåé íá äïèåß ìÝóá óå ðáñåí-èÝóåéò). Ôï êá�çãüñçìá retra t(C) äéáãñÜöåé �çí ðñü�áóç C áðü âÜóç äåäïìÝíùí. Áíç C ðåñéÝ÷åé ìå�áâëç�Ýò, �ü�å äéáãñÜöå�áé ç ðñþ�ç ðñü�áóç áðü �ç âÜóç äåäïìÝíùí ðïõ�áõ�ïðïéåß�áé ìå �ç C.Óå ïñéóìÝíåò ðåñéð�þóåéò ðáßæåé ñüëï ç èÝóç ìÝóá ó�ç âÜóç äåäïìÝíùí üðïõ èá åéóá-÷èåß ìßá ðñü�áóç. Ç Prolog äéáèÝ�åé �á êá�çãïñÞìá�á asserta(C) êáé assertz(C) ðïõåéóÜãïõí �çí ðñü�áóç C áí�ßó�ïé÷á ó�çí áñ÷Þ Þ ó�ï �Ýëïò �çò âÜóçò äåäïìÝíùí.�áñÜäåéãìá 50: Öù�åéíïß óçìá�ïäü�åò.Ôï êá�çãüñçìá lights ÷ñçóéìïðïéåß�áé ãéá íá äçëþóïõìå �çí �ñÝ÷ïõóá êá�Üó�áóç åíüòöù�åéíïý óçìá�ïäü�ç. Ç ðñï�Üóåéò lights(green) êáé lights(red) äçëþíïõí ü�é ïöù�åéíüò óçìá�ïäü�çò äåß÷íåé ðñÜóéíï Þ áí�ßó�ïé÷á êüêêéíï êáé èÝëïõìå êÜèå ÷ñïíéêÞó�éãìÞ ìßá ìüíï áðü �éò äýï íá áëçèåýåé. Ó�ï ðáñáêÜ�ù ðñüãñáììá ïñßæå�áé �ï êá�ç-ãüñçìá initLights, ìå �ï ïðïßï ãßíå�áé ç áñ÷éêïðïßçóç �ïõ óçìá�ïäï�ç ó�ï ðáñÜóéíï.Åðßóçò ïñßæå�áé �ï êá�çãüñçìá (÷ùñßò ïñßóìá�á) hangeLights, �ï ïðïßï äéáãñÜöåé áðü�ç âÜóç äåäïìÝíùí �çí ðñü�áóç ðïõ äçëþíåé �çí �ñÝ÷ïõóá êá�Üó�áóç �ïõ óçìá�ïäü�çêáé åéóÜãåé �çí ðñü�áóç ðïõ äçëþíåé �çí áí�ßèå�ç êá�Üó�áóç.initLights :- asserta(lights(green)). hangeLights :- lights(green),retra t(lights(green)),asserta(lights(red)). hangeLights :- lights(red),retra t(lights(red)),asserta(lights(green)).Ç ÷ñÞóç �ïõ hangeLights öáßíå�áé ó�ïí ðáñáêÜ�ù äéÜëïãï ìå �ï äéñìçíÝá �çò Prolog:?- initLights.yes?- lights(green).yes?- lights(red).no?- hangeLights.yes?- lights(green).no?- lights(red).yes 115

?- hangeLights.yes?- lights(X).X = green ;no.�áñÜäåéãìá 51: Ó�ïßâåò êáé ÏõñÝò.×ñçóéìïðïéïýìå �ï êá�çãüñçìá sta k(Sta k,Element) ãéá íá äçëþóïõìå ü�é �ï ó�ïé-÷åßï Element ðåñéÝ÷å�áé ó�ç ó�ïßâá Sta k. �éá íá åéóÜãïõìå Ýíá ó�ïé÷åßï ó�ç ó�ïßâá(êá�çãüñçìá push) ÷ñçóéìïðïéïýìå �ï asserta Ý�óé þó�å �ï ó�ïé÷åßï ðïõ åéóÜãå�áé �å-ëåõ�áßï óå êÜðïéá ó�ïßâá íá ðåñéÝ÷å�áé óå ìßá ðñü�áóç ðïõ âñßóêå�áé ðéï êïí�Ü ó�çí áñ÷Þ�çò âÜóçò äåäïìÝíùí óå óýãêñéóç ìå �á ó�ïé÷åßá �çò ßäéáò ó�ïßâáò ðïõ Ý÷ïõí åéóá÷èåßðéï ðñéí. Óõíåðþò ç åîáãùãÞ �ïõ ó�ïé÷åßïõ (êá�çãüñçìá pop) ìðïñåß íá ãßíåé ìå ÷ñÞóç�ïõ retra t.push(Sta k,Element) :-asserta(sta k(Sta k,Element)).pop(Sta k,Element) :-retra t(sta k(Sta k,Element)).�áñÜäåéãìá ÷ñÞóçò �ùí push êáé pop?- push(mysta k,a).yes?- push(mysta k,b).yes?- pop(mysta k,X).X = b?- push(mysta k, ).yes?- pop(mysta k,X).X = ?- pop(mysta k,X).X = a?- pop(mysta k,X).no?- push(sta k(1),a).yes 116

?- push(sta k(2),b).yes?- push(sta k(2), ).yes?- push(sta k(1),d).yes?- pop(sta k(2),X).X = Ôåëåßùò áíÜëïãá ìðïñåß íá ïñéó�ïýí ïé âáóéêÝò ëåé�ïõñãßåò óå ïõñÜ. Ç äéáöïñÜ óå ó÷Ýóçìå �ç ó�ïßâá åßíáé ü�é ç åéóáãùãÞ ãßíå�áé ìå ÷ñÞóç �ïõ assertz.enqueue(Queue,Element) :-assertz(queue(Queue,Element)).dequeue(Queue,Element) :-retra t(queue(Queue,Element)).�áñÜäåéãìá ÷ñÞóçò �ùí enqueue êáé dequeue:?- enqueue(myqueue,a).yes?- enqueue(myqueue,b).yes?- dequeue(myqueue,X).X = a?- dequeue(myqueue,X).X = b?- dequeue(myqueue,X).no.�áñÜäåéãìá 52: �ñïó�áê�éêüò ðñïãñáììá�éóìüò.Ó�çí Prolog ç Ýííïéá �çò ìå�áâëç�Þò åßíáé äéáöïñå�éêÞ áðü �çí áí�ßó�ïé÷ç Ýííïéá ó�éòðñïó�áê�éêÝò ãëþóóåò ðñïãñáììá�éóìïý. Ó�ï ðáñÜäåéãìá áõ�ü èá äïýìå ðùò ìðïñïýìåíá ìéìçèïýìå �ç ëåé�ïõñãßá �ùí ðñïó�áê�éêþí ðñïãñáììÜ�ùí, ÷ñçóéìïðïéþí�áò Ü�ïìáùò ìå�áâëç�Ýò. Èá ÷ñçóéìïðïéïýìå �ï êá�çãüñçìá value ãéá íá êáèïñßæïõìå �éò �ñÝ-÷ïõóåò áñéèìç�éêÝò �éìÝò ðïõ óõíäÝïí�áé ìå êÜèå Ü�ïìï-ìå�áâëç�Þ. �éá ðáñÜäåéãìá �ïvalue(x,0) èá äçëþíåé ü�é �ï Ü�ïìï-ìå�áâëç�Þ x Ý÷åé �çí �éìÞ 0. Èá öñïí�ßóïõìå þó�åóå êÜèå ÷ñïíéêÞ ó�éãìÞ, ãéá êÜèå Ü�ïìï-ìá�áâëç�Þ x íá õðÜñ÷åé ó�ç âÜóç äåäïìÝíùíìßá �ï ðïëý ðñü�áóç �çò ðáñáðÜíù ìïñöÞò ðïõ èá êáèïñßæåé �çí �éìÞ �ïõ x.117

Ôï êá�çãüñçìá run ìáò åðé�ñÝðåé íá åê�åëÝóïõìå ìßá óåéñÜ áðü åí�ïëÝò áíÜèåóçò, ïéïðïßåò áí�éêáèéó�ïýí �çí �éìÞ åíüò á�üìïõ-ìå�áâëç�Þò ìÝ �çí �éìÞ ðïõ ðñïêýð�åé áðü�çí áðï�ßìçóç ìßá áñéèìç�éêÞò ðáñÜó�áóçò. Ó�ïí ïñßóìü �ïõ âïçèç�éêïý êá�çãïñÞìá�ïòeval åêìå�áëëåõüìáó�å �çí åóù�åñéêÞ áíáðáñÜó�áóç �ùí ðáñáó�Üóåùí áðü üñïõò ðïõÝ÷ïõí �ç óõíÞèç óýí�áîç, Ý�óé þó�å íá ìç ÷ñåéÜæå�áé íá áó÷ïëçèïýìå ìå ðñï�åñáéü�ç-�åò �åëåó�þí. Ôï êá�çãüñçìá allValues ÷ñçóéìïðïéåß�áé ãéá íá äïýìå �éò �éìÝò üóùíá�üìùí-ìå�áâëç�þí Ý÷ïõí ðÜñåé �éìÞ ìÝ÷ñé �çí �ñÝ÷ïõóá ÷ñïíéêÞ ó�éãìÞ.run([℄).run([=(X,E)|T℄) :- atom(X),eval(E,V),update(X,V),run(T).update(X,V):- retra t(value(X,N)),!,asserta(value(X,V)).update(X,V):- asserta(value(X,V)).allValues(L) :- bagof(X = V,value(X,V),L).eval(N,N) :- number(N).eval(A,V) :- atom(A),value(A,V).eval(+(E1,E2),V) :- eval(E1,V1),eval(E2,V2),V is V1+V2.eval(-(E1,E2),V) :- eval(E1,V1),eval(E2,V2),V is V1-V2.eval(*(E1,E2),V) :- eval(E1,V1),eval(E2,V2),V is V1*V2.eval(/(E1,E2),V) :- eval(E1,V1),eval(E2,V2),V is V1/V2.eval(//(E1,E2),V) :- eval(E1,V1),eval(E2,V2),V is V1//V2.eval(mod(E1,E2),V) :- eval(E1,V1),eval(E2,V2),V is V1 mod V2.Ìðïñïýìå íá åê�åëÝóïõìå ðñïó�áê�éêÜ ðñïãñÜììá�á ðïõ áðï�åëïýí�áé ìüíï áðü åí�ïëÝòáíÜèåóçò ìå ÷ñÞóç �ïõ run. Ïé �éìÝò �ùí á�üìùí-ìå�áâëç�þí äéá�çñïýí�áé êáé áíÜìåóáóå äéáäï÷éêÝò åê�åëÝóåéò �ïõ run.?- run([x = 2, y = 3, z = 5℄).yes?- value(x,X).X = 2 118

?- value(y,Y).Y = 3?- value(z,Z).Z = 5?- value(w,W).no?- run([w = x*y*z - (x+y+z) mod 4 + 32 // z℄).yes?- value(w,W).W = 34?- run([x = x*2+4℄).yes?- value(x,X).X = 8?- allValues(L).L = [y=3,z=5,w=34,x=8℄.�áñÜäåéãìá 53: Ëáâýñéíèïò.Ó�ï ðáñÜäåéãìá áõ�ü èá ó÷åäéÜóïõìå Ýíá ðñüãñáììá �ï ïðïßï èá âñßóêåé �ç äéáäñïìÞãéá íá âãïýìå áðü Ýíáí ëáâýñéíèï. Ï ëáâýñéíèïò ðåñéãñÜöå�áé ùò ìßá ëßó�á áðü æåýãçáêåñáßùí, ðïõ ðåñéãñÜöïõí �éò åëåýèåñåò èÝóåéò ó�ï ëáâýñéíèï, äçëáäÞ �á óçìåßá áðü �áïðïßá ìðïñïýìå íá ðåñÜóïõìå. Ìßá Üëëç ëßó�á �çò ßäéáò ìïñöÞò ðåñéãñÜöåé �á óçìåßá�ïõ ëáâýñéíèïõ ó�á ïðïßá õðÜñ÷åé Ýîïäïò. Ç áñ÷éêÞ èÝóç ðåñéãñÜöå�áé áðü Ýíá æåýãïòáêåñáßùí. Åðé�ñÝðå�áé íá êéíïýìáó�å ìüíï ïñéæüí�éá Þ êá�áêüñõöá (ü÷é äéáãþíéá) êáéìüíï ðñïò åëåýèåñåò èÝóåéò.×ñçóéìïðïéïýìå �ï assert ãéá íá åéóÜãïõìå ó�ç âÜóç äåäïìÝíùí ðñï�Üóåéò ðïõ äç-ëþíïõí �éò åëåýèåñåò èåóåéò êáé �éò åîüäïõò . Áõ�ü ãßíå�áé ÷ñçóéìïðïéþí�áò �á êá�çãï-ñÞìá�á initFree êáé initExits, �á ïðïßá åéóÜãïõí ó�ç âÜóç äåäïìÝíùí ãåãïíü�á �çòìïñöÞò free(I,J) êáé exit(I,J). Åðßóçò ÷ñçóéìïðïéïýìå �ï retra t ãéá íá äéáãñÜ-öïõìå áðü �ç âÜóç äåäïìÝíùí �ï ãåãïíüò free(I,J) ü�áí åðéóêåö�üìáó�å �ï óçìåßï[I,J℄. Áõ�ü ãßíå�áé þó�å íá áðïöÝõãïí�áé êýêëïé ó�ï ëáâýñéíèï. Ôï lear ÷ñçóéìï-ðïéåß�áé ó�çí áñ÷Þ þó�å íá äéáãñÜøåé ðñïçãïýìåíïõò ïñéóìïýò �ùí free êáé exit.solvePuzzle(FreeBlo ks,Exits,Start,[start|Path℄):- lear,initFree(FreeBlo ks),initExits(Exits),findPath(Start,Path).119

initFree([℄).initFree([[I,J℄|T℄) :- integer(I),integer(J),assertz(free(I,J)),initFree(T).initExits([℄).initExits([[I,J℄|T℄) :- integer(I),integer(J),assertz(exit(I,J)),initExits(T).findPath([I,J℄,[[I,J℄,exit℄) :- exit(I,J).findPath(A,[A,D|P℄) :- anMove(A,B,D),B = [I,J℄,retra t(free(I,J)),findPath(B,P). anMove([I,J℄,[K,J℄,up) :- K is I-1. anMove([I,J℄,[K,J℄,down) :- K is I+1. anMove([I,J℄,[I,K℄,left) :- K is J-1. anMove([I,J℄,[I,K℄,right) :- K is J+1. lear :- retra t(free(I,J)), lear. lear :- lear2. lear2 :- retra t(exit(I,J)), lear2. lear2.�áñÜäåéãìá åîüäïõ áðü ëáâýñéíèï:?- solvePuzzle([ [1,1℄,[1,2℄,[1,3℄, [1,5℄,[1,6℄,[2,1℄, [2,5℄,[3,2℄,[3,3℄, [3,5℄,[4,3℄, [4,5℄,[5,1℄,[5,2℄,[5,3℄,[5,4℄,[5,5℄,[6,1℄, [6,5℄,[6,6℄℄,[[1,1℄,[1,6℄℄, [3,3℄, P).P = [start,[3,3℄,down,[4,3℄,down,[5,3℄,right,[5,4℄,right,[5,5℄,up,[4,5℄,up,[3,5℄,up,[2,5℄,up,[1,5℄,right,[1,6℄,exit℄.120