| 1 | |
|---|
| 2 | :- object(term, |
|---|
| 3 | implements(termp)). |
|---|
| 4 | |
|---|
| 5 | |
|---|
| 6 | :- info([ |
|---|
| 7 | version is 1.0, |
|---|
| 8 | author is 'Paulo Moura', |
|---|
| 9 | date is 2000/7/24, |
|---|
| 10 | comment is 'Prolog term predicates.']). |
|---|
| 11 | |
|---|
| 12 | |
|---|
| 13 | ground(Term) :- |
|---|
| 14 | nonvar(Term), |
|---|
| 15 | functor(Term, _, Arity), |
|---|
| 16 | ground(Arity, Term). |
|---|
| 17 | |
|---|
| 18 | |
|---|
| 19 | ground(0, _) :- |
|---|
| 20 | !. |
|---|
| 21 | |
|---|
| 22 | ground(N, Term) :- |
|---|
| 23 | N > 0, |
|---|
| 24 | arg(N, Term, Arg), |
|---|
| 25 | ground(Arg), |
|---|
| 26 | N2 is N - 1, |
|---|
| 27 | ground(N2, Term). |
|---|
| 28 | |
|---|
| 29 | |
|---|
| 30 | occurs(Var, Term) :- |
|---|
| 31 | var(Term) -> |
|---|
| 32 | Var == Term |
|---|
| 33 | ; |
|---|
| 34 | functor(Term, _, Arity), |
|---|
| 35 | occurs(Arity, Var, Term). |
|---|
| 36 | |
|---|
| 37 | |
|---|
| 38 | occurs(N, Var, Term) :- |
|---|
| 39 | compound(Term), |
|---|
| 40 | arg(N, Term, Arg), |
|---|
| 41 | occurs(Var, Arg), |
|---|
| 42 | !. |
|---|
| 43 | |
|---|
| 44 | occurs(N, Var, Term) :- |
|---|
| 45 | N > 1, |
|---|
| 46 | N2 is N - 1, |
|---|
| 47 | occurs(N2, Var, Term). |
|---|
| 48 | |
|---|
| 49 | |
|---|
| 50 | subsumes(General, Specific) :- |
|---|
| 51 | vars(Specific, Vars), |
|---|
| 52 | subsumes(General, Specific, Vars). |
|---|
| 53 | |
|---|
| 54 | |
|---|
| 55 | subsumes(General, Specific, Vars) :- |
|---|
| 56 | var(General), |
|---|
| 57 | !, |
|---|
| 58 | (var_member_chk(General, Vars) -> |
|---|
| 59 | General == Specific |
|---|
| 60 | ; |
|---|
| 61 | General = Specific). |
|---|
| 62 | |
|---|
| 63 | subsumes(General, Specific, Vars) :- |
|---|
| 64 | nonvar(Specific), |
|---|
| 65 | functor(General, Functor, Arity), |
|---|
| 66 | functor(Specific, Functor, Arity), |
|---|
| 67 | subsumes(Arity, General, Specific, Vars). |
|---|
| 68 | |
|---|
| 69 | |
|---|
| 70 | subsumes(0, _, _, _) :- !. |
|---|
| 71 | |
|---|
| 72 | subsumes(N, General, Specific, Vars) :- |
|---|
| 73 | arg(N, General, GenArg), |
|---|
| 74 | arg(N, Specific, SpeArg), |
|---|
| 75 | subsumes(GenArg, SpeArg, Vars), |
|---|
| 76 | M is N-1, !, |
|---|
| 77 | subsumes(M, General, Specific, Vars). |
|---|
| 78 | |
|---|
| 79 | |
|---|
| 80 | var_member_chk(Var, [Head| Tail]) :- |
|---|
| 81 | Var == Head -> |
|---|
| 82 | true |
|---|
| 83 | ; |
|---|
| 84 | var_member_chk(Var, Tail). |
|---|
| 85 | |
|---|
| 86 | |
|---|
| 87 | subterm(Term, Term). |
|---|
| 88 | |
|---|
| 89 | subterm(Sub, Term) :- |
|---|
| 90 | nonvar(Term), |
|---|
| 91 | functor(Term, _, N), |
|---|
| 92 | subterm(N, Sub, Term). |
|---|
| 93 | |
|---|
| 94 | |
|---|
| 95 | subterm(N, Sub, Term) :- |
|---|
| 96 | compound(Term), |
|---|
| 97 | arg(N, Term, Arg), |
|---|
| 98 | subterm(Sub, Arg). |
|---|
| 99 | |
|---|
| 100 | subterm(N, Sub, Term) :- |
|---|
| 101 | N > 1, |
|---|
| 102 | M is N-1, |
|---|
| 103 | subterm(M, Sub, Term). |
|---|
| 104 | |
|---|
| 105 | |
|---|
| 106 | valid(_). |
|---|
| 107 | |
|---|
| 108 | |
|---|
| 109 | vars(Term, Vars) :- |
|---|
| 110 | vars(Term, [], Vars). |
|---|
| 111 | |
|---|
| 112 | |
|---|
| 113 | vars(Term, Acc, Vars) :- |
|---|
| 114 | var(Term) -> |
|---|
| 115 | (var_member_chk(Term, Acc) -> |
|---|
| 116 | Vars = Acc |
|---|
| 117 | ; |
|---|
| 118 | Vars = [Term| Acc]) |
|---|
| 119 | ; |
|---|
| 120 | Term =.. [_| Args], |
|---|
| 121 | var_list(Args, Acc, Vars). |
|---|
| 122 | |
|---|
| 123 | |
|---|
| 124 | var_list([], Vars, Vars). |
|---|
| 125 | |
|---|
| 126 | var_list([Term| Terms], Acc, Vars) :- |
|---|
| 127 | vars(Term, Acc, Acc2), |
|---|
| 128 | var_list(Terms, Acc2, Vars). |
|---|
| 129 | |
|---|
| 130 | |
|---|
| 131 | :- end_object. |
|---|