From: David W. <wa...@cs...> - 2007-12-31 15:48:23
|
Terrance Swift writes: > We do have an auto_table declaration, which for Prolog files decides= which > predicates need to be tabled in order to remove loops in the static = call > graph. It might help, but you should be aware of two issues: >=20 > 1) I don't know how well it works with HiLog (it may table all the H= iLog > predicates). I tried it with the progran Sudhakar sent and it didn't table anything, and so there was still the loop. I was somewhat surprised. And, as Terry mentions, it's not very precise with HiLog. =20 The program is a little odd: Z( A, B) :- =A0=A0=A0=A0=A0=A0=A0X( B ). Z(A, C) :- =A0 =A0 =A0 =A0Y(A, B), =A0=A0=A0=A0=A0=A0=A0Z(B, C). /* Depends is reflexive */ Y(A,B) :- =A0 =A0 =A0 =A0( =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0( atomic(A), A =3D B) ; =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0( atomic(B),=A0B =3D A) =A0 =A0 =A0 =A0 =A0 =A0). X( _) :- fail. The clause for Y/2 says that Y is essentially equality (on atoms). I would have thought what you would want was something like: Y(A,A) :- (Y(A,B) ; Y(B,A)). This clause would give the reflexive closure of other ways of defining=20= Y. Maybe what you want are predicates like: transitive(parent). .. reflexive(sibling). .. which define properties of relationship names. And then you could have rules like: Z(A,B) :- transitive(Z), Z(A,C), Z(C,A). Y(A,A) :- reflexive(Y), (Y(A,B) ; Y(B,A)). > 2) As it is invoked by our file-based compiler, I don't think it han= dles > cases in which a predicate in file A (say p/2) and a predicate in fi= le B > (say q/2) call each other. -David |