eyeprolog 1.3.78 → 1.3.80

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/lib/random.pl CHANGED
@@ -1,6 +1,48 @@
1
- /** Reproducible pseudo-random values with explicit state. */
1
+ /** Reproducible pseudo-random values.
2
2
 
3
- :- module(random, [random/3]).
3
+ random/3 is EyeProlog's explicit-state interface. maybe/0,
4
+ random_integer/3, and set_random/1 are the common Scryer/Trealla library
5
+ interface; they use a non-backtrackable seed while retaining the same
6
+ Park-Miller generator.
7
+ */
8
+
9
+ :- module(random, [maybe/0, random/3, random_integer/3, set_random/1]).
10
+
11
+ :- use_module(library(debug), [bb_global_get/2, bb_put/2]).
12
+ :- use_module(library(error), [instantiation_error/1, type_error/3]).
13
+
14
+ maybe :-
15
+ random_integer(0, 2, 0).
16
+
17
+ random_integer(Lower, Upper, R) :-
18
+ ( var(Lower) -> instantiation_error(random_integer/3)
19
+ ; var(Upper) -> instantiation_error(random_integer/3)
20
+ ; integer(Lower) -> true
21
+ ; type_error(integer, Lower, random_integer/3)
22
+ ),
23
+ ( integer(Upper) -> true
24
+ ; type_error(integer, Upper, random_integer/3)
25
+ ),
26
+ Lower < Upper,
27
+ random__current_seed(Seed0),
28
+ random(Seed0, _, Seed),
29
+ bb_put('$random_seed', Seed),
30
+ R is Lower + Seed mod (Upper - Lower).
31
+
32
+ set_random(Seed) :-
33
+ ( var(Seed) -> instantiation_error(set_random/1)
34
+ ; Seed = seed(S) ->
35
+ ( var(S) -> instantiation_error(set_random/1)
36
+ ; integer(S) ->
37
+ random__random_normalize_seed(S, Normalized),
38
+ bb_put('$random_seed', Normalized)
39
+ ; type_error(integer, S, set_random/1)
40
+ )
41
+ ; type_error(random_state, Seed, set_random/1)
42
+ ).
43
+
44
+ random__current_seed(Seed) :- bb_global_get('$random_seed', Seed), !.
45
+ random__current_seed(1).
4
46
 
5
47
  % A Park-Miller generator with explicit state. Threading Seed into the next
6
48
  % call makes a sequence reproducible without mutable runtime state. Schrage's
