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 также нельзя считать правильным с процедурной точки зрения.