2012-04-08 5 views
0

Хорошо, я знаю, что это действительно глупый вопрос, но я не могу его получить. Есть задача, где я должен найти рекурсивный алгоритм Euclid (gcd). Я сделал это для одного случая, здесь:Эвклидово-рекурсивный алгоритм

nondeterm nod (integer,integer,integer) 
CLAUSES 
nod (X,0,X):- !. 
nod (0,X,X):- !. 
nod (X,0,X):-X>0. 
nod (X,Y,G):-Y>0, Z = X mod Y, nod (Y,Z,G). 

мне нужно сделать еще один случай, когда рекурсия НАЧАЛА от Х0, когда Xi то вызова для функции подсчет Xi + 1. Это должно быть вроде этого:

PREDICATES 
nondeterm nod (integer,integer,integer) 
nondeterm nod1 (integer,integer,integer,integer,integer)  
CLAUSES 
nod(X,Y,Z):- nod1(X,Y,Z,0,0). 
nod1 (X,Y,Z,X,Y):- Otvet = Z, write("Otvet=", Otvet, "\n"), !. 
nod1 (X,Y,X,Y):- nod1 (X,Y,X,Y). 
nod1 (X,Y,Z,X1,Y1):- 
       X1>Y1, X>0, Y>0, 
       Y2 = X1 mod Y1, 
       X2 = Y1, 
       nod1(X,Y,Z,X2,Y2). 

Но это не работает. Пожалуйста, помогите мне с этим.

+0

Почему нет? кажется детерминированным для меня – CapelliC

+0

Извините, я не понимаю ваш вопрос. Где «Xi + 1»? В первом поле кода 'nod (X, 0, X): -! .' конфликтует с' nod (X, 0, X): - X> 0.'. Второе никогда не будет называться. Это правило бесполезно «nod1 (X, Y, X, Y): - nod1 (X, Y, X, Y).» И будет циклическим, если вызвано. – CapelliC

+0

ну ... я думал, потому что мне нужно найти результат кивок. Я ошибаюсь? – eeeee

ответ

0

Следующий код работает для меня. Пожалуйста, обратите внимание на использование бэр, но я думаю, вы могли бы также использовать мод:

% sys_gcd(+Integer, +Integer, -Integer) 
sys_gcd(X, 0, X) :- !. 
sys_gcd(X, Y, Z) :- 
    H is X rem Y, 
    sys_gcd(Y, H, Z). 

Вот несколько примеров работает с SWI-Пролог:

?- sys_gcd(20,30,X). 
X = 10. 
?- sys_gcd(-20,30,X). 
X = 10. 
?- sys_gcd(20,-30,X). 
X = -10. 
?- sys_gcd(-20,-30,X). 
X = -10. 

Если вы хотите определенный знак результата , вам нужен .

До сих пор

 Смежные вопросы

  • Нет связанных вопросов^_^