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