]> Repositorios git - scryer-prolog.git/commitdiff
fix min/1, max/1
authorMark Thom <[email protected]>
Mon, 13 May 2019 22:11:27 +0000 (18:11 -0400)
committerMark Thom <[email protected]>
Mon, 13 May 2019 22:11:27 +0000 (18:11 -0400)
Cargo.toml
README.md
src/prolog/machine/machine_state_impl.rs

index 4fe658dca7d7c2f8a558b4002e72c7a9f44cab62..72ea5275c2a2e43c6bafe951a9723fd2dbad1076 100644 (file)
@@ -1,6 +1,6 @@
 [package]
 name = "scryer-prolog"
-version = "0.8.82"
+version = "0.8.83"
 authors = ["Mark Thom <[email protected]>"]
 repository = "https://github.com/mthom/scryer-prolog"
 description = "A modern Prolog implementation written mostly in Rust."
index 721d2f345528d5460892dcb498f4464921bb34f1..4982068f01fd9d52c1587350202a6488eb6b759c 100644 (file)
--- a/README.md
+++ b/README.md
@@ -133,12 +133,13 @@ to my knowledge is not currently the case.
 The following predicates are built-in to Scryer.
 
 * Arithmetic support:
-    * `is/2` works for `(+)/2`, `(-)/{1,2}`, `(*)/2`, `(//)/2`,
-      `(**)/2`, `(^)/2`, `(div)/2`, `(/)/2`, `(rdiv)/2`, `(xor)/2`,
-      `(rem)/2`, `(mod)/2`, `(/\)/2`, `(\/)/2`, `(>>)/2`,`(<<)/2`,
-      `(\)/1`, `abs/1`, `sin/1`, `cos/1`, `tan/1`, `asin/1`, `acos/1`,
+    * `is/2` works for `(+)/{1,2}`, `(-)/{1,2}`, `(*)/2`, `(//)/2`, `(**)/2`,
+      `(^)/2`, `(div)/2`, `(/)/2`, `(rdiv)/2`, `(xor)/2`, `(rem)/2`,
+      `(mod)/2`, `(/\)/2`, `(\/)/2`, `(>>)/2`,`(<<)/2`, `(\)/1`,
+      `abs/1`, `sin/1`, `cos/1`, `tan/1`, `asin/1`, `acos/1`,
       `atan/1`, `atan2/2`, `log/1`, `exp/1`, `sqrt/1`, `float/1`,
-      `truncate/1`, `round/1`, `floor/1`, `ceiling/1`, `pi/0`
+      `truncate/1`, `round/1`, `floor/1`, `ceiling/1`, `pi/0`,
+      `min/1`, `max/1`      
     * Comparison operators: `>`, `<`, `=<`, `>=`, `=:=`, `=\=`.
 * `(:)/2`
 * `(@>)/2`
index c378a54f5bf7544d624571d1d1a897b01a033ebd..1cfbf9ade83408ce00fc121a3e92dece774d68c1 100644 (file)
@@ -1290,11 +1290,41 @@ impl MachineState {
     }
 
     fn max(&self, n1: Number, n2: Number) -> Result<Number, MachineStub> {
-        Ok(max(n1, n2))
+        match (n1, n2) {
+            (Number::Integer(n1), Number::Integer(n2)) =>
+                if n1 > n2 {
+                    Ok(Number::Integer(n1))
+                } else {
+                    Ok(Number::Integer(n2))
+                },
+            (n1, n2) => {
+                let stub = MachineError::functor_stub(clause_name!("max"), 2);
+
+                let f1 = try_numeric_result!(self, result_f(n1, rnd_f), stub.clone())?;
+                let f2 = try_numeric_result!(self, result_f(n2, rnd_f), stub)?;
+
+                Ok(Number::Float(max(OrderedFloat(f1), OrderedFloat(f2))))
+            }
+        }
     }
 
     fn min(&self, n1: Number, n2: Number) -> Result<Number, MachineStub> {
-        Ok(min(n1, n2))
+        match (n1, n2) {
+            (Number::Integer(n1), Number::Integer(n2)) =>
+                if n1 < n2 {
+                    Ok(Number::Integer(n1))
+                } else {
+                    Ok(Number::Integer(n2))
+                },
+            (n1, n2) => {
+                let stub = MachineError::functor_stub(clause_name!("max"), 2);
+                
+                let f1 = try_numeric_result!(self, result_f(n1, rnd_f), stub.clone())?;
+                let f2 = try_numeric_result!(self, result_f(n2, rnd_f), stub)?;
+
+                Ok(Number::Float(min(OrderedFloat(f1), OrderedFloat(f2))))
+            }
+        }
     }
 
     fn remainder(&self, n1: Number, n2: Number) -> Result<Integer, MachineStub>