Обработка программ ведется по принципу “поиска вглубь”.Это означает, что ТП всегда пытается доказать утверждение в дизъюнктах слева направо с помощью фактов и правил из базы данных.
Целевое утверждение:
wopros:-math(Math,"Мария"),
сопоставляется с фактом из базы:
math ("Евдокия","Мария").
Такое сопоставление называется унификациейи предполагает, чтобы были одинаковы функторы, очередность и количество аргументов и соответственно типы.
Переменная Math конкретизуется константой "Евдокия". Такая конкретизация распространяется на весь дизъюнкт и только на него. Передача значений изнутри дизъюнкта другим утверждениям возможна только через голову дизъюнкта. Например, определим кто является ребенком:
.predicates rebjonok(string)
.math(string,string)
.clauses .math(“Евдокия”,”Мария”).
rebjonok(X):-math(Math,X).
goal rebjonok(A), write(A), write(Math).
При выполнении переменная А сцепляется с переменной Х дизъюнкта rebjonok(X), который определяет, что кто-то является ребенком если у него есть мать. А утверждение math(Math,X) сопостовляется с фактом math(“Евдокия”,”Мария”), вследствии чего переменная Math конкретизируется значением Евдокия, а Х – Мария.
Переменная Х сцеплена с переменной А целевого утверждения, и соответственно А тоже конкретизируется Мария. Предикат write(А) выводит это на экран. Второй предикат write пытается вывести неконкретизированную переменную Math , т.к. ее значение не передовалось через голову rebjonok ‘вверх’ к целевому утверждению, т.е. переменная конкретизирована и больше не используется. В таких случаях вместо переменной ставится анонимная переменная _(подчерк): аргумент должен быть, но не важно какой:
rebjonok(X):-math( _ , X).