Merge pull request #414 from triska/master

Small corrections, additions and improvements
This commit is contained in:
Mark Thom
2020-04-28 16:54:39 -03:00
committed by GitHub
6 changed files with 48 additions and 27 deletions

View File

@@ -281,12 +281,15 @@ Logic Programming (LP) and Constraints.
In addition to built-in support for [`dif/2`](src/prolog/lib/dif.pl), In addition to built-in support for [`dif/2`](src/prolog/lib/dif.pl),
[`freeze/2`](src/prolog/lib/freeze.pl), [`freeze/2`](src/prolog/lib/freeze.pl),
[CLP()](src/prolog/lib/clpz.pl) and [CLP(B)](src/prolog/lib/clpb.pl), [CLP(B)](src/prolog/lib/clpb.pl) and [CLP()](src/prolog/lib/clpz.pl),
Scryer provides a convenient way to implement new user-defined Scryer provides a convenient way to implement new user-defined
constraints: *Attributed variables* are available via constraints: *Attributed variables* are available via
[`library(atts)`](src/prolog/lib/atts.pl) as in SICStus Prolog, [`library(atts)`](src/prolog/lib/atts.pl) as in SICStus Prolog,
which is one of the most sophisticated and fastest constraint systems which is one of the most sophisticated and fastest constraint systems
in existence. in existence. In [`library(iso_ext)`](src/prolog/lib/iso_ext.pl),
Scryer provides predicates for backtrackable (`bb_b_put/2`) and
non-backtrackable (`bb_put/2`) global variables, which are needed to
implement certain types of constraint solvers.
These features make Scryer Prolog an ideal platform for teaching, These features make Scryer Prolog an ideal platform for teaching,
learning and developing portable CLP applications. learning and developing portable CLP applications.
@@ -347,7 +350,8 @@ The modules that ship with Scryer Prolog are also called
* [`format`](src/prolog/lib/format.pl) * [`format`](src/prolog/lib/format.pl)
The nonterminal `format_//2` is used to describe formatted output, The nonterminal `format_//2` is used to describe formatted output,
arranging arguments according to a given format string. arranging arguments according to a given format string.
The predicate `format/2` is provided for impure output. The predicates `format/2`, `portray_clause/1` and `listing/1`
provide formatted *impure* output.
* [`assoc`](src/prolog/lib/assoc.pl) * [`assoc`](src/prolog/lib/assoc.pl)
providing `empty_assoc/1`, `get_assoc/3`, `put_assoc/4` etc. providing `empty_assoc/1`, `get_assoc/3`, `put_assoc/4` etc.
to manage elements in AVL trees which ensure to manage elements in AVL trees which ensure

View File

@@ -3,7 +3,7 @@
write_term_to_chars/3]). write_term_to_chars/3]).
:- use_module(library(iso_ext)). :- use_module(library(iso_ext)).
:- use_module(library(error)).
fabricate_var_name(VarType, VarName, N) :- fabricate_var_name(VarType, VarName, N) :-
char_code('A', AC), char_code('A', AC),
@@ -58,17 +58,17 @@ extend_var_list_([V|Vs], N, VarList, NewVarList, VarType) :-
char_type(Char, Type) :- char_type(Char, Type) :-
( var(Char) -> throw(error(instantiation_error, char_type/2)) ( var(Char) -> instantiation_error(char_type/2)
; atom_length(Char, 1) -> ; atom_length(Char, 1) ->
( ground(Type) -> ( ground(Type) ->
( ctype(Type) -> ( ctype(Type) ->
'$char_type'(Char, Type) '$char_type'(Char, Type)
; throw(error(domain_error(char_type, Type), char_type/2)) ; domain_error(char_type, Type, char_type/2)
) )
; ctype(Type), ; ctype(Type),
'$char_type'(Char, Type) '$char_type'(Char, Type)
) )
; throw(error(type_error(in_character, Char), char_type/2)) ; type_error(in_character, Char, char_type/2)
). ).
@@ -101,13 +101,13 @@ ctype(whitespace).
get_single_char(C) :- get_single_char(C) :-
( var(C) -> '$get_single_char'(C) ( var(C) -> '$get_single_char'(C)
; atom_length(C, 1) -> '$get_single_char'(C) ; atom_length(C, 1) -> '$get_single_char'(C)
; throw(error(type_error(in_character, C), get_single_char/1)) ; type_error(in_character, C, get_single_char/1)
). ).
read_term_from_chars(Chars, Term) :- read_term_from_chars(Chars, Term) :-
( var(Chars) -> ( var(Chars) ->
throw(error(instantiation_error, read_term_from_chars/2)) instantiation_error(read_term_from_chars/2)
; nonvar(Term) -> ; nonvar(Term) ->
throw(error(uninstantiation_error(Term), read_term_from_chars/2)) throw(error(uninstantiation_error(Term), read_term_from_chars/2))
; '$skip_max_list'(_, -1, Chars, Chars0), ; '$skip_max_list'(_, -1, Chars, Chars0),
@@ -115,23 +115,23 @@ read_term_from_chars(Chars, Term) :-
partial_string(Chars) -> partial_string(Chars) ->
true true
; ;
throw(error(type_error(complete_string, Chars), read_term_from_chars/2)) type_error(complete_string, Chars, read_term_from_chars/2)
), ),
'$read_term_from_chars'(Chars, Term). '$read_term_from_chars'(Chars, Term).
write_term_to_chars(_, Options, _) :- write_term_to_chars(_, Options, _) :-
var(Options), throw(error(instantiation_error, write_term_to_chars/3)). var(Options), instantiation_error(write_term_to_chars/3).
write_term_to_chars(Term, Options, Chars) :- write_term_to_chars(Term, Options, Chars) :-
'$skip_max_list'(_, -1, Options, Options0), '$skip_max_list'(_, -1, Options, Options0),
( var(Options0) -> ( var(Options0) ->
throw(error(instantiation_error, write_term_to_chars/3)) instantiation_error(write_term_to_chars/3)
; nonvar(Chars) -> ; nonvar(Chars) ->
throw(error(uninstantiation_error(Chars), write_term_to_chars/3)) throw(error(uninstantiation_error(Chars), write_term_to_chars/3))
; Options0 == [] -> ; Options0 == [] ->
true true
; ;
throw(error(type_error(list, Options), write_term_to_chars/3)) type_error(list, Options, write_term_to_chars/3)
), ),
builtins:inst_member_or(Options, ignore_ops(IgnoreOps), ignore_ops(false)), builtins:inst_member_or(Options, ignore_ops(IgnoreOps), ignore_ops(false)),
builtins:inst_member_or(Options, numbervars(NumberVars), numbervars(false)), builtins:inst_member_or(Options, numbervars(NumberVars), numbervars(false)),

View File

@@ -6917,12 +6917,6 @@ contribution_at(T, Task, Offset-Bs, Contribution) :-
?(Contribution) #= B*C ?(Contribution) #= B*C
). ).
nth0(0, [E|_], E) :- !.
nth0(N, [_|Ls], E) :-
N > 0,
N1 is N - 1,
nth0(N1, Ls, E).
nth1(I, Es, E) :- nth1(I, Es, E) :-
I0 is I-1, I0 is I-1,
nth0(I0, Es, E). nth0(I0, Es, E).

View File

@@ -1,7 +1,7 @@
:- module(lists, [member/2, select/3, append/2, append/3, foldl/4, foldl/5, :- module(lists, [member/2, select/3, append/2, append/3, foldl/4, foldl/5,
memberchk/2, reverse/2, length/2, maplist/2, memberchk/2, reverse/2, length/2, maplist/2,
maplist/3, maplist/4, maplist/5, maplist/6, maplist/3, maplist/4, maplist/5, maplist/6,
maplist/7, maplist/8, maplist/9, same_length/2, maplist/7, maplist/8, maplist/9, same_length/2, nth0/3,
sum_list/2, transpose/2, list_to_set/2]). sum_list/2, transpose/2, list_to_set/2]).
@@ -21,9 +21,9 @@ length(Xs, N) :-
; var(Xs0) -> R is N-M, length_rundown(Xs0, R)). ; var(Xs0) -> R is N-M, length_rundown(Xs0, R)).
length(_, N) :- length(_, N) :-
integer(N), !, integer(N), !,
throw(error(domain_error(not_less_than_zero, N), length/2)). domain_error(not_less_than_zero, N, length/2).
length(_, N) :- length(_, N) :-
throw(error(type_error(integer, N), length/2)). type_error(integer, N, length/2).
length_addendum([], N, N). length_addendum([], N, N).
length_addendum([_|Xs], N, M) :- length_addendum([_|Xs], N, M) :-
@@ -63,7 +63,7 @@ reverse(Xs, Ys) :-
). ).
reverse([], [], YsRev, YsRev). reverse([], [], YsRev, YsRev).
reverse([X1|Xs], [Y1|Ys], YsPreludeRev, Xss) :- reverse([_|Xs], [Y1|Ys], YsPreludeRev, Xss) :-
reverse(Xs, Ys, [Y1|YsPreludeRev], Xss). reverse(Xs, Ys, [Y1|YsPreludeRev], Xss).
@@ -104,7 +104,7 @@ maplist(Cont, [E1|E1s], [E2|E2s], [E3|E3s], [E4|E4s], [E5|E5s], [E6|E6s], [E7|E7
maplist(_, [], [], [], [], [], [], [], []). maplist(_, [], [], [], [], [], [], [], []).
maplist(Cont, [E1|E1s], [E2|E2s], [E3|E3s], [E4|E4s], [E5|E5s], [E6|E6s], [E7|E7s], [E8|E8s]) :- maplist(Cont, [E1|E1s], [E2|E2s], [E3|E3s], [E4|E4s], [E5|E5s], [E6|E6s], [E7|E7s], [E8|E8s]) :-
call(Cont, E1, E2, E3, E4, E5, E6, E7), call(Cont, E1, E2, E3, E4, E5, E6, E7, E8),
maplist(Cont, E1s, E2s, E3s, E4s, E5s, E6s, E7s, E8s). maplist(Cont, E1s, E2s, E3s, E4s, E5s, E6s, E7s, E8s).
@@ -177,3 +177,26 @@ unify_same(E-V, Prev-Var, E-V) :-
Var = V Var = V
; true ; true
). ).
nth0(N, Es, E) :-
can_be(integer, N),
can_be(list, Es),
( integer(N) ->
nth0_index(N, Es, E)
; nth0_search(N, Es, E)
).
nth0_index(0, [E|_], E) :- !.
nth0_index(N, [_|Es], E) :-
N > 0,
N1 is N - 1,
nth0_index(N1, Es, E).
nth0_search(N, Es, E) :-
nth0_search(0, N, Es, E).
nth0_search(N, N, [E|_], E).
nth0_search(N0, N, [_|Es], E) :-
N1 is N0 + 1,
nth0_search(N1, N, Es, E).

View File

@@ -22,7 +22,7 @@ random(R) :-
random_integer(Lower, Upper, R) :- random_integer(Lower, Upper, R) :-
var(R), var(R),
( (var(Lower) ; var(Upper)) -> ( (var(Lower) ; var(Upper)) ->
throw(error(instantiation_error, random_integer/3)) instantiation_error(random_integer/3)
; \+ integer(Lower) -> ; \+ integer(Lower) ->
domain_error(integer, Lower, random_integer/3) domain_error(integer, Lower, random_integer/3)
; \+ integer(Upper) -> ; \+ integer(Upper) ->

View File

@@ -6,7 +6,7 @@
Reasoning about time stamps would be a useful addition, for example Reasoning about time stamps would be a useful addition, for example
by obtaining the current time, comparing and formatting it. by obtaining the current time, comparing and formatting it.
'$cpu_new' can be replaced by statistics/2 once that is implemented. '$cpu_now' can be replaced by statistics/2 once that is implemented.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
:- module(time, [max_sleep_time/1, sleep/1, time/1]). :- module(time, [max_sleep_time/1, sleep/1, time/1]).
@@ -22,7 +22,7 @@ sleep(T) :-
( T < 0 -> ( T < 0 ->
domain_error(not_less_than_zero, T, sleep/1) domain_error(not_less_than_zero, T, sleep/1)
; max_sleep_time(N), T > N -> ; max_sleep_time(N), T > N ->
throw(error(reprensentation_error(max_sleep_time), sleep/1)) throw(error(representation_error(max_sleep_time), sleep/1))
; '$sleep'(T) ; '$sleep'(T)
). ).