代入は subs で大丈夫と思っていたら、どういうわけか Dom::Polynomial などでは全くうまくいきません。
p:=3:
Zp:=Dom::IntegerMod(p):   
VARS:=[X,Y,t,u]:    //変数
POLY:=Dom::DistributedPolynomial(VARS,Zp): // POLY=(Z/pZ)[X,Y]
subs(POLY(X),X=t);   // X に t を代入したい
                                (1 mod 3) X   
//うーん。うまくいかない。
subs(collect(POLY(X),VARS),X=t);      //一旦 collect をかます。
                                     t
//うまくいった。
//場合によっては結果にもう一度 POLY をかぶせた方が良いこともあるでしょう。
...と思っていたのですが、このワザは新バージョンのmupad では
できなくなってました。
というか、expr というのがあったんですね。
というわけで、正解は「 expr をつかいましょう。」でした。
kenpei さまのページにはちゃんと書いてありました。
さすが。
p:=3:
Zp:=Dom::IntegerMod(p):   
VARS:=[X,Y,t,u]:    //変数
POLY:=Dom::DistributedPolynomial(VARS,Zp): // POLY=(Z/pZ)[X,Y]
subs(POLY(X),X=t);   // X に t を代入したい
                                (1 mod 3) X   
//うーん。うまくいかない。
subs(expr(POLY(X)),X=t);      //一旦 expr をかます。
                                     t
//うまくいった。
//場合によっては結果にもう一度 POLY をかぶせた方が良いこともあるでしょう。
もちろん、こういう場合にはグレブナ基底で扱うこともできるわけですが、
わざわざそこまでしなくても、という時には便利ですね。