1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
:- object(term,
implements(termp)).
:- info([
version is 1.0,
author 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.
|