Pred3( torn, pat)

V--------------


 


paren1( torn, pat)


pred3( torn, Y'J parent) Y , pat)


I

parent! torn, Y~) parent! V, pat)

Г = bob

parent! bob, pat)



Yes


 


pred4{X,Z):-

pred4(X, Y). parent! V, Z). prod4( X, Z) :■ parent! X, Z).


Pred4( torn, pat)

Gt;


prad4(tom, Y') parent! Y', pat)

pred4( torn, Y') parent! Y", Y") parent! Y', pat)

pred4(torci, Y""J parent! V™, Y ) parent! Y". Г) parent(Y\ pat)

Рис. 2.13, Поведение трех вариантов отношения predecessor при поиске ответа на вопрос о том, является ли Том предком Пэт

Это сравнение должно напоминать нам об общем проверенном на практике эври­стическом правиле в области решения задач: обычно лучше всего вначале пытаться проверить простейшую идею. Б данном случае все версии отношения predecessor основаны на следующих идеях.


Глава 2. Синтаксис изначение программ Prolog



1. Наиболее простая идея состоит в том, что нужно проверить, соответствуют ли отношению parent: два параметра отношения predecessor.

2. Более сложная идея состоит и том, чтобы найти кого-то, кто связывает друг с другом обоих людей (того, кто связан с ними отношениями, с одной стороны, parent, а с другой стороны, predecessor).

Из всех этих четырех вариантов отношения predecessor только в варианте predl в первую очередь осуществляются простейшие действия. В отличие от этого, в варианте pred<3 в первую очередь всегда предпринимается попытка выполнить сложные действия, а варианты pred2 и ргеаЗ лежат между этими двумя крайно­стями. Поэтому даже без подробного изучения трассировок выполнения следует предпочесть вариант predl просто на основании правила, согласно которому вначале следует пытаться выполнить простейшие действия. Это правило и в целом может служить полезным руководящим указанием в программировании.

Рассматриваемые четыре варианта процедуры predecessor можно также срав­нить на основании изучения того, на какие типы вопросов позволяют находить отве­ты конкретные варианты программы и на какие типы вопросов они не дают ответов. Как оказалось, и вариант predl, и вариант prcd2 позволяют достичь ответа на во­просы любого типа о предках; вариант pred4 ни при каких условиях не позволяет достичь ответа, а вариант pced3 иногда позволяет найти ответ, а иногда нет. Ниже приведен один пример вопроса, на который вариант pred3 не позволяет найти ответ. ?- Pred3( lie, jim) ,

Этот вопрос снова вводит систему в бесконечную последовательность рекурсивных вызовов. Поэтому вариант pred3 также нельзя считать правильным с процедурной точки зрения.