This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/Logtalk/library/term.lgt
2001-06-06 19:40:57 +00:00

132 lines
2.0 KiB
Plaintext

:- object(term,
implements(termp)).
:- info([
version is 1.0,
authors is 'Paulo Moura',
date is 2000/7/24,
comment is 'Prolog term predicates.']).
ground(Term) :-
nonvar(Term),
functor(Term, _, Arity),
ground(Arity, Term).
ground(0, _) :-
!.
ground(N, Term) :-
N > 0,
arg(N, Term, Arg),
ground(Arg),
N2 is N - 1,
ground(N2, Term).
occurs(Var, Term) :-
var(Term) ->
Var == Term
;
functor(Term, _, Arity),
occurs(Arity, Var, Term).
occurs(N, Var, Term) :-
compound(Term),
arg(N, Term, Arg),
occurs(Var, Arg),
!.
occurs(N, Var, Term) :-
N > 1,
N2 is N - 1,
occurs(N2, Var, Term).
subsumes(General, Specific) :-
vars(Specific, Vars),
subsumes(General, Specific, Vars).
subsumes(General, Specific, Vars) :-
var(General),
!,
(var_member_chk(General, Vars) ->
General == Specific
;
General = Specific).
subsumes(General, Specific, Vars) :-
nonvar(Specific),
functor(General, Functor, Arity),
functor(Specific, Functor, Arity),
subsumes(Arity, General, Specific, Vars).
subsumes(0, _, _, _) :- !.
subsumes(N, General, Specific, Vars) :-
arg(N, General, GenArg),
arg(N, Specific, SpeArg),
subsumes(GenArg, SpeArg, Vars),
M is N-1, !,
subsumes(M, General, Specific, Vars).
var_member_chk(Var, [Head| Tail]) :-
Var == Head ->
true
;
var_member_chk(Var, Tail).
subterm(Term, Term).
subterm(Sub, Term) :-
nonvar(Term),
functor(Term, _, N),
subterm(N, Sub, Term).
subterm(N, Sub, Term) :-
compound(Term),
arg(N, Term, Arg),
subterm(Sub, Arg).
subterm(N, Sub, Term) :-
N > 1,
M is N-1,
subterm(M, Sub, Term).
valid(_).
vars(Term, Vars) :-
vars(Term, [], Vars).
vars(Term, Acc, Vars) :-
var(Term) ->
(var_member_chk(Term, Acc) ->
Vars = Acc
;
Vars = [Term| Acc])
;
Term =.. [_| Args],
var_list(Args, Acc, Vars).
var_list([], Vars, Vars).
var_list([Term| Terms], Acc, Vars) :-
vars(Term, Acc, Acc2),
var_list(Terms, Acc2, Vars).
:- end_object.