cut 在基本案例中的作用是什么?
What is the role of cut at the base case?
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 性质,但我不明白为什么程序只是在第一次切割时中止。
这只是意味着你已经达到了可以摆脱所有可能的其他解决方案的状态。否则,当要求更多解决方案时,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。但是没有删减的版本不需要规则的严格顺序。
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 性质,但我不明白为什么程序只是在第一次切割时中止。
这只是意味着你已经达到了可以摆脱所有可能的其他解决方案的状态。否则,当要求更多解决方案时,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。但是没有删减的版本不需要规则的严格顺序。