132 lines
2.0 KiB
Plaintext
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.
|