Предикат fail вызывает неудачное завершение правила, в результате чего внутренние унификационные процедуры выполняют возврат в предыдущую подцель и пытаются найти для нее другое решение.
С помощью этого предиката можно заставить систему находить все решения и для внутренней цели.
Goal
sister(ann,X),write(“Ann — сестра “,X),
nl, fail
Дойдя до предиката fail, система будет осуществлять возврат к предикату sister и будет находить для Х новое значение. В конечном итоге цель так и не будет согласована, но при попытках ее доказать будут напечатаны все, для кого ann — сестра.
Для того, чтобы заставить систему выдавать еще и обоих родителей ann, запрос нужно составить так:
Goal
(sister(ann,X), write(”Ann- сестра ”,X), nl;
pearent(X,ann), write(X,” — родитель Ann”)),
fail
Или так:
Goal
sister(ann,X), write(”Ann-сестра ”,X),nl,fail;
pearent(X,ann), fail
СОКРАЩЕННЫЕ ВАРИАНТЫ ВНУТРЕННИХ ЗАПРОСОВ
В предыдущих примерах запросы строились из цепочек взимосвязанных предикатов. В случае, когда какой-либо запрос нужно повторить несколько раз, разумно предусмотреть возможность не задавать всякий раз одни и те же условия. В Турбо-Прологе эта задача решается конструированием правил, не содержащих в себе данных, т.е. правил нулевой арности. Задача, таким образом, сводится к написанию сокращенного варианта запроса. Пояснить только что сказанное можно на следующем примере:
Goal
who_is_the_sister ,fail
who_is_the_sister:-
sister(X,Y),
write(X,”- сестра ”,Y),nl.
Для определения всех родственников девушки составим запрос:
Goal
family,fail
И следующие правила:
family:-
write(” Tell me girl, please ”),nl,
readln(X),
family_of_girl(X).
family_of_girl(Girl):- % сестры Girl
sister(X, Girl),
write(X,”- сестра”), nl.
family_of_girl(Girl):- % мать Girl
mother(X,Girl),
write(X,”- мать”),nl.
Аналогично составляются правила для определения братьев и отца.
При разработке программы такой способ записи цели более предпочтителен, так как он упрощает процедуру запросов.
Упражнение 2.1.
Модифицируйте программу «Родственники» из примера 1.2 главы 1 так, чтобы печатались все родственники девушки по имени Бэт.