The first extension is *partial least general generalization* (plgg)
and allows us to only partially generalize two literals:
we can say that we want to generalize two literals or terms,
but can require some arguments to be fixed, i.e., that the two literals
must have unifying values at that specific argument position.
Thus, partial least general generalization is a combination of
unification and anti-unification.

Consider again the following literals

and the following application:additive(ppn_1060, flame-retardent)

additive(ppn_1060, fluent)

additive(r_5320, flame-retardent)

Here we only want to generalize over the fluent additives of identical materials: the generalization patternplgg(t1,t2,additive($,_))additive(ppn_1060, X)

We can also restrict generalization by requiring some arguments to be
of a particular type. In this case we would use a type or sort identifier
at the position of the meta-symbol *$* in the previous example.
Thus, exact match as done for *$* is now replaced by sorted
unification for the non-generalized argument positions.

Consider the taxonomy shown in Fig. 3.
Trying to generalize and requiring the first argument of
the resulting literal to be of type *novodur * would fail since
the least general generalization of *ppn_1060* and *r_5320*
is the type *thermoplastic*, which is too general, i.e. not within
the required type *novodur*:

However, if we only require the generalized material to be of typeplgg(t2,t3,additive(novodur,_))fail

plgg(t2,t3,additive(plastic,_))additive(thermoplastic, X)