]> Repositorios git - scryer-prolog.git/commitdiff
ADDED: library(time), providing time/1 for benchmarking
authorMarkus Triska <[email protected]>
Sun, 19 Apr 2020 17:13:27 +0000 (19:13 +0200)
committerMarkus Triska <[email protected]>
Sun, 19 Apr 2020 17:18:47 +0000 (19:18 +0200)
sleep/1 and predicates for reasoning about time stamps should also
be added to this library.

Cargo.lock
Cargo.toml
src/prolog/clause_types.rs
src/prolog/lib/time.pl [new file with mode: 0644]
src/prolog/machine/system_calls.rs

index 3fbc1d29751f36fd04f042ccb5d9e917d2b13c7a..67fa47a01b72158f65907ee237903c1260c30653 100644 (file)
@@ -94,6 +94,15 @@ name = "constant_time_eq"
 version = "0.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "cpu-time"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+dependencies = [
+ "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)",
+ "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
+]
+
 [[package]]
 name = "crossbeam-utils"
 version = "0.6.6"
@@ -617,6 +626,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 name = "scryer-prolog"
 version = "0.8.120"
 dependencies = [
+ "cpu-time 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "crossterm 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "dirs 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "divrem 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -815,6 +825,7 @@ dependencies = [
 "checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
 "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
 "checksum constant_time_eq 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "995a44c877f9212528ccc74b21a232f66ad69001e40ede5bcee2ac9ef2657120"
+"checksum cpu-time 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e9e393a7668fe1fad3075085b86c781883000b4ede868f43627b34a87c8b7ded"
 "checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6"
 "checksum crossterm 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8a3223215bc00c666d6be730e88aef245ad4a4f837e87a16c347e8acf701643"
 "checksum crossterm_winapi 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "057b7146d02fb50175fd7dbe5158f6097f33d02831f43b4ee8ae4ddf67b68f5c"
index 25cdf90858aecbbef1b56494a3e888c2a5042089..5ac133cf4a72f72b220b7e0d78db1667d12d110e 100644 (file)
@@ -30,4 +30,5 @@ ordered-float = "0.5.0"
 prolog_parser = { version = "0.8.52", default-features = false }
 ref_thread_local = "0.0.0"
 rug = { version = "1.4.0", optional = true }
-rustyline = "6.0.0"
\ No newline at end of file
+rustyline = "6.0.0"
+cpu-time = "1.0.0"
index 660de341c8d92179fa920460349321b01fb356eb..a31eba1aace364d5f111fd448ca272122ed423ee 100644 (file)
@@ -241,6 +241,7 @@ pub enum SystemClauseType {
     GetDoubleQuotes,
     InstallNewBlock,
     Maybe,
+    CPU_now,
     QuotedToken,
     ReadTermFromChars,
     ResetBlock,
@@ -347,6 +348,7 @@ impl SystemClauseType {
             &SystemClauseType::PartialStringTail => clause_name!("$partial_string_tail"),
             &SystemClauseType::LiftedHeapLength => clause_name!("$lh_length"),
             &SystemClauseType::Maybe => clause_name!("maybe"),
+            &SystemClauseType::CPU_now => clause_name!("$cpu_now"),
             &SystemClauseType::ModuleAssertDynamicPredicateToFront => {
                 clause_name!("$module_asserta")
             }
@@ -480,6 +482,7 @@ impl SystemClauseType {
             ("$install_inference_counter", 3) => Some(SystemClauseType::InstallInferenceCounter),
             ("$lh_length", 1) => Some(SystemClauseType::LiftedHeapLength),
             ("$maybe", 0) => Some(SystemClauseType::Maybe),
+            ("$cpu_now", 1) => Some(SystemClauseType::CPU_now),
             ("$module_exists", 1) => Some(SystemClauseType::ModuleExists),
             ("$module_of", 2) => Some(SystemClauseType::ModuleOf),
             ("$module_retract_clause", 5) => Some(SystemClauseType::ModuleRetractClause),
diff --git a/src/prolog/lib/time.pl b/src/prolog/lib/time.pl
new file mode 100644 (file)
index 0000000..2713ebf
--- /dev/null
@@ -0,0 +1,51 @@
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+   Written April 2020 by Markus Triska ([email protected])
+   Part of Scryer Prolog.
+
+   This library provides predicates for reasoning about time.
+   sleep/1 should be implemented here, sleeping for a number of seconds.
+   In addition, this library should provide reasoning about time stamps.
+
+   '$cpu_new' can be replaced by statistics/2 once that is implemented.
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+:- module(time, [time/1]).
+
+:- use_module(library(format)).
+:- use_module(library(iso_ext)).
+
+time(Goal) :-
+        '$cpu_now'(T0),
+        Goal,
+        '$cpu_now'(T),
+        Time is T - T0,
+        (   bb_get('$first_answer', true) ->
+            format("   % CPU time: ~3f seconds~n", [Time])
+        ;   format("% CPU time: ~3f seconds~n   ", [Time])
+        ).
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+?- time((true;false)).
+   % CPU time: 0.000 seconds
+   true
+;  false.
+
+:- time(use_module(library(clpz))).
+   % CPU time: 2.762 seconds
+   true
+;  false.
+
+:- time(use_module(library(lists))).
+   % CPU time: 0.000 seconds
+   true
+;  false.
+
+?- time(member(X, [a,b,c])).
+   % CPU time: 0.000 seconds
+   X = a
+;  % CPU time: 0.002 seconds
+   X = b
+;  % CPU time: 0.004 seconds
+   X = c
+;  false.
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
index ec1ef49a161654234dd267a00f68dc99dbe10fe4..d838aadf35f9d9e014b1a851ca17cdafe2d96a84 100644 (file)
@@ -28,6 +28,9 @@ use std::io::{stdout, Write};
 use std::iter::once;
 use std::rc::Rc;
 
+use std::time::Duration;
+use cpu_time::ProcessTime;
+
 use crate::crossterm::event::{read, Event, KeyCode, KeyEvent};
 use crate::crossterm::terminal::{enable_raw_mode, disable_raw_mode};
 
@@ -1952,6 +1955,13 @@ impl MachineState {
 
                 self.fail = result;
             }
+            &SystemClauseType::CPU_now => {
+                let a1 = self[temp_v!(1)];
+                let a2 = ProcessTime::now().as_duration().as_secs_f64();
+                let addr = self.heap.put_constant(Constant::Float(OrderedFloat(a2)));
+
+                self.unify(a1, addr);
+            }
             &SystemClauseType::OpDeclaration => {
                 let priority = self[temp_v!(1)];
                 let specifier = self[temp_v!(2)];