Unification, comparison
Filip Konvička
filip.konvicka.removethisantispamtoken at logis.cz
Thu Jan 5 14:46:59 CET 2006
Hi,
>> Hmm. I believe the following optimization is worth considering: when two
>> variables are either bound together or successfully tested for structural
>> equality, set both to point to the structure with the lower address.
>>
>> (Note that this only incurs extra overhead in the slow path where the
>> full unification or structural equality algorithms are needed, not in the
>> fast paths where they either already have the same address, or one was
>> unbound.)
>
> Your suggestion implies that the memory representation of a record could
> be turned into an indirection to another representation of the same
> record. This makes the traversal of data quite complex, and makes the
> memory representation quite error-prone. Currently only a variable can
> become an indirection to something else.
>
> In most programs, something like 99% of unifications are simple variable
> bindings. Very few actually require recursive unification. Your idea
> implies an overhead on *every* operation, even if you don't use the full
> power of unification! The current implementation provides a better
> tradeoff for most cases.
>
>> The main advantage is for memory usage -- it tends to reduce the
>> number of
>> copies of identical structures, as the ones that are no longer referenced
>> are garbage collected. I don't remember where I first heard about this
>> idea
>> (maybe on the C2 wiki?), but some Lisp implementations used it, I think.
>
> I am not sure this is worth the effort. My experience tells me that
> this kind of tricks potentially brings more problems than solutions.
Since the constraint store is monotonic, I thought that the equality
constraints (or even the equality test results) were cached in some way.
I was not sure about the equality test, but I thought it that was clear
for unification (I did have the idea of one of the variables
"disappearing", which - as it seems - actually is the case only if the
variable is free).
If making one of the variables being unified point to the other data
structure is difficult, why not have a cache of *variables* that have
been explicitly unified/tested for equality? (This may be stupid, but I
wonder what would be the performance with such modification...)
Cheers,
Filip
More information about the mozart-users
mailing list