@@ -0,0 +1,94 @@
1
+ /** Predicates from [*Indexing dif/2*](https://arxiv.org/abs/1607.01590).
2
+
3
+ Example:
4
+
5
+ ```
6
+ ?- tfilter(=(a), [X,Y], Es).
7
+ X = a, Y = a, Es = "aa"
8
+ ; X = a, Es = "a", dif:dif(a,Y)
9
+ ; Y = a, Es = "a", dif:dif(a,X)
10
+ ; Es = [], dif:dif(a,X), dif:dif(a,Y).
11
+ ```
12
+ */
13
+
14
+ :- module(reif, [if_/3, (=)/3, (',')/3, (;)/3, cond_t/3, dif/3,
15
+ memberd_t/3, tfilter/3, tmember/2, tmember_t/3,
16
+ tpartition/4]).
17
+
18
+ :- use_module(library(dif)).
19
+
20
+ :- meta_predicate(if_(1, 0, 0)).
21
+
22
+ if_(If_1, Then_0, Else_0) :-
23
+ call(If_1, T),
24
+ ( T == true -> call(Then_0)
25
+ ; T == false -> call(Else_0)
26
+ ; nonvar(T) -> throw(error(type_error(boolean, T), _))
27
+ ; throw(error(instantiation_error, _))
28
+ ).
29
+
30
+ =(X, Y, T) :-
31
+ ( X == Y -> T = true
32
+ ; X \= Y -> T = false
33
+ ; T = true, X = Y
34
+ ; T = false, dif(X, Y)
35
+ ).
36
+
37
+ dif(X, Y, T) :-
38
+ =(X, Y, NT),
39
+ non(NT, T).
40
+
41
+ non(true, false).
42
+ non(false, true).
43
+
44
+ :- meta_predicate(tfilter(2, ?, ?)).
45
+
46
+ tfilter(_, [], []).
47
+ tfilter(C_2, [E|Es], Fs0) :-
48
+ if_(call(C_2, E), Fs0 = [E|Fs], Fs0 = Fs),
49
+ tfilter(C_2, Es, Fs).
50
+
51
+ :- meta_predicate(tpartition(2, ?, ?, ?)).
52
+
53
+ tpartition(P_2, Xs, Ts, Fs) :-
54
+ i_tpartition(Xs, P_2, Ts, Fs).
55
+
56
+ i_tpartition([], _P_2, [], []).
57
+ i_tpartition([X|Xs], P_2, Ts0, Fs0) :-
58
+ if_( call(P_2, X)
59
+ , ( Ts0 = [X|Ts], Fs0 = Fs )
60
+ , ( Fs0 = [X|Fs], Ts0 = Ts ) ),
61
+ i_tpartition(Xs, P_2, Ts, Fs).
62
+
63
+ :- meta_predicate(','(1, 1, ?)).
64
+
65
+ ','(A_1, B_1, T) :-
66
+ if_(A_1, call(B_1, T), T = false).
67
+
68
+ :- meta_predicate(';'(1, 1, ?)).
69
+
70
+ ';'(A_1, B_1, T) :-
71
+ if_(A_1, T = true, call(B_1, T)).
72
+
73
+ :- meta_predicate(cond_t(1, 0, ?)).
74
+
75
+ cond_t(If_1, Then_0, T) :-
76
+ if_(If_1, ( Then_0, T = true ), T = false ).
77
+
78
+ memberd_t(E, Xs, T) :-
79
+ i_memberd_t(Xs, E, T).
80
+
81
+ i_memberd_t([], _, false).
82
+ i_memberd_t([X|Xs], E, T) :-
83
+ if_( X = E, T = true, i_memberd_t(Xs, E, T) ).
84
+
85
+ :- meta_predicate(tmember(2, ?)).
86
+
87
+ tmember(P_2, [X|Xs]) :-
88
+ if_( call(P_2, X), true, tmember(P_2, Xs) ).
89
+
90
+ :- meta_predicate(tmember_t(2, ?, ?)).
91
+
92
+ tmember_t(_P_2, [], false).
93
+ tmember_t(P_2, [X|Xs], T) :-
94
+ if_( call(P_2, X), T = true, tmember_t(P_2, Xs, T) ).
@@ -0,0 +1,16 @@
1
+ /** Common Scryer/Trealla tabling interface.
2
+
3
+ EyeProlog detects and tables recursive user predicates automatically. The
4
+ explicit directive is therefore a source-compatible declaration, while
5
+ start_tabling/2 delegates to the already selected execution strategy.
6
+ */
7
+
8
+ :- module(tabling, [start_tabling/2, abolish_all_tables/0, op(1150, fx, table)]).
9
+
10
+ :- meta_predicate(start_tabling(?, 0)).
11
+
12
+ start_tabling(_, Worker) :-
13
+ call(Worker).
14
+
15
+ abolish_all_tables :-
16
+ eyeprolog__abolish_all_tables.
@@ -0,0 +1,26 @@
1
+ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2
+ format_time//2 is reused from the common Scryer/Trealla library(time),
3
+ written by Markus Triska. Only current_time/1's platform adapter is
4
+ EyeProlog-specific.
5
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
6
+
7
+ /** Predicates for reasoning about time. */
8
+
9
+ :- module(time, [current_time/1, format_time//2]).
10
+
11
+ :- use_module(library(dcgs), [seq//1]).
12
+ :- use_module(library(error), [domain_error/3]).
13
+ :- use_module(library(lists), [member/2]).
14
+
15
+ current_time(T) :-
16
+ eyeprolog__current_time(T).
17
+
18
+ format_time([], _) --> [].
19
+ format_time(['%','%'|Fs], T) --> !, ['%'], format_time(Fs, T).
20
+ format_time(['%',Spec|Fs], T) --> !,
21
+ ( { member(Spec=Value, T) } ->
22
+ seq(Value)
23
+ ; { domain_error(time_specifier, Spec, format_time//2) }
24
+ ),
25
+ format_time(Fs, T).
26
+ format_time([F|Fs], T) --> [F], format_time(Fs, T).