]> Repositorios git - scryer-prolog.git/commitdiff
be more efficient in (,)/3 clause, correct (;)/3
authorMark Thom <[email protected]>
Thu, 6 Sep 2018 12:32:22 +0000 (09:32 -0300)
committerMark Thom <[email protected]>
Thu, 6 Sep 2018 12:32:22 +0000 (09:32 -0300)
src/prolog/lib/builtins.pl

index feb04e4406beded7a93f96155abe53eb80c2b62b..5e82723a1631a8a2fcf784b656ba68555d9ca41e 100644 (file)
@@ -129,31 +129,33 @@ comma_errors(G1, G2, B) :- '$call_with_default_policy'(','(G1, G2, B)).
 
 :- non_counted_backtracking (,)/3.
 ','(!, CF, B) :- compound(CF),
-                '$call_with_default_policy'(CF =.. [',', G1, G2]),
+                '$call_with_default_policy'(CF = ','(G1, G2)),
                 '$set_cp'(B),
                 '$call_with_default_policy'(comma_errors(G1, G2, B)).
 ','(!, Atom, B) :- Atom == !, '$set_cp'(B).
 ','(!, G, B)  :- '$set_cp'(B), G.
 ','(G, CF, B) :- compound(CF),
-                '$call_with_default_policy'(CF =.. [',', G1, G2]), !, G,
-                 '$call_with_default_policy'(comma_errors(G1, G2, B)).
+                '$call_with_default_policy'(CF = ','(G1, G2)), !, G,
+                '$call_with_default_policy'(comma_errors(G1, G2, B)).
 ','(G, Atom, B) :- Atom == !, !, G, '$set_cp'(B).
 ','(G1, G2, _)  :- G1, G2.
 
 ;(G1, G2) :- '$get_b_value'(B), ;(G1, G2, B).
 
 :- non_counted_backtracking (;)/3.
-;(G1, G4, B) :- compound(G1), G1 = ->(G2, G3), (G2 -> G3 ; '$set_cp'(B), G4).
-;(G1, G2, B) :- G1 == !, '$set_cp'(B), call(G2).
-;(G1, G2, B) :- G2 == !, call(G2), '$set_cp'(B).
+;(G1, G4, B) :- compound(G1),
+               '$call_with_default_policy'(G1 = ->(G2, G3)),
+               (G2 -> G3 ; '$set_cp'(B), G4).
+;(G1, G2, B) :- G1 == !, '$set_cp'(B), G2.
+;(G1, G2, B) :- G2 == !, G1, '$set_cp'(B).
 ;(G, _, _) :- G.
 ;(_, G, _) :- G.
 
-G1 -> G2 :- '$get_b_value'(B), ->(G1, G2, B).
+G1 -> G2 :- '$get_b_value'(B), '$call_with_default_policy'(->(G1, G2, B)).
 
 :- non_counted_backtracking (->)/3.
-->(G1, G2, B) :- G2 == !, call(G1), !, '$set_cp'(B).
-->(G1, G2, B) :- call(G1), '$set_cp'(B), call(G2).
+->(G1, G2, B) :- G2 == !, G1, '$set_cp'(B).
+->(G1, G2, B) :- G1, '$set_cp'(B), G2.
 
 % univ.