Past participles and gender agreement in Spanish

How does one deal with past participles which agree in gender when they are modifiers (1)-(2) but are used in the default masculine form when they form present perfect tense with the auxiliary verb (3)?

(1) La      gata    sentada.
    The.fem cat:fem seat.PPT.fem
    `The seated cat.` [spa]
(2) *La      gata    sentado.
     The.fem cat:fem seat.PPT.masc
Intended: The seated cat.

(3) La      gata    ha  sentado.
    The.fem cat:fem AUX seat.PPT.masc
 `The cat has sat. [spa]

If I underspecify gender in participles (as is the case in the SRG now), I get overgeneration such as (2). But if I constrain gender on the participles at the level of the lexical rules, then I lose (3), since sentado will insist on the SUBJ’s INDEX having the agreement features which include masculine gender.

I can’t copy everything except just GEN because I need the whole INDEX for the MRS (right?). The ARG1 of the verb dormir has to be la gata, which is feminine, but that means the participle cannot start out as requiring a masculine subject, right?

One option is an additional lexical rule for participles like sentado along with some additional feature which only allows it to be the complement of the auxiliary verb haber and nothing else?

Any other option?.. Am I missing something with respect to indices and subjects and the MRS?..

I think generally in HPSG, there supposed to be some flexibility in how the LOCAL.AGR features are used in combination with the CONT.INDEX features. I know people have modeled “hybrid” agreement with that, though I couldn’t find any examples with present perfect and past participles specifically. But I think Kathol’s (1999) idea was in general that one should be able to construct the correct agreement feature set from both INDEX and LOCAL.AGR, and that various combinations of what is taken from where should be possible (which in the literature tends to be under HEAD but in the SRG it isn’t).

The LOCAL.AGR features in the SRG indeed appear to me to be flexible enough but I am not sure how flexible I can be with the INDEX since that’s part of the MRS?

Still trying to make this work.

I think the issue is that verbs are specified to have as their subjects something that insists on the agreement between the verb and the subject. Previously, the inflectional rules for participles were underspecified for number and gender, so grammatical constructions were covered (along with ungrammatical ones). But the nature of the inflectional rule supertype for participles is such that it stipulates this kind of agreement, so, once you constrain the inflectional rules accordingly, example (3) is no longer covered. Note identity 31 in the two portions of the structure corresponding to a non-inflecting lexical rule I added to try and deal with this:

This is the daughter, so, the structure that went through the general participle inflectional lexical rule:

And this is the mother’s HOOK:

Screenshot from 2024-04-09 16-36-53

Again, note identity 31. I don’t want it there.

I tried to write the non-inflecting lexical rule such that it doesn’t copy up this constraint, and then my plan was to ensure the correct semantics via the auxiliary haber. But the constraint is still there…

I think it comes from this type:

nom-subj-synsem := lex-synsem &
  [ LOCAL [ AGR #agr & [ PNG #png ], 
            CAT [ VAL.SUBJ < [ LOCAL np_nom_local & 
                                     [ AGR #agr,
                                       CONT.HOOK.INDEX #xarg ] ] > ],
            CONT.HOOK.XARG #xarg & [ PNG #png ] ] ].

The daughter synsem above is of this supertype. But shouldn’t it have been reconstructed by the non-inflecting lexical rule? Here’s the rule I wrote, with the supertypes. In principle, shouldn’t it be that constraint 31 doesn’t survive this?

v_pastpart-perf_dlr := ppart-perf-lex-rule &
  [ SYNSEM.LOCAL [ CAT [ HEAD [ INV -,
                                PRD non-prd & [ HABER + ] ],
                         VAL [ SUBJ < [ OPT +,
                                        LOCAL [ AGR [ PNG png,
                                                      PRONTYPE #prontype, 
                                                      DEF #def ],
                                                STR #str,
                                                COORD #coord,
                                                COORD-REL #coordrel,
                                                COORD-STRAT #coordstrat,
                                                CTXT #ctxt,
                                                CONT [ HOOK [ LTOP #ltop,
                                                              XARG #xarg,
                                                              INDEX individual & #index ],
                                                       RELS.LIST < [ ARG0 #index ], ... >,
                                                       HCONS #hcons ] ],
                                        NON-LOCAL #snonloc & [ SLASH 0-dlist ] ] >,
                               COMPS #comps,
                               CLTS #clts ] ],
                    CONT [ HOOK [ XARG #xarg, INDEX #event ],
                           RELS.LIST < [ ARG1 #index ], ... > ] ],
    DTR [ INFLECTED +,
          SYNSEM nom-subj-synsem & [ LOCAL [ CAT.VAL [ SUBJ < [ LOCAL [ AGR [ PNG [ PN 3sg, GEN masc ],
                                                                              PRONTYPE #prontype, 
                                                                              DEF #def ],
                                                                     STR #str,
                                                                     COORD #coord,
                                                                     COORD-REL #coordrel,
                                                                     COORD-STRAT #coordstrat,
                                                                     CTXT #ctxt,
                                                                     CONT [ HOOK.LTOP #ltop,
                                                                            ;RELS #rels,
                                                                            HCONS #hcons ] ],
                                                                 NON-LOCAL #snonloc ] >,
                                                       COMPS #comps,
                                                       CLTS #clts ],
                                              CONT.HOOK.INDEX #event ] ] ] ]
  """
  To "reset" agreement number and gender features for constructions like
  "Las gatas han comido."
  """.


ppart-perf-lex-rule := basic-lexeme-to-lexeme-rule & constant-lex-rule &
  [ ALTS.PASS -,
    SYNSEM [ PUNCT #punct,
             SLSHD #slshd,
             LOCAL [ CAT [ MC na,
                           HEAD verb & [ AUX -,
                                         VFORM part,
                                         TAM #tam & [ MOOD #mood ],
                                         KEYS.KEY #key,
                                         MOD < > ],
                           VAL.SPR < > ],
                     CONT [ HOOK [ LTOP #hand ],
                            HCONS #hcons,
                            RELS #rels & [ LIST < [ ARG0 [ E.MOOD #mood ] ], ... > ] ],
                     CTXT #ctxt ],
             LKEYS #lkeys,
             NON-LOCAL #nonloc ],
    DTR [ INFLECTED +,
          ALTS.PASS +,
          SYNSEM [ PUNCT #punct & [ RPUNCT no_punct ],
                   SLSHD #slshd,
                   LOCAL [ CAT [ HEAD verb & [ PRD non-prd,
                                               VFORM part,
                                               VOICE active,
                                               TAM #tam,
                                               KEYS.KEY #key ],
                                 VAL.SPR < > ],
                           CONT [ HOOK [ LTOP #hand ],
                                  HCONS #hcons,
                                  RELS #rels ],
                           CTXT #ctxt ],
                   LKEYS #lkeys,
                   NON-LOCAL #nonloc ] ],
    C-CONT.RELS <! !> ]
  """
  --- LR types for participles
  -- LR type building pastparts for passive constructions
  """.

Are you using the same forms for both use cases? That is, is there anything different in the derivation history of the modifiers v. the predicates? If so, then you want the predicates to remain underspecified and only add the gender info in the case of the modifiers.

(Sorry if this is answered in the post … responding quickly without having read fully.)

That is what I am trying to do, yes. But I would like to avoid having an additional homonymous inflectional rule that is underspecified and was hoping to overwrite the agreement values of the participle intended for modification via a non-inflecting lexical rule.

(Continuing). I fixed the situation with (3) by an additional lexical rule which does not specify agreement on the participle but only allows it to combine with the auxiliary haber. However, now I noticed the problem with (4)

(4) La operacion fue realizada por un experto.
     the operation:fem was realized.fem by an expert:masc
    "The operation was implemented by an expert." [spa]

This was only working before because the participles were underspecified for agreement (and were overgenerating, as in (2) ). Now that I fixed (2), I don’t have (4). This is because all verbs in the SRG are of the type which immediately constrains the subject:

arg1_lt := nom-subj-synsem & 
  [ LOCAL.CAT.VAL.SUBJ < [ LOCAL.CONT.HOOK.INDEX #ind ] >,
    LKEYS.KEYREL arg1-ev-relation & 
                 [ ARG1 #ind ] ]. 

I would think that the past participle derivational lexical rule should be able to get rid of this? But it doesn’t seem to. Can I get rid of that?.. I know we talked with @ebender and @Dan that once something is in the HOOK, it’s hard to get rid of, but how is that supposed to work actually? Is that actually not possible somehow? Or is there a way to write the rule such that (4) works? Or is this another case where perhaps direct identity with the subject index should be sacrificed for something like ICONS? Request to people experienced with this sort of thing: If this is not clear, rather than not saying anything, please just reply: “Not clear”, and I will try to clarify.

ppart-lex-rule := const-ltol-rule &
  [ ALTS.PASS -,
    SYNSEM [ PUNCT #punct,
             SLSHD #slshd,
             LOCAL [ CAT [ MC #mc,
                           HEAD verb & [ AUX -,
                                         VFORM part,
                                         VOICE passive,
                                         TAM #tam & [ MOOD #mood ],
                                         KEYS.KEY #key,
                                         MOD < >,
                                         LSYNSEM #lsynsem,
                                         PRD.HABER - ],
                           VAL.SPR < [ OPT +,
                                       LOCAL [ CAT [ HEAD.KEYS.KEY degree_rel,
                                                     MC na ],
                                               CONT.HOOK [ LTOP #hand,
                                                           XARG #index ] ],
                                       NON-LOCAL [ SLASH 0-dlist,
                                                   QUE 0-dlist ] ] > ],
                     CONT [ HOOK [ INDEX #index,
                                   LTOP #hand,
                                   XARG #xarg ],
                            HCONS #hcons,
                            RELS #rels & [ LIST < [ ARG0 #index & [ E.MOOD #mood ] ], ... > ] ],
                     CTXT #ctxt ],
             LKEYS #lkeys,
             NON-LOCAL #nonloc ],
    DTR [ INFLECTED +,
          ALTS.PASS +,
          SYNSEM [ PUNCT #punct & [ RPUNCT no_punct ],
                   SLSHD #slshd,
                   LOCAL [ CAT [ MC #mc,
                                 HEAD verb & [ PRD non-prd & [ HABER - ],
                                               VFORM part,
                                               VOICE active,
                                               TAM #tam,
                                               KEYS.KEY #key,
                                               LSYNSEM #lsynsem ],
                                 VAL.SPR < > ],
                           CONT [ HOOK [ LTOP #hand,
                                         XARG #xarg ],
                                  HCONS #hcons,
                                  RELS #rels ],
                           CTXT #ctxt ],
                   LKEYS #lkeys,
                   NON-LOCAL #nonloc ] ],
    C-CONT.RELS <! !> ]
  """
  --- LR types for participles
  -- LR type building pastparts for passive constructions
  """.


v_pastpart-trans_dlr := ppart-lex-rule &
  [ SYNSEM.LOCAL [ AGR #arg2,
  		   CAT [ HEAD [ INV -,
                                PRD prd & [ COPV ser ] ],
                         VAL [ SUBJ < unexpressed & [ OPT +,
                                                      LOCAL np_nom_local & [ CONT #objcont,
                                                                             AGR #arg2 ],
                                                      NON-LOCAL #ononloc ] >,
                               COMPS < [ OPT +,
                                         LOCAL mrkd_np_local & [ CAT.HEAD.KEYS.KEY _por_p_sel_rel,
                                                                 CONT.HOOK.INDEX #subjind ],
                                         NON-LOCAL #snonloc ] . #comps >,
                               CLTS #clts ] ],
                   CONT.RELS.LIST < [ ARG2 #arg2 ], ... > ],
    DTR [ INFLECTED +,
          SYNSEM.LOCAL [ AGR #arg2,
                         CAT.VAL [ SUBJ < [ LOCAL np_nom_local & [ CONT.HOOK.INDEX #subjind ],
                                          NON-LOCAL #snonloc ] >,
                                 COMPS [ FIRST [ LOCAL np_acc_local & [ CONT #objcont & [ HOOK.INDEX #arg2 ],
                                                                        AGR #arg2 ],
                                                 NON-LOCAL #ononloc ],
                                         REST #comps ],
                                 CLTS #clts] ] ] ]
  """
  -- with transitive verbs
  """.

It looks like such a rule is already in the grammar; not sure why it wasn’t used for past participles before (before, a rule for present participles was for some reason used):

vppart_ilr :=  inflecting-lex-rule & 
  [ INFLECTED +,
    SYNSEM [ LOCAL [ AGR #agr,
                     CAT [ HEAD verb & [ AUX -,
                                         PRD prd, 
                                         VFORM part,
                                         VOICE passive,
                                         TAM [ TENSE #tense,
                                               MOOD #mood ],
                                         KEYS.KEY #key,
                                         MOD < > ], 
                           VAL [ SPR #spr,
                                 SUBJ < synsem &
                                        [ LOCAL np_nom_local & 
                                                [ AGR #agr,
                                                  CONT #objcont & [ HOOK.INDEX #agr ] ], 
                                          NON-LOCAL #ononloc & [ SLASH 0-dlist ] ] >,
                                 COMPS < [ OPT +,
                                           LOCAL mrkd_np_local &
                                                 [ CAT.HEAD.KEYS.KEY _por_p_sel_rel,
                                                   CONT.HOOK [ LTOP #hand, 
                                                               INDEX #subjind ] ],
                                           NON-LOCAL #snonloc ]. #comps >,
                                 CLTS < > ] ],
                     CONT [ HOOK [ INDEX.E.MOOD #mood,
                                   LTOP #hand ],
                            RELS #rels,
                            HCONS #hcons ],
                     CTXT #ctxt ],
            LKEYS #lkeys,
            NON-LOCAL #nonloc ],
    DTR [ INFLECTED -,
          SYNSEM [ LOCAL [ CAT [ HEAD verb &
                                      [ VFORM part,
                                        VOICE passive,
                                        TAM [ TENSE #tense,
                                              MOOD #mood ],
                                        KEYS.KEY #key ],
                                 VAL [ SPR #spr,
                                       SUBJ < [ LOCAL np_nom_local & 
                                                      [ CONT.HOOK.INDEX #subjind ],
                                                NON-LOCAL #snonloc ] >,
                                       COMPS [ FIRST [ LOCAL [ CONT #objcont ],
                                                       NON-LOCAL #ononloc ], 
                                               REST #comps ],
                                       CLTS < > ] ],
                           CONT [ HOOK.LTOP #hand,
                                  RELS #rels,
                                  HCONS #hcons ],
                           CTXT #ctxt ],
                   LKEYS #lkeys,
                   NON-LOCAL #nonloc ] ] ].

It’s very similar to the derivational rule above, which still applies. But before what would go through the derivational rule was a simple vpart, not vppart:

vpart_ilr :=  verb_ilr & 
[ SYNSEM.LOCAL.CAT.HEAD [ TAM.MOOD ind_or_sub_mood,
                          VFORM part,
                          VOICE active,
                          PRD non-prd ] ].

By changing the following part of the morphological layer of the grammar:

vmp00sf := 
%suffix (vmpsf vmpsf)
vppart_ilr & 
  [ SYNSEM.LOCAL [ CAT.HEAD [ AUX -, PRD.HABER - ],
                   AGR.PNG [ PN sing, GEN fem ] ] ].

such that the required rule is the vppart one and not the vpart one, I seem to get the desired MRS for (4) while still having good behavior wrt (1)-(3)… Don’t know yet about the rest of the corpus.

The reason the above vppart rule was not directly used is there are non-transitive verbs that can form participles as well. The idea in the grammar seems to be that all verbs should first go through vpart rule and then some will go through the ppart derivational rule, and it should somehow work for different types of verbs. I don’t think this is fully working at the moment… But if a transitive verb is put directly through the inflectional vppart rule above, things work beautifully for those transitive verbs.

So, originally, the verbs that come in the form of past participles, go through the first inflectional rule vpart_ilr (triggered by the freeling tag) and not the second one (vppart_ilr):

vmp00sf := 
%suffix (vmpsf vmpsf)
vpart_ilr & 
  [ SYNSEM.LOCAL [ CAT.HEAD [ AUX -, PRD.HABER - ],
                   AGR.PNG [ PN sing, GEN fem ] ] ].

vpart_ilr :=  verb_ilr & 
[ SYNSEM.LOCAL.CAT.HEAD [ TAM.MOOD ind_or_sub_mood,
                          VFORM part,
                          VOICE active,
                          PRD non-prd ] ].

vppart_ilr :=  inflecting-lex-rule & 
  [ INFLECTED +,
    SYNSEM [ LOCAL [ AGR #agr,
                     CAT [ HEAD verb & [ AUX -,
                                         PRD prd, 
                                         VFORM part,
                                         VOICE passive,
                                         TAM [ TENSE #tense,
                                               MOOD #mood ],
                                         KEYS.KEY #key,
                                         MOD < > ], 
                           VAL [ SPR #spr,
                                 SUBJ < synsem &
                                        [ LOCAL np_nom_local & 
                                                [ AGR #agr,
                                                  CONT #objcont & [ HOOK.INDEX #agr ] ], 
                                          NON-LOCAL #ononloc & [ SLASH 0-dlist ] ] >,
                                 COMPS < [ OPT +,
                                           LOCAL mrkd_np_local &
                                                 [ CAT.HEAD.KEYS.KEY _por_p_sel_rel,
                                                   CONT.HOOK [ LTOP #hand, 
                                                               INDEX #subjind ] ],
                                           NON-LOCAL #snonloc ]. #comps >,
                                 CLTS < > ] ],
                     CONT [ HOOK [ INDEX #arg0 & [ E.MOOD #mood ],
                                   LTOP #hand ],
                            RELS #rels,
                            HCONS #hcons ],
                     CTXT #ctxt ],
            LKEYS #lkeys,
            NON-LOCAL #nonloc ],
    DTR [ INFLECTED -,
          SYNSEM [ LOCAL [ CAT [ HEAD verb &
                                      [ VFORM part,
                                        VOICE passive,
                                        TAM [ TENSE #tense,
                                              MOOD #mood ],
                                        KEYS.KEY #key ],
                                 VAL [ SPR #spr,
                                       SUBJ < [ LOCAL np_nom_local & 
                                                      [ CONT.HOOK.INDEX #subjind ],
                                                NON-LOCAL #snonloc ] >,
                                       COMPS [ FIRST [ LOCAL [ CONT #objcont ],
                                                       NON-LOCAL #ononloc ], 
                                               REST #comps ],
                                       CLTS < > ] ],
                           CONT [ HOOK [ INDEX #arg0,
                                         LTOP #hand ],
                                  RELS #rels,
                                  HCONS #hcons ],
                           CTXT #ctxt ],
                   LKEYS #lkeys,
                   NON-LOCAL #nonloc ] ] ].

The things that went through vpart_ilr can serve as adjectives (thanks to a special adjpart unary phrase), or, if the verb happens to be transitive, they can further go through a derivational ppart-lex-rule, to then serve as complements to the copulas:

ppart-lex-rule := const-ltol-rule &
  [ ALTS.PASS -,
    SYNSEM [ PUNCT #punct,
             SLSHD #slshd,
             LOCAL [ CAT [ MC #mc,
                           HEAD verb & [ AUX -,
                                         VFORM part,
                                         VOICE passive,
                                         TAM #tam & [ MOOD #mood ],
                                         KEYS.KEY #key,
                                         MOD < >,
                                         LSYNSEM #lsynsem,
                                         PRD.HABER - ],
                           VAL.SPR < [ OPT +,
                                       LOCAL [ CAT [ HEAD.KEYS.KEY degree_rel,
                                                     MC na ],
                                               CONT.HOOK [ LTOP #hand,
                                                           XARG #index ] ],
                                       NON-LOCAL [ SLASH 0-dlist,
                                                   QUE 0-dlist ] ] > ],
                     CONT [ HOOK [ INDEX #index,
                                   LTOP #hand,
                                   XARG #xarg ],
                            HCONS #hcons,
                            RELS #rels & [ LIST < [ ARG0 #index & [ E.MOOD #mood ] ], ... > ] ],
                     CTXT #ctxt ],
             LKEYS #lkeys,
             NON-LOCAL #nonloc ],
    DTR [ INFLECTED +,
          ALTS.PASS +,
          SYNSEM [ PUNCT #punct & [ RPUNCT no_punct ],
                   SLSHD #slshd,
                   LOCAL [ CAT [ MC #mc,
                                 HEAD verb & [ PRD non-prd & [ HABER - ],
                                               VFORM part,
                                               VOICE active,
                                               TAM #tam,
                                               KEYS.KEY #key,
                                               LSYNSEM #lsynsem ],
                                 VAL.SPR < > ],
                           CONT [ HOOK [ LTOP #hand,
                                         XARG #xarg ],
                                  HCONS #hcons,
                                  RELS #rels ],
                           CTXT #ctxt ],
                   LKEYS #lkeys,
                   NON-LOCAL #nonloc ] ],
    C-CONT.RELS <! !> ]
  """
  --- LR types for participles
  -- LR type building pastparts for passive constructions
  """.

v_pastpart-trans_dlr := ppart-lex-rule &
  [ SYNSEM.LOCAL [ AGR #arg2,
  		   CAT [ HEAD [ INV -,
                                PRD prd & [ COPV ser ] ],
                         VAL [ SUBJ < unexpressed & [ OPT +,
                                                      LOCAL np_nom_local & [ CONT #objcont,
                                                                             AGR #arg2 ],
                                                      NON-LOCAL #ononloc ] >,
                               COMPS < [ OPT +,
                                         LOCAL mrkd_np_local & [ CAT.HEAD.KEYS.KEY _por_p_sel_rel,
                                                                 CONT.HOOK.INDEX #subjind ],
                                         NON-LOCAL #snonloc ] . #comps >,
                               CLTS #clts ] ],
                   CONT.RELS.LIST < [ ARG2 #arg2 ], ... > ],
    DTR [ INFLECTED +,
          SYNSEM.LOCAL [ AGR #arg2,
                         CAT.VAL [ SUBJ < [ LOCAL np_nom_local & [ CONT.HOOK.INDEX #subjind ],
                                          NON-LOCAL #snonloc ] >,
                                 COMPS [ FIRST [ LOCAL np_acc_local & [ CONT #objcont & [ HOOK.INDEX #arg2 ],
                                                                        AGR #arg2 ],
                                                 NON-LOCAL #ononloc ],
                                         REST #comps ],
                                 CLTS #clts] ] ] ]
  """
  -- with transitive verbs
  """.

All of this works in many cases but has the effect that (4) is impossible because the INDEX constraint on the SUBJ doesn’t want to go away even if I remove all SUBJ-related constraints from the derivational rule.

But if I modify the morphological layer so as to make the words with these participle tags instead go through the second rule (vppart_ilr), then (4) seems to work, and most other things seem to work — but I completely lose things that aren’t participles formed from transitive verbs (as in, there is no longer an inflectional rule for them to go through, they can’t go through vppart_ilr because their COMPS list is empty. They could go through vpart_ilr before and then through the adjpart unary phrase, and serve as adjectives).

Here’s an example of the vppart_ilr working as I think was intended. It’s the preterminal V above vista (the original complement of the verb is ARG2 and its agreement constraints are the participle’s local agreement constraints, so, come subject-head rule, agreement will be preserved. ARG1 is also not lost as can be seen from the MRS:

Screenshot from 2024-04-25 15-09-29

Screenshot from 2024-04-25 15-10-29

Screenshot from 2024-04-25 15-11-06

“The cat[x5] was seen by the man[x8]”, beautiful.

But I can’t have vppart_ilr as the direct inflectional rule for all participle-tagged words because the vppart_ilr is for transitive verbs, it requires a non-empty COMPS list. For that reason, in the original grammar everything was going through vpart_ilr which says nothing about the daughter at all, and then through the derivational rules, of which there are several in the grammar but I only ever saw the transitive one working, for the transitive verbs (see above).

I don’t understand how, but this vpart_ilr seems to have the effect of forever linking the SUBJ of the verb to its ARG1, and the derivational past participle rule, while correctly linking the original subject to ARG2, doesn’t change the fact that it must now be also ARG1?.. At least judging from what I see trying to parse (4) correctly.

The ppart-lex-rule and the vppart_ilr look very similar. I don’t understand why vppart_ilr has the desired effect for (4) and ppart-lex-rule in combination with vpart_ilr does not.

I tried modifying the existing derivational ppart-lex-rule (above) to be like vppart_ilr:

ppart-lex-rule :=  const-ltol-rule & 
  [ SYNSEM [ LOCAL [ AGR #agr,
                     CAT [ HEAD verb & [ AUX -,
                                         PRD.HABER -, 
                                         VFORM part,
                                         VOICE passive,
                                         TAM [ TENSE #tense,
                                               MOOD #mood ],
                                         KEYS.KEY #key,
                                         MOD < > ], 
                           VAL [ SPR #spr,
                                 SUBJ < synsem &
                                        [ LOCAL np_nom_local & 
                                                [ AGR #agr,
                                                  CONT #objcont & [ HOOK.INDEX #agr ] ], 
                                          NON-LOCAL #ononloc & [ SLASH 0-dlist ] ] >,
                                 COMPS < [ OPT +,
                                           LOCAL mrkd_np_local &
                                                 [ CAT.HEAD.KEYS.KEY _por_p_sel_rel,
                                                   CONT.HOOK [ LTOP #hand, 
                                                               INDEX #subjind ] ],
                                           NON-LOCAL #snonloc ]. #comps > ] ],
                     CONT [ HOOK [ INDEX #arg0 & [ E.MOOD #mood ],
                                   LTOP #hand ],
                            RELS #rels,
                            HCONS #hcons ],
                     CTXT #ctxt ],
            LKEYS #lkeys,
            NON-LOCAL #nonloc ],
    DTR [ INFLECTED +,
          SYNSEM [ LOCAL [ CAT [ HEAD verb &
                                      [ VFORM part,
                                        VOICE active,
                                        TAM [ TENSE #tense,
                                              MOOD #mood ],
                                        KEYS.KEY #key ],
                                 VAL [ SPR #spr,
                                       SUBJ < [ LOCAL np_nom_local & 
                                                      [ CONT.HOOK.INDEX #subjind ],
                                                NON-LOCAL #snonloc ] >,
                                       COMPS [ FIRST [ LOCAL [ CONT #objcont ],
                                                       NON-LOCAL #ononloc ], 
                                               REST #comps ] ] ],
                           CONT [ HOOK [ INDEX #arg0,
                                         LTOP #hand ],
                                  RELS #rels,
                                  HCONS #hcons ],
                           CTXT #ctxt ],
                   LKEYS #lkeys,
                   NON-LOCAL #nonloc ] ] ].

but once I return to the situation when vpart_ilr is applied to the verb lexical entries, I am back to the point where (4) is impossible due to agreement constraints. Surely, there must be a way to write this correctly. Why would the same rule work as inflectional but not as derivational? Or what am I missing/not noticing?

This is because vpart_ilr is a

lexeme-to-word-rule := lex-rule &
  [ INFLECTED +,
    KEY-ARG #keyarg,   
    SYNSEM #synsem,
    DTR [ INFLECTED -,
          KEY-ARG #keyarg,   
          SYNSEM #synsem ],
    C-CONT.RELS <! !> ]

while vppart_ilr is not.