logo
TurboProlog / Документация / TOM_1

Контроль потока параметров

В том случае, когда стандартный предикат вызывается с несуществующим

потоком параметров, выдается сообщение об ошибке. Это может облегчить об-

наружение неправильных потоков параметров при создании собственных преди-

катов, которые обращаются к стандартным предикатам.

Так, например, если вы напишите

Z=X+Y

где переменные Х и Y не связаны, то при анализе потока параметров будет

выдано сообщение об ошибке, говорящее о том, что такой поток параметров

не существует для данного предиката. В этом случае для контроля применя-

ются стандартные предикаты free и bound.

Предположим вы хотите создать предикат для сложения, plus, к которо-

му можно было бы обращаться со всеми возможными потоками параметров. В

программе CH19EX03.PRO приведен пример такого предиката.

/* Program CH19EX03.PRO */

predicates

plus(integer, integer, integer)

num(integer)

clauses

plus(X,Y,Z):-bound(X),bound(Y),Z=X+Y. /* (i,i,o) */

plus(X,Y,Z):-bound(Y),bound(Z),X=Z-Y. /* (o,i,i) */

plus(X,Y,Z):-bound(X),bound(Z),Y=Z-X. /* (i,o,i) */

plus(X,Y,Z):-free(X),free(Y),bound(Z),num(X),Y=Z-X.

/* (o,o,i) */

plus(X,Y,Z):-free(X),free(Z),bound(Y),num(X),Z=X+Y.

/* (o,o,i) */

plus(X,Y,Z):-free(Y),free(Z),bound(X),num(Y),Z=X+Y.

/* (o,o,i) */

plus(X,Y,Z):-free(X),free(Y),free(Z),

num(X),num(Y),Z=X+Y. /* (o,o,o) */

/* Generator of numbers starting from 0 */

num(0).

num(X) :- num(A), X = A+1.