Обработка программ Турбо Прологом

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

Целевое утверждение:

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).