Возврат и отсечение

ТП в случае, если есть больше одного дизъюнкта для одного предиката, отмечает этот дизъюнкт точкой решения, чтобы он мог вернутся в эту точку и продолжить работу со следующим дизъюнктом, даже есла позже выяснится что ложное это утверждение. При этом ТП вернется всегда в последнюю отмеченную точку и продолжит поиск других вариантов до тех пор, пока не будет выведена истинность всех целевых утверждений, или пока не будут перебраны все варианты.

Именно поэтому в примере указан предикат fail. Он провоцирует поиск других решений, после того как было найдено первое решение. Этот поиск осуществляется возвратом строго по уже пройденным утверждениям до ближайшего дизъюнкта, который отмечен точкой решения. Важным принципом функционирования возврата является то, что по обратному пути в утверждениях, где были конкретизированы переменные, отменяются эти конкретизации, так что переменные могут принимать новые значения.

Работу Турбо Пролога можно представить в виде упрощенной диаграммы обработки

 

 

goal

(1) makewindow(…)

ТР1
ТР1
(2) wopros

(3) wopros

(4) math(Math, Мария) Math

(5) math(Евдокия, Мария) Math=’Евдокия”

(6)swekrow(Swekrow,’Евдокия’) Swekrow

(7)Swekrow(“Юля”,’Евдокия’) Swekrow=”Юлия”

TP2
TP2
(8) math(“Юлия”,Gost) Gost

(9)math(“Юлия”,”Евгений)Gost=”Евгений”

(10)write( … ), nl

(11)fail

(12)math(“Юлия”,”Игнатий”) Gost=’Игнатий’

(13)write( … ), nl

(14)fail

(15)wopros

(16)write(“больше нет решений”)

 

Так как ТП работает по принципу поиска вглубь , то при при большом проблемном пространстве (до тысячи привил и фактов), при переборе всех вариантов может привести к комбинаторному взрыву. И часто оказывается, что перебор всех вариантов ненужен.

Средством прекращения поиска является отсечение –!.