aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/algebra/Makefile.in160
-rw-r--r--src/algebra/catdef.spad.pamphlet1
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.