a-conjecture-of-mine

An exercise on polyglossy: the same problem solved on multiple languages

commit 04c9f23dbc51a6e4850c4928c0c055dc05b7b4a0
parent 7748222fd469bae042da905a01382047dee99923
Author: Gark Garcia <37553739+GarkGarcia@users.noreply.github.com>
Date:   Wed, 21 Aug 2019 18:55:39 -0300

Further optimized the Prolog implementation.

Thanks to the awesome help of @flunschlik @wellmeaningtroll on redit the Prolog implementation is now much cleaner, more optimized and ideomatic. Check out the discussion in https://www.reddit.com/r/prolog/comments/ct266d/error_stack_limit_10gb_exceeded_help/.

Diffstat:
Mscript.pl | 37+++++++++++++++----------------------
1 file changed, 15 insertions(+), 22 deletions(-)
diff --git a/script.pl b/script.pl
@@ -3,34 +3,27 @@
 % Let S: N -> N be the sum of the digits of a positive integer.
 % For all A and B in N, S(A + B) = S(A) + S(B) - 9k, where k is an integer.
 
-sum_digits_acc(X, X, A) :- X < 10, A is 0, !.
-sum_digits_acc(X, Y, A) :-
-    X >= 10,
-    X1 is div(X, 10),
-    X2 is mod(X, 10),
-    sum_digits_acc(X1, A, _),
-    Y is A + X2.
+sum_digits(X, Y) :- sum_digits_acc(X, 0, Y).
 
-sum_digits(X, Y) :- sum_digits_acc(X, Y, _).
+sum_digits_acc(X, A, Y) :- X < 10, !, Y is A + X.
+sum_digits_acc(X, A, Y) :-
+    Q  = X div 10,
+    R  = X mod 10,
+    A2 = A + R,
+    sum_digits_acc(Q, A2, Y).
 
 test_pair(A, B) :-
-    R is 0,
-    AB is A + B,
+    R  = 0,
+    AB = A + B,
     sum_digits(A, SA),
     sum_digits(B, SB),
     sum_digits(AB, SC),
-    SAB is SA + SB,
-    D is SC - SAB,
-    R is mod(D, 9).
+    SAB = SA + SB,
+    D   = SC - SAB,
+    R =:= D mod 9.
 
-iter(A, 0) :- test_pair(A, 0), !.
 iter(A, B) :-
-    test_pair(A, B),
-    C is B - 1,
-    iter(A, C).
+    forall(between(0, B, X), test_pair(A, X)).
 
-conjecture(0) :- test_pair(0, 0), !.
 conjecture(M) :-
-    iter(M, M),
-    N is M - 1,
-    conjecture(N).-
\ No newline at end of file
+    forall(between(0, M, X), iter(X, X)).+
\ No newline at end of file