2014-08-27 5 views
1

Я новичок, и я использую SWI Prolog написать правило для печати всех фактов о добавлении двух numbers.The Ниже приводится код:Как напечатать все факты в прологе

addition(X,Y,Z) :- Z is X+Y. 
add(X,Y):- 
    between(X,Y,A), 
    addition(X,A,Z), 
    writeln(addition(X,A,Z)), 
    X1 is X+1, 
    add(X1,Y). 

И Ниже приводится вывод:

1 ?- add(1,2). 
addition(1,1,2) 
addition(2,2,4) 
addition(1,2,3) 
addition(2,2,4) 
false. 

Как вы можете видеть на выходе сложение (2,2,4) повторяется и добавление (2,1,3) отсутствует. Что я здесь делаю неправильно?

+1

Избегайте использование побочных эффектов, такие как 'writeln' в начале. – false

+0

Что именно должно означать 'add/2'? Это не очень ясно из предиката, который вы написали, или вашего описания. – 2014-08-27 13:28:30

ответ

1

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])). 
Смежные вопросы