Skip to content

Instantly share code, notes, and snippets.

@kamahen
Created January 9, 2022 07:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kamahen/a74f67d1fc2dcd6325d0a326a842fb3f to your computer and use it in GitHub Desktop.
Save kamahen/a74f67d1fc2dcd6325d0a326a842fb3f to your computer and use it in GitHub Desktop.
:- det(valid_termpos/2).
%! valid_termpos(+Term, +TermPos) is semidet.
% Checks that a Term has an appropriate TermPos.
% This should always succeed:
% read_term(Term, [subterm_positions(TermPos)]),
% valid_termpos(Term, TermPos)
valid_termpos(_Term, Var), var(Var) => true. % trivial default: "unknown" position
valid_termpos(Atom, _From-_To), atom(Atom) => true.
valid_termpos(Number, _From-_To), number(Number) => true.
valid_termpos(Var, _From-_To), var(Var) => true.
valid_termpos([], _From-_To) => true.
valid_termpos(String, string_position(_From,_To)), string(String) => true.
valid_termpos({Arg}, brace_term_position(_From,_To,ArgPos)) =>
valid_termpos(Arg, ArgPos).
valid_termpos([Hd|Tl], list_position(_From,_To, ElemsPos, none)) =>
maplist(valid_termpos, [Hd|Tl], ElemsPos),
list_tail([Hd|Tl], _, []).
valid_termpos([Hd|Tl], list_position(_From,_To, ElemsPos, TailPos)) =>
list_tail([Hd|Tl], HdPart, Tail),
maplist(valid_termpos, HdPart, ElemsPos),
valid_termpos(Tail, TailPos).
valid_termpos(Term, term_position(_From,_To, FFrom,FTo,SubPos)),
compound_name_arguments(Term, Name, Arguments) =>
valid_termpos(Name, FFrom-FTo),
maplist(valid_termpos, Arguments, SubPos).
valid_termpos(Dict, dict_position(_From,_To,TagFrom,TagTo,KeyValuePosList)),
dict_pairs(Dict, Tag, Pairs) =>
valid_termpos(Tag, TagFrom-TagTo),
valid_termpos_dict(Pairs, KeyValuePosList).
% key_value_position(From, To, SepFrom, SepTo, Key, KeyPos, ValuePos) is handled
% in valid_termpos_dict.
valid_termpos(Term, parentheses_term_position(_From,_To,ContentPos)) =>
valid_termpos(Term, ContentPos).
% TODO: documentation for quasi_quotation_position is wrong (SyntaxTo,SyntaxFrom should be SYntaxTerm,SyntaxPos).
valid_termpos(_Term, quasi_quotation_position(_From,_To,SyntaxTerm,SyntaxPos,_ContentPos)) =>
valid_termpos(SyntaxTerm, SyntaxPos).
:- det(valid_termpos_dict/2).
valid_termpos_dict([], []).
valid_termpos_dict([Key-Value|KVs], KeyValuePosList0) :-
selectchk(key_value_position(_From,_To,_SepFrom,_SepTo,Key,KeyPos,ValuePos),
KeyValuePosList0, KeyValuePosList1),
valid_termpos(Key, KeyPos),
valid_termpos(Value, ValuePos),
valid_termpos_dict(KVs, KeyValuePosList1).
:- det(list_tail/3).
list_tail([X|Xs], HdPart, Tail) =>
HdPart = [X|HdPart2],
list_tail(Xs, HdPart2, Tail).
list_tail(Tail0, HdPart, Tail) => HdPart = [], Tail0 = Tail.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment