Благодаря Lurker! Я не использовал правильный алгоритм. Я думал о том, чтобы найти GCD двух чисел, а затем GCD результата и следующего, но я не уверен, почему я запутался, что это не сработает.
Во всяком случае, вот код:
gcd(0,X,X):- X > 0, !.
gcd(X,Y,Z):- X>=Y, X1 is X -Y, gcd(X1,Y,Z).
gcd(X,Y,Z):- X<Y, X1 is Y-X, gcd(X1,X,Z).
gcdL([H,H1|T],Z):-gcd(H,H1,X),gcdL([X|T],Z).
gcdL([H1,H2],Z):-gcd(H1,H2,Z).
А для любознательных здесь запаздывающий подход, который я пытался достичь. И я был почти там, так как первый ответ, который дает сценарий, правильный, но он продолжает отступать. Во всяком случае, это некрасиво, долго, трудно и неэффективно:
minel([X],X).
minel([H,H1|T],X):-H>H1,minel([H1|T],X).
minel([H,H1|T],X):-H=<H1,minel([H|T],X).
gcdL(L,X):-gcdL(L,X,1).
gcdL(L,X,C):-minel(L,M),C<M,delAll(L,C),Temp is C,C1 is C + 1,gcdL(L,R,C1),X is max(Temp,R).
gcdL(L,X,C):-minel(L,M),C1 is C + 1,C1=<M,gcdL(L,X,C1).
gcdL(L,X,C):-minel(L,M),C=:=M,X is 1.
delAll([T],X):- 0 is mod(T,X).
delAll([H|T],X):- 0 is mod(H,X),delAll(T,X)
Примечание съемки: Сначала найдите самый правильный алгоритм, а затем попытаться сценарий проблема.
Интересует: [RosettaCode - GCD - Prolog] (http://rosettacode.org/wiki/Greatest_common_divisor#Prolog) –
Вы можете выполнить поиск этого сайта для Prolog GCD. Я уверен, что вы что-то найдете. – lurker
Вы решили использовать общую арифметическую стратегию для того, как вы хотите вычислить свой GCD? Существует несколько способов сделать это независимо от Пролога. – lurker