addition/3
является «правилом» или «предикатом», а не фактом. Во всяком случае, вы определили его как:
% addition(X, Y, Z)
% Z is the sum of the integers X and Y
Теперь вы хотите применить этот предикат к (и я предполагаю здесь) каждая пара X и Y такие, что X находится между A и B и Y между A и B :
% add(A, B, Addition)
% Add all numbers X and Y that are between A and B
add(A, B, addition(X, Y, Z)) :-
between(A, B, X),
between(A, B, Y),
addition(X, Y, Z).
вы заметите, что вам не нужна рекурсия (или итерация): вы можете использовать тот факт, что between/3
недетерминировано и создаст выбор точки, которые будут оцениваться по возвратам.
Теперь вы можете называть это так:
?- add(1, 2, A).
A = addition(1, 1, 2) ;
A = addition(1, 2, 3) ;
A = addition(2, 1, 3) ;
A = addition(2, 2, 4).
Вы можете нажать ;
или пространство для BackTrack и оценить следующее решение.
Третий аргумент add/3
объединяется с терминомaddition/3
в голове add/3
. Он имеет то же имя, что и предикат addition/3
, но его можно было назвать чем угодно.
Если вы настаиваете на его печать из одного вызова, вы можете использовать forall/2
:
?- forall(add(1, 2, A), format('~q', [A])).
Избегайте использование побочных эффектов, такие как 'writeln' в начале. – false
Что именно должно означать 'add/2'? Это не очень ясно из предиката, который вы написали, или вашего описания. – 2014-08-27 13:28:30