add term variables
This commit is contained in:
@@ -1,29 +0,0 @@
|
||||
:- module(numbervars, [numbervars/2, numbervars/3]).
|
||||
|
||||
numbervars(Term, NewTerm) :- duplicate_term(Term, NewTerm), numbervars(Term, NewTerm, 0, _).
|
||||
|
||||
numbervars(Term, NewTerm, N) :-
|
||||
( integer(N), N >= 0 -> duplicate_term(Term, NewTerm), numbervars(Term, NewTerm, N, _)
|
||||
; integer(N) -> throw(error(domain_error(not_less_than_zero, N), numbervars/3))
|
||||
; throw(error(type_error(integer, N), numbervars/3))
|
||||
).
|
||||
|
||||
numbervars(Term, NewTerm, N1, N2) :-
|
||||
var(Term), !, NewTerm = '$VAR'(N1), N2 is N1 + 1.
|
||||
numbervars(Term, NewTerm, N1, N2) :- compound(Term), !,
|
||||
Term =.. [Name | Args],
|
||||
NewTerm =.. [Name | NewArgs],
|
||||
fold_numbervars(Args, NewArgs, N1, N2).
|
||||
numbervars(_, _, N, N).
|
||||
|
||||
marked_already(Term, NewTerm) :-
|
||||
var(Term), nonvar(NewTerm), NewTerm = '$VAR'(_).
|
||||
marked_already(Term, NewTerm) :-
|
||||
atomic(Term).
|
||||
|
||||
fold_numbervars([HeadTerm | Terms], [NewHeadTerm | NewTerms], N1, Nn) :-
|
||||
( marked_already(HeadTerm, NewHeadTerm) -> N1 = N2
|
||||
; numbervars(HeadTerm, NewHeadTerm, N1, N2)
|
||||
),
|
||||
fold_numbervars(Terms, NewTerms, N2, Nn).
|
||||
fold_numbervars([], [], N, N).
|
||||
19
src/prolog/lib/terms.pl
Normal file
19
src/prolog/lib/terms.pl
Normal file
@@ -0,0 +1,19 @@
|
||||
:- module(terms, [term_variables/2, numbervars/2, numbervars/3]).
|
||||
|
||||
term_variables(Term, Vars) :- '$term_variables'(Term, Vars).
|
||||
|
||||
numbervars(Term, N) :-
|
||||
integer(N),
|
||||
term_variables(Term, Vars),
|
||||
numberlist(Vars, N, N1).
|
||||
|
||||
numbervars(Term, N0, N) :-
|
||||
integer(N0),
|
||||
integer(N),
|
||||
term_variables(Term, Vars),
|
||||
numberlist(Vars, N0, N).
|
||||
|
||||
numberlist([], N,N).
|
||||
numberlist(['$VAR'(N0)|Vars], N0,N) :-
|
||||
N1 is N0+1,
|
||||
numberlist(Vars, N1,N).
|
||||
Reference in New Issue
Block a user