Merge pull request #1474 from triska/correct_can_be_chars
FIXED: can_be(chars, [a,X]), i.e., if variables occur as elements
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
Written September 2018 by Markus Triska (triska@metalevel.at)
|
Written 2018-2022 by Markus Triska (triska@metalevel.at)
|
||||||
I place this code in the public domain. Use it in any way you want.
|
I place this code in the public domain. Use it in any way you want.
|
||||||
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||||||
|
|
||||||
@@ -48,6 +48,7 @@ must_be_(integer, Term) :- check_(integer, integer, Term).
|
|||||||
must_be_(atom, Term) :- check_(atom, atom, Term).
|
must_be_(atom, Term) :- check_(atom, atom, Term).
|
||||||
must_be_(character, T) :- check_(error:character, character, T).
|
must_be_(character, T) :- check_(error:character, character, T).
|
||||||
must_be_(chars, Ls) :-
|
must_be_(chars, Ls) :-
|
||||||
|
can_be(chars, Ls), % prioritize type errors over instantiation errors
|
||||||
must_be(list, Ls),
|
must_be(list, Ls),
|
||||||
( '$is_partial_string'(Ls) ->
|
( '$is_partial_string'(Ls) ->
|
||||||
% The expected case (success) uses a very fast test.
|
% The expected case (success) uses a very fast test.
|
||||||
@@ -128,7 +129,11 @@ can_be(Type, Term) :-
|
|||||||
can_(integer, Term) :- integer(Term).
|
can_(integer, Term) :- integer(Term).
|
||||||
can_(atom, Term) :- atom(Term).
|
can_(atom, Term) :- atom(Term).
|
||||||
can_(character, T) :- character(T).
|
can_(character, T) :- character(T).
|
||||||
can_(chars, Ls) :- '$is_partial_string'(Ls).
|
can_(chars, Ls) :-
|
||||||
|
( '$is_partial_string'(Ls) -> true
|
||||||
|
; can_be(list, Ls),
|
||||||
|
can_be_chars(Ls)
|
||||||
|
).
|
||||||
can_(list, Term) :- list_or_partial_list(Term).
|
can_(list, Term) :- list_or_partial_list(Term).
|
||||||
can_(boolean, Term) :- boolean(Term).
|
can_(boolean, Term) :- boolean(Term).
|
||||||
can_(term, Term) :-
|
can_(term, Term) :-
|
||||||
@@ -137,6 +142,12 @@ can_(term, Term) :-
|
|||||||
; type_error(term, Term, can_be/2)
|
; type_error(term, Term, can_be/2)
|
||||||
).
|
).
|
||||||
|
|
||||||
|
can_be_chars(Var) :- var(Var), !.
|
||||||
|
can_be_chars([]).
|
||||||
|
can_be_chars([X|Xs]) :-
|
||||||
|
can_be(character, X),
|
||||||
|
can_be_chars(Xs).
|
||||||
|
|
||||||
list_or_partial_list(Ls) :-
|
list_or_partial_list(Ls) :-
|
||||||
'$skip_max_list'(_, _, Ls, Rs),
|
'$skip_max_list'(_, _, Ls, Rs),
|
||||||
( var(Rs) -> true
|
( var(Rs) -> true
|
||||||
|
|||||||
Reference in New Issue
Block a user