Skip to content

Instantly share code, notes, and snippets.

@m2ym
Last active August 29, 2015 14:04
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 m2ym/898f7025a17918e76119 to your computer and use it in GitHub Desktop.
Save m2ym/898f7025a17918e76119 to your computer and use it in GitHub Desktop.
varnumbers/2 in B-Prolog
% unnumber_vars/2 is not working correctly in B-Prolog 8.1. Here is
% an alternative implementation of unnumber_vars/2 named varnumbers/2,
% which is compatible with SWI-Prolog's varnumbers library.
max_varnumber('$VAR'(N), Max) =>
Max = N.
max_varnumber(Term, Max) =>
Term =.. [_ | Args0],
Args @= [Arg : Arg0 in Args0, [Arg], max_varnumber(Arg0, Arg)],
Max is max([-1 | Args]).
% The number of variables in Term is limited to 65535.
varnumbers(Term, Copy) =>
max_varnumber(Term, Max),
Arity is Max + 1,
functor(Vars, vars, Arity),
varnumbers(Term, Vars, Copy).
varnumbers('$VAR'(N), Vars, Copy) =>
I is N + 1,
arg(I, Vars, Copy).
varnumbers(Term, Vars, Copy) =>
Term =.. [Name | Args0],
Args @= [Arg : Arg0 in Args0, [Arg], varnumbers(Arg0, Vars, Arg)],
Copy =.. [Name | Args].
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment