▁=> ▁P ▁zero ▁-> ▁▁▁▁▁▁▁▁▁ ▁( all ▁n ▁: ▁Nat ▁=> ▁P ▁n ▁-> ▁P ▁( s uc ▁n )) ▁-> ▁▁▁▁▁▁▁▁▁ ▁all ▁n ▁: ▁Nat ▁=> ▁P ▁n ▁Nat Ind ▁P ▁m z ▁ms ▁zero ▁=> ▁m z ▁Nat Ind ▁P ▁m z ▁ms ▁( s uc ▁n ) ▁=> ▁ms ▁n ▁( N at Ind ▁P ▁m z ▁ms ▁n ) ▁ ▁Add ition ▁▁ ▁... And ▁in ▁ASCII : ▁plus ▁x ▁y ▁<= ▁rec ▁x ▁{ ▁▁ ▁plus ▁x ▁y ▁<= ▁case ▁x ▁{ ▁▁▁▁ ▁plus ▁zero ▁y ▁=> ▁y ▁▁▁▁ ▁plus ▁( s uc ▁x ) ▁y ▁=> ▁suc ▁( plus ▁x ▁y ) ▁▁ ▁} ▁} ▁ ▁Dep endent ▁types ▁ ▁Ep ig ram ▁is ▁essentially ▁a ▁typed ▁lambda ▁calculus ▁with ▁generalized ▁algebraic ▁data ▁type ▁extensions , ▁except ▁for ▁two ▁extensions . ▁First , ▁types ▁are ▁first - class ▁entities , ▁of ▁type ▁; ▁types ▁are ▁arbitrary ▁expressions ▁of ▁type ▁, ▁and ▁type ▁equivalence ▁is ▁defined ▁in ▁terms ▁of ▁the ▁types ' ▁normal ▁forms . ▁Second , ▁it ▁has ▁a ▁dependent ▁function ▁type ; ▁instead ▁of ▁, ▁, ▁where ▁ ▁is ▁bound ▁in ▁ ▁to ▁the ▁value ▁that ▁the ▁function ' s ▁argument ▁( of ▁type ▁) ▁eventually ▁takes . ▁ ▁Full ▁dependent ▁types , ▁as ▁implemented ▁in ▁Ep ig ram , ▁are ▁a ▁powerful ▁abstra ction . ▁( Un like ▁in ▁Dep endent ▁ML , ▁the ▁value ( s ) ▁dep ended ▁upon ▁may ▁be ▁of ▁any ▁valid ▁type .) ▁A ▁sample ▁of ▁the ▁new ▁formal ▁specification