1
gcd(X,X,X):-
    !.
gcd(X,Y,Z):-
    X>Y,
    !,
    Inter is X - Y,
    gcd(Inter, Y, Z).
gcd(X,Y,Z):-
    Inter is Y - X,
    gcd(X,Inter,Z).

我得到了第二次切割的 if else 性质,但我不明白为什么程序会在第一次切割时中止。

4

1 回答 1

1

这只是意味着您已经达到了可以摆脱所有可能的其他解决方案的状态。否则,当要求更多解决方案时,Prolog 将运行第三条规则,从而导致不需要的答案。您也可以像这样重写它(假设X并且Y是统一的):

gcd(X,X,X).
gcd(X,Y,Z):-
    X>Y,
    Inter is X - Y,
    gcd(Inter, Y, Z).
gcd(X,Y,Z):-
    X<Y,
    Inter is Y - X,
    gcd(X,Inter,Z).

有剪辑的版本可能运行得更快,因为它不需要与没有剪辑的版本一样多的 RAM。但是没有删减的版本不需要严格的规则顺序。

于 2021-11-30T14:10:27.663 回答