root/tags/lgt2311/library/term.lgt

Revision 3507, 2.6 KB (checked in by pmoura, 21 months ago)

Added predicate variant/2 to the library object "term".

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
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, GeneralGenArg),
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.
Note: See TracBrowser for help on using the browser.