предикатів користувача, які використовують стандартні
предикати. Нап о ви використовуєте предикат риклад, якщ
С = А+ В
де змінна А або В не зв'язана, тоді потоковий анализатор
видасть повідомлення про помилку: не існує потокового зразка
для цього предикату. Для керування такою ситуацією ми
можемо використовувати стандартні предикати free і
bound.
Припустимо, ми хочемо написати предикат plus для
реалізації дії додавання при любих можливих потокових зразках.
Програма зображена на малюнку 10.1 реалізує такий предикат.
predicates
plus(integer, integer, integer)
num(integer)
clauses
plus(R,T,K) :- bound(R), bound(T), K=R+T. /*
(j,j,o) */
plus(R,T,K) :- bound(T), bound(K), R=K-Z. /*
(o,j,j) */
plus(R,T,K) :- bound(R), bound(K), T=K-R. /*
(j,o,j) */
plus(R,T,K) :- free(R), free(T),
bound(K), num(R), T=K-R. /* (o,o,j) */
plus(R,T,K) :- free(R), free(K),
bound(T), num(R), K=R+T. /* (o,j,o) */
plus(R,T,K) :- free(T), free(K),
bound(R), num(T), K=R+T. /* (j,o,o) */
plus(R,T,K) :- free(R), free(T),free(K),
num(R), num(T),K=R+T. /* (o,o,o)
*/
/* Генератор чисел, які починаються з нуля */
num(0).
num(R) :- num(L), R = L+1.
.
135