\documentclass[12pt,titlepage]{article} \usepackage{amsmath} \usepackage{mathrsfs} \usepackage{amsfonts} \usepackage{amssymb} \usepackage{amsthm} \usepackage{mathtools} \usepackage{graphicx} \usepackage{color} \usepackage{ucs} \usepackage[utf8x]{inputenc} \usepackage{xparse} \usepackage{hyperref} %----Macros---------- % % Unresolved issues: % % \righttoleftarrow % \lefttorightarrow % % \color{} with HTML colorspec % \bgcolor % \array with options (without options, it's equivalent to the matrix environment) % Of the standard HTML named colors, white, black, red, green, blue and yellow % are predefined in the color package. Here are the rest. \definecolor{aqua}{rgb}{0, 1.0, 1.0} \definecolor{fuschia}{rgb}{1.0, 0, 1.0} \definecolor{gray}{rgb}{0.502, 0.502, 0.502} \definecolor{lime}{rgb}{0, 1.0, 0} \definecolor{maroon}{rgb}{0.502, 0, 0} \definecolor{navy}{rgb}{0, 0, 0.502} \definecolor{olive}{rgb}{0.502, 0.502, 0} \definecolor{purple}{rgb}{0.502, 0, 0.502} \definecolor{silver}{rgb}{0.753, 0.753, 0.753} \definecolor{teal}{rgb}{0, 0.502, 0.502} % Because of conflicts, \space and \mathop are converted to % \itexspace and \operatorname during preprocessing. % itex: \space{ht}{dp}{wd} % % Height and baseline depth measurements are in units of tenths of an ex while % the width is measured in tenths of an em. \makeatletter \newdimen\itex@wd% \newdimen\itex@dp% \newdimen\itex@thd% \def\itexspace#1#2#3{\itex@wd=#3em% \itex@wd=0.1\itex@wd% \itex@dp=#2ex% \itex@dp=0.1\itex@dp% \itex@thd=#1ex% \itex@thd=0.1\itex@thd% \advance\itex@thd\the\itex@dp% \makebox[\the\itex@wd]{\rule[-\the\itex@dp]{0cm}{\the\itex@thd}}} \makeatother % \tensor and \multiscript \makeatletter \newif\if@sup \newtoks\@sups \def\append@sup#1{\edef\act{\noexpand\@sups={\the\@sups #1}}\act}% \def\reset@sup{\@supfalse\@sups={}}% \def\mk@scripts#1#2{\if #2/ \if@sup ^{\the\@sups}\fi \else% \ifx #1_ \if@sup ^{\the\@sups}\reset@sup \fi {}_{#2}% \else \append@sup#2 \@suptrue \fi% \expandafter\mk@scripts\fi} \def\tensor#1#2{\reset@sup#1\mk@scripts#2_/} \def\multiscripts#1#2#3{\reset@sup{}\mk@scripts#1_/#2% \reset@sup\mk@scripts#3_/} \makeatother % \slash \makeatletter \newbox\slashbox \setbox\slashbox=\hbox{$/$} \def\itex@pslash#1{\setbox\@tempboxa=\hbox{$#1$} \@tempdima=0.5\wd\slashbox \advance\@tempdima 0.5\wd\@tempboxa \copy\slashbox \kern-\@tempdima \box\@tempboxa} \def\slash{\protect\itex@pslash} \makeatother % math-mode versions of \rlap, etc % from Alexander Perlis, "A complement to \smash, \llap, and lap" % http://math.arizona.edu/~aprl/publications/mathclap/ \def\clap#1{\hbox to 0pt{\hss#1\hss}} \def\mathllap{\mathpalette\mathllapinternal} \def\mathrlap{\mathpalette\mathrlapinternal} \def\mathclap{\mathpalette\mathclapinternal} \def\mathllapinternal#1#2{\llap{$\mathsurround=0pt#1{#2}$}} \def\mathrlapinternal#1#2{\rlap{$\mathsurround=0pt#1{#2}$}} \def\mathclapinternal#1#2{\clap{$\mathsurround=0pt#1{#2}$}} % Renames \sqrt as \oldsqrt and redefine root to result in \sqrt[#1]{#2} \let\oldroot\root \def\root#1#2{\oldroot #1 \of{#2}} \renewcommand{\sqrt}[2][]{\oldroot #1 \of{#2}} % Manually declare the txfonts symbolsC font \DeclareSymbolFont{symbolsC}{U}{txsyc}{m}{n} \SetSymbolFont{symbolsC}{bold}{U}{txsyc}{bx}{n} \DeclareFontSubstitution{U}{txsyc}{m}{n} % Manually declare the stmaryrd font \DeclareSymbolFont{stmry}{U}{stmry}{m}{n} \SetSymbolFont{stmry}{bold}{U}{stmry}{b}{n} % Manually declare the MnSymbolE font \DeclareFontFamily{OMX}{MnSymbolE}{} \DeclareSymbolFont{mnomx}{OMX}{MnSymbolE}{m}{n} \SetSymbolFont{mnomx}{bold}{OMX}{MnSymbolE}{b}{n} \DeclareFontShape{OMX}{MnSymbolE}{m}{n}{ <-6> MnSymbolE5 <6-7> MnSymbolE6 <7-8> MnSymbolE7 <8-9> MnSymbolE8 <9-10> MnSymbolE9 <10-12> MnSymbolE10 <12-> MnSymbolE12}{} % Declare specific arrows from txfonts without loading the full package \makeatletter \def\re@DeclareMathSymbol#1#2#3#4{% \let#1=\undefined \DeclareMathSymbol{#1}{#2}{#3}{#4}} \re@DeclareMathSymbol{\neArrow}{\mathrel}{symbolsC}{116} \re@DeclareMathSymbol{\neArr}{\mathrel}{symbolsC}{116} \re@DeclareMathSymbol{\seArrow}{\mathrel}{symbolsC}{117} \re@DeclareMathSymbol{\seArr}{\mathrel}{symbolsC}{117} \re@DeclareMathSymbol{\nwArrow}{\mathrel}{symbolsC}{118} \re@DeclareMathSymbol{\nwArr}{\mathrel}{symbolsC}{118} \re@DeclareMathSymbol{\swArrow}{\mathrel}{symbolsC}{119} \re@DeclareMathSymbol{\swArr}{\mathrel}{symbolsC}{119} \re@DeclareMathSymbol{\nequiv}{\mathrel}{symbolsC}{46} \re@DeclareMathSymbol{\Perp}{\mathrel}{symbolsC}{121} \re@DeclareMathSymbol{\Vbar}{\mathrel}{symbolsC}{121} \re@DeclareMathSymbol{\sslash}{\mathrel}{stmry}{12} \re@DeclareMathSymbol{\bigsqcap}{\mathop}{stmry}{"64} \re@DeclareMathSymbol{\biginterleave}{\mathop}{stmry}{"6} \re@DeclareMathSymbol{\invamp}{\mathrel}{symbolsC}{77} \re@DeclareMathSymbol{\parr}{\mathrel}{symbolsC}{77} \makeatother % \llangle, \rrangle, \lmoustache and \rmoustache from MnSymbolE \makeatletter \def\Decl@Mn@Delim#1#2#3#4{% \if\relax\noexpand#1% \let#1\undefined \fi \DeclareMathDelimiter{#1}{#2}{#3}{#4}{#3}{#4}} \def\Decl@Mn@Open#1#2#3{\Decl@Mn@Delim{#1}{\mathopen}{#2}{#3}} \def\Decl@Mn@Close#1#2#3{\Decl@Mn@Delim{#1}{\mathclose}{#2}{#3}} \Decl@Mn@Open{\llangle}{mnomx}{'164} \Decl@Mn@Close{\rrangle}{mnomx}{'171} \Decl@Mn@Open{\lmoustache}{mnomx}{'245} \Decl@Mn@Close{\rmoustache}{mnomx}{'244} \makeatother % Widecheck \makeatletter \DeclareRobustCommand\widecheck[1]{{\mathpalette\@widecheck{#1}}} \def\@widecheck#1#2{% \setbox\z@\hbox{\m@th$#1#2$}% \setbox\tw@\hbox{\m@th$#1% \widehat{% \vrule\@width\z@\@height\ht\z@ \vrule\@height\z@\@width\wd\z@}$}% \dp\tw@-\ht\z@ \@tempdima\ht\z@ \advance\@tempdima2\ht\tw@ \divide\@tempdima\thr@@ \setbox\tw@\hbox{% \raise\@tempdima\hbox{\scalebox{1}[-1]{\lower\@tempdima\box \tw@}}}% {\ooalign{\box\tw@ \cr \box\z@}}} \makeatother % \mathraisebox{voffset}[height][depth]{something} \makeatletter \NewDocumentCommand\mathraisebox{moom}{% \IfNoValueTF{#2}{\def\@temp##1##2{\raisebox{#1}{$\m@th##1##2$}}}{% \IfNoValueTF{#3}{\def\@temp##1##2{\raisebox{#1}[#2]{$\m@th##1##2$}}% }{\def\@temp##1##2{\raisebox{#1}[#2][#3]{$\m@th##1##2$}}}}% \mathpalette\@temp{#4}} \makeatletter % udots (taken from yhmath) \makeatletter \def\udots{\mathinner{\mkern2mu\raise\p@\hbox{.} \mkern2mu\raise4\p@\hbox{.}\mkern1mu \raise7\p@\vbox{\kern7\p@\hbox{.}}\mkern1mu}} \makeatother %% Fix array \newcommand{\itexarray}[1]{\begin{matrix}#1\end{matrix}} %% \itexnum is a noop \newcommand{\itexnum}[1]{#1} %% Renaming existing commands \newcommand{\underoverset}[3]{\underset{#1}{\overset{#2}{#3}}} \newcommand{\widevec}{\overrightarrow} \newcommand{\darr}{\downarrow} \newcommand{\nearr}{\nearrow} \newcommand{\nwarr}{\nwarrow} \newcommand{\searr}{\searrow} \newcommand{\swarr}{\swarrow} \newcommand{\curvearrowbotright}{\curvearrowright} \newcommand{\uparr}{\uparrow} \newcommand{\downuparrow}{\updownarrow} \newcommand{\duparr}{\updownarrow} \newcommand{\updarr}{\updownarrow} \newcommand{\gt}{>} \newcommand{\lt}{<} \newcommand{\map}{\mapsto} \newcommand{\embedsin}{\hookrightarrow} \newcommand{\Alpha}{A} \newcommand{\Beta}{B} \newcommand{\Zeta}{Z} \newcommand{\Eta}{H} \newcommand{\Iota}{I} \newcommand{\Kappa}{K} \newcommand{\Mu}{M} \newcommand{\Nu}{N} \newcommand{\Rho}{P} \newcommand{\Tau}{T} \newcommand{\Upsi}{\Upsilon} \newcommand{\omicron}{o} \newcommand{\lang}{\langle} \newcommand{\rang}{\rangle} \newcommand{\Union}{\bigcup} \newcommand{\Intersection}{\bigcap} \newcommand{\Oplus}{\bigoplus} \newcommand{\Otimes}{\bigotimes} \newcommand{\Wedge}{\bigwedge} \newcommand{\Vee}{\bigvee} \newcommand{\coproduct}{\coprod} \newcommand{\product}{\prod} \newcommand{\closure}{\overline} \newcommand{\integral}{\int} \newcommand{\doubleintegral}{\iint} \newcommand{\tripleintegral}{\iiint} \newcommand{\quadrupleintegral}{\iiiint} \newcommand{\conint}{\oint} \newcommand{\contourintegral}{\oint} \newcommand{\infinity}{\infty} \newcommand{\bottom}{\bot} \newcommand{\minusb}{\boxminus} \newcommand{\plusb}{\boxplus} \newcommand{\timesb}{\boxtimes} \newcommand{\intersection}{\cap} \newcommand{\union}{\cup} \newcommand{\Del}{\nabla} \newcommand{\odash}{\circleddash} \newcommand{\negspace}{\!} \newcommand{\widebar}{\overline} \newcommand{\textsize}{\normalsize} \renewcommand{\scriptsize}{\scriptstyle} \newcommand{\scriptscriptsize}{\scriptscriptstyle} \newcommand{\mathfr}{\mathfrak} \newcommand{\statusline}[2]{#2} \newcommand{\tooltip}[2]{#2} \newcommand{\toggle}[2]{#2} % Theorem Environments \theoremstyle{plain} \newtheorem{theorem}{Theorem} \newtheorem{lemma}{Lemma} \newtheorem{prop}{Proposition} \newtheorem{cor}{Corollary} \newtheorem*{utheorem}{Theorem} \newtheorem*{ulemma}{Lemma} \newtheorem*{uprop}{Proposition} \newtheorem*{ucor}{Corollary} \theoremstyle{definition} \newtheorem{defn}{Definition} \newtheorem{example}{Example} \newtheorem*{udefn}{Definition} \newtheorem*{uexample}{Example} \theoremstyle{remark} \newtheorem{remark}{Remark} \newtheorem{note}{Note} \newtheorem*{uremark}{Remark} \newtheorem*{unote}{Note} %------------------------------------------------------------------- \begin{document} %------------------------------------------------------------------- \section*{product type} \hypertarget{context}{}\subsubsection*{{Context}}\label{context} \hypertarget{type_theory}{}\paragraph*{{Type theory}}\label{type_theory} [[!include type theory - contents]] \hypertarget{contents}{}\section*{{Contents}}\label{contents} \noindent\hyperlink{idea}{Idea}\dotfill \pageref*{idea} \linebreak \noindent\hyperlink{overview}{Overview}\dotfill \pageref*{overview} \linebreak \noindent\hyperlink{definition}{Definition}\dotfill \pageref*{definition} \linebreak \noindent\hyperlink{as_a_negative_type}{As a negative type}\dotfill \pageref*{as_a_negative_type} \linebreak \noindent\hyperlink{as_a_positive_type}{As a positive type}\dotfill \pageref*{as_a_positive_type} \linebreak \noindent\hyperlink{positive_versus_negative}{Positive versus negative}\dotfill \pageref*{positive_versus_negative} \linebreak \noindent\hyperlink{categorical_interpretation}{Categorical interpretation}\dotfill \pageref*{categorical_interpretation} \linebreak \noindent\hyperlink{related_concepts}{Related concepts}\dotfill \pageref*{related_concepts} \linebreak \noindent\hyperlink{references}{References}\dotfill \pageref*{references} \linebreak \hypertarget{idea}{}\subsection*{{Idea}}\label{idea} In [[type theory]] a \emph{product type} of two [[types]] $A$ and $B$ is the type whose [[terms]] are [[ordered pairs]] $(a,b)$ with $a\colon A$ and $b\colon B$. In a [[model]] of the type theory in [[categorical semantics]], this is a [[product]]. In [[set theory]], it is a [[cartesian product]]. In [[dependent type theory]], it is a special case of a [[dependent sum]]. Note that a [[dependent product type]] is something different (a generalization of a [[function type]]). \hypertarget{overview}{}\subsection*{{Overview}}\label{overview} [[!include product natural deduction - table]] \hypertarget{definition}{}\subsection*{{Definition}}\label{definition} Like any type constructor in [[type theory]] (see at [[natural deduction]]), a product type is specified by rules saying when we can introduce it as a type, how to construct terms of that type, how to use or ``eliminate'' terms of that type, and how to compute when we combine the constructors with the eliminators. There are actually two ways to present product types, as a [[negative type]] or as a [[positive type]]. In both cases the [[type formation rule]] is the following: \begin{displaymath} \frac{A\colon Type \qquad B\colon Type}{A\times B\colon Type} \end{displaymath} but the constructors and eliminators may be different. \hypertarget{as_a_negative_type}{}\subsubsection*{{As a negative type}}\label{as_a_negative_type} When presented negatively, primacy is given to the [[term elimination rule|eliminators]]. We specify that there are two ways to eliminate a term of type $A\times B$: by projecting out the first component, or by projecting out the second. \begin{displaymath} \frac{p \colon A\times B}{\pi_1 p\colon A} \qquad \frac{p\colon A\times B}{\pi_2 p\colon B} \end{displaymath} This then determines the form of the [[term introduction rule|constructors]]: in order to construct a term of type $A\times B$, we have to specify what value that term should yield when all the eliminators are applied to it. In other words, we have to specify a pair of elements, one of $A$ (to be the value of $\pi_1 p$) and one of $B$ (to be the value of $\pi_2 p$). \begin{displaymath} \frac{a\colon A \qquad b\colon B}{(a,b)\colon A\times B} \end{displaymath} Finally, we have [[computation rules]] which say that the relationship between the constructors and the eliminators is as we hoped. We always have [[beta reduction]] rules \begin{displaymath} \pi_1(a,b) \to_\beta a \qquad \pi_2(a,b) \to_\beta b \end{displaymath} and we may or may not choose to have an [[eta reduction]] rule \begin{displaymath} (\pi_1 p, \pi_2 p) \to_\eta p \end{displaymath} \hypertarget{as_a_positive_type}{}\subsubsection*{{As a positive type}}\label{as_a_positive_type} When presented positively, primacy is given to the constructors. We specify that the way to construct something of type $A\times B$ is to give something of type $A$ and something of type $B$: \begin{displaymath} \frac{a\colon A \qquad b\colon B}{(a,b)\colon A\times B} \end{displaymath} Of course, this is the same as the constructor obtained from the negative presentation. However, the eliminator is different. Now, in order to say how to \emph{use} something of type $A\times B$, we have to specify how we should behave for all possible ways that it could have been constructed. In other words, we have to say, \emph{assuming} that $p$ were of the form $(a,b)$, what we want to do. Thus we end up with the following rule: \begin{displaymath} \frac{p\colon A\times B \qquad x\colon A, y\colon B \vdash c\colon C}{let (x,y) = p in c \;\colon C} \end{displaymath} We need a term $c$ in the context of two variables of types $A$ and $B$, and the destructor or match ``binds those variables'' to the two components of $p$. Note that the ``ordered pair'' $(x,y)$ in the destructor is just a part of the syntax; it is not an instance of the \emph{constructor} ordered pair. In [[dependent type theory]], this elimination rule must be generalized to allow the type $C$ to depend on $A\times B$. Now we have [[beta reduction]] rule: \begin{displaymath} let (x,y) = (a,b) \,in c \;\to_\beta\; c[a/x, b/y] \end{displaymath} In other words, if we build an ordered pair and then break it apart, what we get is just the things we put into it. (The notation $c[a/x, b/y]$ means to substitute $a$ for $x$ and $b$ for $y$ in the term $c$). And (if we wish) the [[eta reduction]] rule, which is a little more subtle: \begin{displaymath} let (x,y) = p in c[(x,y)/z] \;\to_\eta\; c[p/z] \end{displaymath} This says that if we break something of type $A\times B$ into its components, but then we only use those two components by way of putting them back together into an ordered pair, then we might as well just not have broken it down in the first place. Positively defined products are naturally expressed as [[inductive types]]. For instance, in [[Coq]] syntax we have \begin{verbatim}Inductive prod (A B:Type) : Type := | pair : A -> B -> prod A B.\end{verbatim} (Coq then implements beta-reduction, but not eta-reduction. However, eta-equivalence is provable with the internally defined [[identity type]], using the dependent eliminator mentioned above.) Arguably, negatively defined products should be naturally expressed as [[coinductive type]]s, but this is not exactly the case for the presentation of coinductive types used in Coq. \hypertarget{positive_versus_negative}{}\subsubsection*{{Positive versus negative}}\label{positive_versus_negative} In ordinary ``nonlinear'' type theory, the positive and negative product types are equivalent. They manifestly have the same constructor, while we can define the eliminators in terms of each other as follows: \begin{displaymath} \begin{aligned} \pi_1 p &\;\coloneqq\; let (x,y) = p in x\\ \pi_2 p &\;\coloneqq\; let (x,y) = p in y\\ let (x,y) = p in c &\;\coloneqq\; c[\pi_1 p / x, \pi_2 p / y] \end{aligned} \end{displaymath} It is obvious that the $\beta$-reduction rules in the two cases correspond; see below for $\eta$-conversion. In dependent type theory, in order to recover the \emph{dependent} eliminator for the positive product type from the eliminators for the negative product type, we need the latter to satisfy the $\eta$-conversion rule so as to make the above definition well-typed. It is sufficient to have the $\eta$-conversion up to [[propositional equality]], however, if we are willing to insert a substitution along such an equality in the definition of the dependent eliminator. Conversely, the dependent eliminator for the positive product allows us to prove a propositional version of the negative $\eta$-conversion (without assuming the positive $\eta$-conversion). See \href{/nlab/show/eta-conversion#Propositional}{propositional eta-conversions}. Now from $\eta$-conversion for the negative product, we can also derive \begin{displaymath} \begin{aligned} let (x,y) = p in c[(x,y)/z] &\;\coloneqq\; c[(\pi_1 p,\pi_2 p)/z]\\ &\;\to_\eta\; c[p/z] \end{aligned} \end{displaymath} so the defined positive product also satisfies its $\eta$-conversion, which will be definitional or propositional according to that of the negative product. On the other hand, if the positive product has a definitional $\eta$-conversion, then for the defined negative product we have \begin{displaymath} \begin{aligned} (\pi_1 p, \pi_2 p) &\;\coloneqq\; (let (x,y) = p in x, let (x,y) = p in y)\\ &\;\leftarrow_\eta\; (let (x',y') = p in \;( let (x,y) = (x',y') in x , let (x,y) = (x',y') in y )\\ &\;\to_\beta\; let (x',y') = p in (x',y')\\ &\;\to_\eta\; p \end{aligned} \end{displaymath} Note that this involves a beta-reduction step and also a ``backwards'' $\eta$-reduction step. So from positive $\eta$ \emph{reduction} we cannot derive negative $\eta$-reduction, only negative $\eta$-equivalence. (However, the directionality of $\eta$-reduction is somewhat questionable anyway.) In conclusion, we have: \begin{itemize}% \item In non-dependent type theory, positive and negative products are equivalent, as are their definitional $\beta$-reduction rules. \item In dependent type theory with [[identity types]], improving the positive eliminator to a \emph{dependent} eliminator is equivalent to asserting \href{/nlab/show/eta-conversion#Propositional}{propositional} versions of either $\eta$-conversion rule. \item In any case, the two \emph{definitional} $\eta$-conversion rules also correspond. \end{itemize} It is of importance to note that these translations require the [[contraction rule]] and the [[weakening rule]]; that is, they duplicate and discard terms. In [[linear logic]] these rules are disallowed, and therefore the positive and negative products become different. The positive product becomes ``tensor'' $A\otimes B$, and the negative product becomes ``with'' $A \& B$. \hypertarget{categorical_interpretation}{}\subsection*{{Categorical interpretation}}\label{categorical_interpretation} Under [[categorical semantics]], product types satisfying both beta and eta conversions correspond to [[products]] in a [[category]]. More precisely: \begin{itemize}% \item categorical products may be used to interpret product types that validate both beta and eta rules, while \item the [[syntactic category]] of a type theory with product types has categorical products, as long as the type theory satisfies both beta and eta rules. \end{itemize} Of course, the categorical notion of product matches the \emph{negative} definition of a product most directly. In linear logic, therefore, the categorical product interprets ``with'' $\&$, while an additional [[monoidal category|monoidal structure]] interprets ``tensor'' $\otimes$. On the other hand, in a representable [[cartesian multicategory]], the product has a ``from the left'' universal property which matches the \emph{positive} definition. \hypertarget{related_concepts}{}\subsection*{{Related concepts}}\label{related_concepts} \begin{itemize}% \item [[sum type]] \item [[dependent sum type]] \item [[dependent product type]] \end{itemize} \hypertarget{references}{}\subsection*{{References}}\label{references} A textbook account in the context of [[programming languages]] is in section 11 of \begin{itemize}% \item [[Robert Harper]], \emph{[[Practical Foundations for Programming Languages]]} \end{itemize} [[!redirects product type]] [[!redirects product types]] \end{document}