diff options
author | dos-reis <gdr@axiomatics.org> | 2011-03-08 02:09:24 +0000 |
---|---|---|
committer | dos-reis <gdr@axiomatics.org> | 2011-03-08 02:09:24 +0000 |
commit | b96103f871a1bc514bd9b2ab99fb83fd9e3078f6 (patch) | |
tree | e81599924a7c833392a4acda0570fb210d00e27d /src/algebra | |
parent | b3fafae3f1a4e90138bf0991c71499cfb05e3a1b (diff) | |
download | open-axiom-b96103f871a1bc514bd9b2ab99fb83fd9e3078f6.tar.gz |
Fix dependency for bootstrap
Diffstat (limited to 'src/algebra')
-rw-r--r-- | src/algebra/Makefile.in | 160 | ||||
-rw-r--r-- | src/algebra/catdef.spad.pamphlet | 1 |
2 files changed, 115 insertions, 46 deletions
diff --git a/src/algebra/Makefile.in b/src/algebra/Makefile.in index c9334e9d..0852a79b 100644 --- a/src/algebra/Makefile.in +++ b/src/algebra/Makefile.in @@ -120,11 +120,11 @@ oa_strap_0_sources = \ BGAGG DIOPS DIAGG SETAGG FSAGG VECTCAT \ FEVALAB PDDOM PDSPC DSEXT PDRING DIFEXT \ RADCAT AMR FAMR FLINEXP POLYCAT UPOLYC PATAB FPATMAB PFECAT \ + KVTFROM SEXCAT QFCAT \ RNS FPS \ BOOLEAN INT NNI PI LIST VECTOR CHAR STRING oa_strap_1_sources = $(oa_strap_0_sources) \ - KVTFROM SEXCAT QFCAT \ SRAGG AHYP HYPCAT ATRIG TRIGCAT TRANFUN \ ILIST ISTRING DFLOAT SINT @@ -141,12 +141,11 @@ oa_strap_2_sources = $(oa_strap_1_sources) \ ## Consequently, the dependencies listed here are at the categories ## inheritance level; not necessarily at the use level. strap-0/BASTYPE.$(FASLEXT): strap-0/TYPE.$(FASLEXT) -strap-0/SETCAT.$(FASLEXT): strap-0/BASTYPE.$(FASLEXT) strap-0/KOERCE.$(FASLEXT): strap-0/TYPE.$(FASLEXT) strap-0/KONVERT.$(FASLEXT): strap-0/TYPE.$(FASLEXT) strap-0/RETRACT.$(FASLEXT): strap-0/KRCFROM.$(FASLEXT) strap-0/FRETRCT.$(FASLEXT): strap-0/RETRACT.$(FASLEXT) -strap-0/SECAT.$(FASLEXT): strap-0/BASTYPE.$(FASLEXT) strap-0/KOERCE.$(FASLEXT) +strap-0/SETCAT.$(FASLEXT): strap-0/BASTYPE.$(FASLEXT) strap-0/KOERCE.$(FASLEXT) strap-0/FINITE.$(FASLEXT): strap-0/SETCAT.$(FASLEXT) strap-0/ORDTYPE.$(FASLEXT): strap-0/BASTYPE.$(FASLEXT) strap-0/ORDSET.$(FASLEXT): strap-0/SETCAT.$(FASLEXT) strap-0/ORDTYPE.$(FASLEXT) @@ -208,7 +207,8 @@ strap-0/EUCDOM.$(FASLEXT): strap-0/PID.$(FASLEXT) strap-0/DIVRING.$(FASLEXT): strap-0/ENTIRER.$(FASLEXT) \ strap-0/ALGEBRA.$(FASLEXT) strap-0/DIVRING.$(FASLEXT): strap-0/RING.$(FASLEXT) -strap-0/FIELD.$(FASLEXT): strap-0/EUCDOM.$(FASLEXT) strap-0/UFD.$(FASLEXT) +strap-0/FIELD.$(FASLEXT): strap-0/EUCDOM.$(FASLEXT) strap-0/UFD.$(FASLEXT) \ + strap-0/DIVRING.$(FASLEXT) strap-0/DIFFDOM.$(FASLEXT): strap-0/TYPE.$(FASLEXT) strap-0/DIFFSPC.$(FASLEXT): strap-0/DIFFDOM.$(FASLEXT) strap-0/DIVRING.$(FASLEXT): strap-0/RING.$(FASLEXT) strap-0/DIFFSPC.$(FASLEXT) @@ -296,16 +296,81 @@ strap-0/CHAR.$(FASLEXT): strap-0/FSAGG.$(FASLEXT) strap-0/STRING.$(FASLEXT): strap-0/SRAGG.$(FASLEXT) ## Bootstrap stage 1 dependencies. +## At this stage, we attempt to compile domains essential for completing +## the bootstrap process (stage 2). Those that were compiled at stage 0 +## were (necessarily) incomplete. + +# We need Boolean to be complete when compiling the defaults of BasicType. +strap-1/BOOLEAN.$(FASLEXT): strap-1/BOOLE.$(FASLEXT) +strap-1/BASTYPE.$(FASLEXT): strap-1/BOOLEAN.$(FASLEXT) +strap-1/SETCAT.$(FASLEXT): strap-1/BASTYPE.$(FASLEXT) strap-1/KOERCE.$(FASLEXT) +strap-1/KOERCE.$(FASLEXT): strap-1/TYPE.$(FASLEXT) +strap-1/KONVERT.$(FASLEXT): strap-1/TYPE.$(FASLEXT) +strap-1/RETRACT.$(FASLEXT): strap-1/KRCFROM.$(FASLEXT) +strap-1/FRETRCT.$(FASLEXT): strap-1/RETRACT.$(FASLEXT) +strap-1/FINITE.$(FASLEXT): strap-1/SETCAT.$(FASLEXT) +strap-1/ORDTYPE.$(FASLEXT): strap-1/BASTYPE.$(FASLEXT) +strap-1/ORDSET.$(FASLEXT): strap-1/SETCAT.$(FASLEXT) strap-1/ORDTYPE.$(FASLEXT) +strap-1/ORDFIN.$(FASLEXT): strap-1/ORDSET.$(FASLEXT) strap-1/FINITE.$(FASLEXT) +strap-1/LOGIC.$(FASLEXT): strap-1/TYPE.$(FASLEXT) +strap-1/BOOLE.$(FASLEXT): strap-1/LOGIC.$(FASLEXT) +strap-1/PROPLOG.$(FASLEXT): strap-1/SETCAT.$(FASLEXT) strap-1/BOOLE.$(FASLEXT) + +strap-1/LLINSET.$(FASLEXT): strap-1/SETCAT.$(FASLEXT) +strap-1/RLINSET.$(FASLEXT): strap-1/SETCAT.$(FASLEXT) +strap-1/LINSET.$(FASLEXT): strap-1/LLINSET.$(FASLEXT) \ + strap-1/RLINSET.$(FASLEXT) +strap-1/ABELSG.$(FASLEXT): strap-1/SETCAT.$(FASLEXT) +strap-1/ABELMON.$(FASLEXT): strap-1/ABELSG.$(FASLEXT) +strap-1/CABMON.$(FASLEXT): strap-1/ABELMON.$(FASLEXT) +strap-1/SGROUP.$(FASLEXT): strap-1/SETCAT.$(FASLEXT) +strap-1/MONOID.$(FASLEXT): strap-1/SGROUP.$(FASLEXT) +strap-1/ABELGRP.$(FASLEXT): strap-1/CABMON.$(FASLEXT) \ + strap-1/LLINSET.$(FASLEXT) +strap-1/RNG.$(FASLEXT): strap-1/ABELGRP.$(FASLEXT) +strap-1/LMODULE.$(FASLEXT): strap-1/ABELGRP.$(FASLEXT) \ + strap-1/LLINSET.$(FASLEXT) +strap-1/RMODULE.$(FASLEXT): strap-1/ABELGRP.$(FASLEXT) \ + strap-1/RLINSET.$(FASLEXT) +strap-1/RING.$(FASLEXT): strap-1/RNG.$(FASLEXT) strap-1/MONOID.$(FASLEXT) \ + strap-1/LMODULE.$(FASLEXT) strap-1/KRCFROM.$(FASLEXT) +strap-1/COMRING.$(FASLEXT): strap-1/RING.$(FASLEXT) strap-1/BMODULE.$(FASLEXT) +strap-1/INTDOM.$(FASLEXT): strap-1/COMRING.$(FASLEXT) \ + strap-1/ALGEBRA.$(FASLEXT) strap-1/ENTIRER.$(FASLEXT) +strap-1/GCDDOM.$(FASLEXT): strap-1/INTDOM.$(FASLEXT) +strap-1/BMODULE.$(FASLEXT): strap-1/LMODULE.$(FASLEXT) \ + strap-1/RMODULE.$(FASLEXT) +strap-1/MODULE.$(FASLEXT): strap-1/COMRING.$(FASLEXT) \ + strap-1/BMODULE.$(FASLEXT) strap-1/LINSET.$(FASLEXT) +strap-1/ENTIRER.$(FASLEXT): strap-1/RING.$(FASLEXT) strap-1/BMODULE.$(FASLEXT) +strap-1/ALGEBRA.$(FASLEXT): strap-1/COMRING.$(FASLEXT) \ + strap-1/RING.$(FASLEXT) strap-1/MODULE.$(FASLEXT) \ + strap-1/KRCFROM.$(FASLEXT) +strap-1/UFD.$(FASLEXT): strap-1/GCDDOM.$(FASLEXT) strap-1/PID.$(FASLEXT): strap-1/GCDDOM.$(FASLEXT) strap-1/EUCDOM.$(FASLEXT): strap-1/PID.$(FASLEXT) - +strap-1/DIFFSPC.$(FASLEXT): strap-1/DIFFDOM.$(FASLEXT) +strap-1/PATMAB.$(FASLEXT): strap-1/SETCAT.$(FASLEXT) +strap-1/OASGP.$(FASLEXT): strap-1/ORDSET.$(FASLEXT) strap-1/SGROUP.$(FASLEXT) +strap-1/OAMON.$(FASLEXT): strap-1/OASGP.$(FASLEXT) +strap-1/OAMONS.$(FASLEXT): strap-1/OAMON.$(FASLEXT) strap-1/OCAMON.$(FASLEXT) +strap-1/OCAMON.$(FASLEXT): strap-1/OAMON.$(FASLEXT) +strap-1/OAGROUP.$(FASLEXT): strap-1/OCAMON.$(FASLEXT) \ + strap-1/ABELGRP.$(FASLEXT) +strap-1/ORDRING.$(FASLEXT): strap-1/OAGROUP.$(FASLEXT) \ + strap-1/RING.$(FASLEXT) strap-1/MONOID.$(FASLEXT) +strap-1/OINTDOM.$(FASLEXT): strap-1/ORDRING.$(FASLEXT) \ + strap-1/INTDOM.$(FASLEXT) +strap-1/FIELD.$(FASLEXT): strap-1/EUCDOM.$(FASLEXT) strap-1/UFD.$(FASLEXT) \ + strap-1/DIVRING.$(FASLEXT) +strap-1/DIFFDOM.$(FASLEXT): strap-1/TYPE.$(FASLEXT) +strap-1/DIFFSPC.$(FASLEXT): strap-1/DIFFDOM.$(FASLEXT) +strap-1/DIFRING.$(FASLEXT): strap-1/RING.$(FASLEXT) +strap-1/PDRING.$(FASLEXT): strap-1/RING.$(FASLEXT) strap-1/PDSPC.$(FASLEXT) strap-1/PDSPC.$(FASLEXT): strap-1/PDDOM.$(FASLEXT) - strap-1/DSEXT.$(FASLEXT): strap-1/PDSPC.$(FASLEXT) - strap-1/DIFEXT.$(FASLEXT): strap-1/RING.$(FASLEXT) strap-1/DSEXT.$(FASLEXT) \ strap-1/PDRING.$(FASLEXT) - strap-1/FLINEXP.$(FASLEXT): strap-1/LINEXP.$(FASLEXT) strap-1/PATAB.$(FASLEXT): strap-1/KONVERT.$(FASLEXT) strap-1/FPATMAB.$(FASLEXT): strap-1/PATAB.$(FASLEXT) @@ -318,8 +383,8 @@ strap-1/HYPCAT.$(FASLEXT): strap-1/ELEMFUN.$(FASLEXT) strap-1/TRANFUN.$(FASLEXT): strap-1/TRIGCAT.$(FASLEXT) \ strap-1/ATRIG.$(FASLEXT) strap-1/HYPCAT.$(FASLEXT) \ strap-1/AHYP.$(FASLEXT) +strap-1/INS.$(FASLEXT): strap-1/DFLOAT.$(FASLEXT) strap-1/DFLOAT.$(FASLEXT): strap-1/FPS.$(FASLEXT) strap-1/TRANFUN.$(FASLEXT) - strap-1/SEXCAT.$(FASLEXT): strap-1/KVTFROM.$(FASLEXT) strap-1/POLYCAT.$(FASLEXT): strap-1/SEXCAT.$(FASLEXT) strap-1/QFCAT.$(FASLEXT): strap-1/FEVALAB.$(FASLEXT) \ @@ -327,14 +392,9 @@ strap-1/QFCAT.$(FASLEXT): strap-1/FEVALAB.$(FASLEXT) \ strap-1/FLINEXP.$(FASLEXT) strap-1/FPATMAB.$(FASLEXT) \ strap-1/CHARNZ.$(FASLEXT) strap-1/PFECAT.$(FASLEXT) \ strap-1/DFLOAT.$(FASLEXT) - -strap-1/DIVRING.$(FASLEXT): strap-1/QFCAT.$(FASLEXT) - -strap-1/FIELD.$(FASLEXT): strap-1/EUCDOM.$(FASLEXT) \ - strap-1/EUCDOM.$(FASLEXT) strap-1/DIVRING.$(FASLEXT) - +strap-1/DIVRING.$(FASLEXT): strap-1/ENTIRER.$(FASLEXT) \ + strap-1/ALGEBRA.$(FASLEXT) strap-1/INTDOM.$(FASLEXT): strap-1/FIELD.$(FASLEXT) - strap-1/A1AGG.$(FASLEXT): strap-1/BOOLE.$(FASLEXT) strap-1/DIOPS.$(FASLEXT): strap-1/BGAGG.$(FASLEXT) \ strap-1/CLAGG.$(FASLEXT) strap-1/CHAR.$(FASLEXT) @@ -351,21 +411,49 @@ strap-1/VECTOR.$(FASLEXT): strap-1/LIST.$(FASLEXT) ## Bootstrap stage 2 dependencies. +## At this stage we recompile everything from stage 1, including +## a few more domains. +## We compile integers domains first so that they can be properly +## inlined. +strap-2/SINT.$(FASLEXT): strap-2/INT.$(FASLEXT) +strap-2/NNI.$(FASLEXT): strap-2/INT.$(FASLEXT) +strap-2/PI.$(FASLEXT): strap-2/NNI.$(FASLEXT) +strap-2/BOOLEAN.$(FASLEXT): strap-2/SINT.$(FASLEXT) +strap-2/ISTRING.$(FASLEXT): strap-2/INT.$(FASLEXT) +strap-2/CHAR.$(FASLEXT): strap-2/PI.$(FASLEXT) +strap-2/STRING.$(FASLEXT): strap-2/CHAR.$(FASLEXT) strap-2/ISTRING.$(FASLEXT) +strap-2/LIST.$(FASLEXT): strap-2/ILIST.$(FASLEXT) strap-2/STRING.$(FASLEXT) +strap-2/PRIMARR.$(FASLEXT): strap-2/INT.$(FASLEXT) +strap-2/IARRAY1.$(FASLEXT): strap-2/PRIMARR.$(FASLEXT) +strap-2/IVECTOR.$(FASLEXT): strap-2/IARRAY1.$(FASLEXT) +strap-2/VECTOR.$(FASLEXT): strap-2/IVECTOR.$(FASLEXT) strap-2/LIST.$(FASLEXT) +strap-2/SYMBOL.$(FASLEXT): strap-2/STRING.$(FASLEXT) +strap-2/DFLOAT.$(FASLEXT): strap-2/INT.$(FASLEXT) + +strap-2/BASTYPE.$(FASLEXT): strap-2/BOOLEAN.$(FASLEXT) +strap-2/SETCAT.$(FASLEXT): strap-2/BASTYPE.$(FASLEXT) strap-2/KOERCE.$(FASLEXT) +strap-2/KOERCE.$(FASLEXT): strap-2/TYPE.$(FASLEXT) +strap-2/KONVERT.$(FASLEXT): strap-2/TYPE.$(FASLEXT) +strap-2/RETRACT.$(FASLEXT): strap-2/KRCFROM.$(FASLEXT) +strap-2/FRETRCT.$(FASLEXT): strap-2/RETRACT.$(FASLEXT) +strap-2/FINITE.$(FASLEXT): strap-2/SETCAT.$(FASLEXT) +strap-2/ORDTYPE.$(FASLEXT): strap-2/BASTYPE.$(FASLEXT) +strap-2/ORDSET.$(FASLEXT): strap-2/SETCAT.$(FASLEXT) strap-2/ORDTYPE.$(FASLEXT) +strap-2/ORDFIN.$(FASLEXT): strap-2/ORDSET.$(FASLEXT) strap-2/FINITE.$(FASLEXT) +strap-2/LOGIC.$(FASLEXT): strap-2/TYPE.$(FASLEXT) +strap-2/BOOLE.$(FASLEXT): strap-2/LOGIC.$(FASLEXT) +strap-2/PROPLOG.$(FASLEXT): strap-2/SETCAT.$(FASLEXT) strap-2/BOOLE.$(FASLEXT) strap-2/PID.$(FASLEXT): strap-2/GCDDOM.$(FASLEXT) strap-2/EUCDOM.$(FASLEXT): strap-2/PID.$(FASLEXT) - strap-2/PDSPC.$(FASLEXT): strap-2/PDDOM.$(FASLEXT) - strap-2/DSEXT.$(FASLEXT): strap-2/PDSPC.$(FASLEXT) - strap-2/DIFEXT.$(FASLEXT): strap-2/RING.$(FASLEXT) strap-2/DSEXT.$(FASLEXT) \ strap-2/PDRING.$(FASLEXT) - strap-2/FLINEXP.$(FASLEXT): strap-2/LINEXP.$(FASLEXT) strap-2/PATAB.$(FASLEXT): strap-2/KONVERT.$(FASLEXT) strap-2/FPATMAB.$(FASLEXT): strap-2/PATAB.$(FASLEXT) strap-2/CHARNZ.$(FASLEXT): strap-2/RING.$(FASLEXT) -strap-2/FPS.$(FASLEXT): strap-1/FIELD.$(FASLEXT) strap-2/ORDRING.$(FASLEXT) \ +strap-2/FPS.$(FASLEXT): strap-2/FIELD.$(FASLEXT) strap-2/ORDRING.$(FASLEXT) \ strap-2/REAL.$(FASLEXT) strap-2/RETRACT.$(FASLEXT) \ strap-2/CHARZ.$(FASLEXT) strap-2/FPS.$(FASLEXT): strap-2/RNS.$(FASLEXT) @@ -373,11 +461,6 @@ strap-2/HYPCAT.$(FASLEXT): strap-2/ELEMFUN.$(FASLEXT) strap-2/TRANFUN.$(FASLEXT): strap-2/TRIGCAT.$(FASLEXT) \ strap-2/ATRIG.$(FASLEXT) strap-2/HYPCAT.$(FASLEXT) \ strap-2/AHYP.$(FASLEXT) -strap-2/DFLOAT.$(FASLEXT): strap-2/FPS.$(FASLEXT) strap-2/TRANFUN.$(FASLEXT) - -strap-2/PRIMARR.$(FASLEXT): strap-2/A1AGG.$(FASLEXT) -strap-2/IARRAY1.$(FASLEXT): strap-2/PRIMARR.$(FASLEXT) -strap-2/IVECTOR.$(FASLEXT): strap-2/IARRAY1.$(FASLEXT) strap-2/PFECAT.$(FASLEXT): strap-2/IVECTOR.$(FASLEXT) strap-2/SEXCAT.$(FASLEXT): strap-2/KVTFROM.$(FASLEXT) strap-2/POLYCAT.$(FASLEXT): strap-2/SEXCAT.$(FASLEXT) @@ -386,30 +469,15 @@ strap-2/QFCAT.$(FASLEXT): strap-2/FEVALAB.$(FASLEXT) \ strap-2/FLINEXP.$(FASLEXT) strap-2/FPATMAB.$(FASLEXT) \ strap-2/CHARNZ.$(FASLEXT) strap-2/PFECAT.$(FASLEXT) \ strap-2/DFLOAT.$(FASLEXT) - strap-2/DIVRING.$(FASLEXT): strap-2/QFCAT.$(FASLEXT) - strap-2/FIELD.$(FASLEXT): strap-2/EUCDOM.$(FASLEXT) \ strap-2/EUCDOM.$(FASLEXT) strap-2/DIVRING.$(FASLEXT) - strap-2/INTDOM.$(FASLEXT): strap-2/FIELD.$(FASLEXT) - strap-2/A1AGG.$(FASLEXT): strap-2/BOOLE.$(FASLEXT) strap-2/DIOPS.$(FASLEXT): strap-2/BGAGG.$(FASLEXT) \ strap-2/CLAGG.$(FASLEXT) strap-2/CHAR.$(FASLEXT) strap-2/DIAGG.$(FASLEXT): strap-2/DIOPS.$(FASLEXT) strap-2/FSAGG.$(FASLEXT): strap-2/DIAGG.$(FASLEXT) -strap-2/CHAR.$(FASLEXT): strap-2/FSAGG.$(FASLEXT) -strap-2/STRING.$(FASLEXT): strap-2/SRAGG.$(FASLEXT) strap-2/CHAR.$(FASLEXT) \ - strap-2/ISTRING.$(FASLEXT) -strap-2/INT.$(FASLEXT): strap-2/STRING.$(FASLEXT) -strap-2/SINT.$(FASLEXT): strap-2/INT.$(FASLEXT) strap-2/ORDFIN.$(FASLEXT) \ - strap-2/BOOLE.$(FASLEXT) -strap-2/LIST.$(FASLEXT): strap-2/ILIST.$(FASLEXT) strap-2/STRING.$(FASLEXT) -strap-2/VECTOR.$(FASLEXT): strap-2/LIST.$(FASLEXT) -strap-2/SYMBOL.$(FASLEXT): strap-2/ORDSET.$(FASLEXT) \ - strap-2/KONVERT.$(FASLEXT) strap-2/OM.$(FASLEXT) \ - strap-2/PATAB.$(FASLEXT) strap-0/.started: @@ -417,7 +485,7 @@ strap-0/.started: strap-0/.finished: $(oa_strap_0_fasls) rm -f $@ - rm -rf $(addprefix .NRLIB,$(oa_strap_0_sources)) + rm -rf $(addsuffix .NRLIB,$(oa_strap_0_sources)) $(TOUCH) $@ strap-1/.started: strap-0/.finished @@ -425,7 +493,8 @@ strap-1/.started: strap-0/.finished strap-1/.finished: $(oa_strap_1_fasls) rm -f $@ - rm -rf $(addprefix .NRLIB,$(oa_strap_1_sources)) + rm -rf $(addsuffix .NRLIB,$(oa_strap_1_sources)) \ + $(addsuffix -.NRLIB,$(oa_strap_1_sources)) $(TOUCH) $@ strap-2/.started: $(oa_strap_1_fasls) @@ -433,7 +502,8 @@ strap-2/.started: $(oa_strap_1_fasls) strap-2/.finished: $(oa_strap_2_fasls) rm -f $@ - rm -rf $(addprefix .NRLIB,$(oa_strap_2_sources)) + rm -rf $(addsuffix .NRLIB,$(oa_strap_2_sources)) \ + $(addsuffix -.NRLIB,$(oa_strap_2_sources)) $(TOUCH) $@ strap-0/%.$(FASLEXT): %.spad strap-0/.started @@ -1612,7 +1682,7 @@ $(axiom_algebra_layer_user_objects): bootstrap-stamp .PHONY: all-algstrap all-algstrap: strap-stamp -strap-stamp: $(oa_strap_2_fasls) +strap-stamp: strap-2/.finished @ rm -f strap-stamp @ $(STAMP) strap-stamp @ echo ===================================== diff --git a/src/algebra/catdef.spad.pamphlet b/src/algebra/catdef.spad.pamphlet index d5992ab2..f4447776 100644 --- a/src/algebra/catdef.spad.pamphlet +++ b/src/algebra/catdef.spad.pamphlet @@ -683,7 +683,6 @@ DivisionRing(): Category == ++ Axioms: ++ \spad{ab=0 => a=0 or b=0} -- known as noZeroDivisors ++ \spad{not(1=0)} ---EntireRing():Category == Join(Ring,BiModule(%:Ring,%:Ring)) with EntireRing():Category == Join(Ring,BiModule(%,%)) with noZeroDivisors ++ if a product is zero then one of the factors ++ must be zero. |