############################################################################
#
#	File:     vpredrep.icn
#
#	Subject:  Procedure to produce predecessors of versum number
#
#	Author:   Ralph E. Griswold
#
#	Date:     May 11, 1998
#
############################################################################
#
#  EXPERIMENTAL VERSION
#
#	vpred(i)	generates the "primary" numbers whose reverse sum is
#			i; primary is as defined for versum seeds.
#
#
#	vpred_all(i)	generates all the numbers whose reverse sum is i.
#
#	isversum(i)	checks for versum numbers only; returns i if
#			successful.
#
#  This one uses lists for memory -- and resets the memory with each
#  call of vpred().
#
############################################################################
#
#  Links:  eqvseeds, strings
#
############################################################################

link eqvseeds
link strings

global vpred_done			# table of first predecessors
global nopreds			# no-predecessor record
global limit_			# limit on calls to vpred_()

procedure vpred(s, i)		#: primary predecessors of versum number
   local t, firstp
   static done

   initial done := vpred_init()

   if reject(s) then fail

   limit_ := (\i | 2 ^ 31)			# limit on calls to vpred_()

   vpred_done := copy(done)	# avoid build-up from successive calls

   if s[1] == ("-" | "0") then fail

   every t := vpred_(s, i) do	# i limits depth
      if t[1] ~== "0" then suspend t

end

procedure vpred_(s)
   local t, v, p, i, u
   static count

   initial count := 0

   count +:= 1

   if count > limit_ then {
      write("\n*** exceeded limit on calls to vpred_()")
      exit()
      }

   s := string(s)

   if not(upto('123456789', s)) then return s	# zeros or empty string

   v := vpred_done[s]

   if \v then {
      suspend !v
      fail
      }

   p := case s[1] of {			# select procedure
      "0"     :  vpred_i0
      "1"     :  vpred_i1
      default :  vpred_in
      }

   u := set()

   every t := string(p(s)) do {
      if s[1] == "0" == t[1] == t[-1] then insert(u, t)
      else if (t + reverse(t)) == s then {
         insert(u, t)
         }
#     else write(&errout, "bogon: ", t, " from ", image(p))
      }


   if *u > 0 then {
      u := sort(u)
      suspend !u
      vpred_done[s] := u
      }
   else vpred_done[s] := nopreds			# no-predecessor record

end

procedure reject(s)
   local first, second, last

   first := s[1]
   last := s[-1]

   if first > 1 then {			# "2..." ... "9..."
      if last == (first | (first - 1)) then fail
      else return
      }
   else {					# "1..." and may be bimorphic
      if last == "1" then fail			# "1...1" always possible
      second := s[2]
      case second of {
         "0" :      if last == ("0" | "9") then fail else return
         "1" :      if last == "0" then fail else return
         "2" :      if last == "2" then fail else return
         "9" :      if last == "8" then fail else return
         default :  if last == (second | (second - 1)) then fail else return
         }
      }

end

procedure vpred_i0(s)			# initial 0
   local lzeros, middle

   suspend (s[-1] == "0") & ("0" || vpred_noinc(s[2:-1]) || "0")

end

procedure vpred_i1(s)			# initial 1
   local last, middle, mtail, zmid

   last := s[-1]
   middle := s[2:-1]

   mtail := middle[2:0]

   zmid := right(minus1(mtail), *mtail, "0")	# may fail, leaving zmid null
 
   if last == "0" then suspend {
      ("1" || vpred_noinc(\zmid) || "9") |
      ("1" || vpred_inc("1" || \zmid) || "9") |
      ("1" || vpred_noinc(minus1(middle)) || "9") |
      ("0" || vpred_inc("1" || middle) || last) |
      right(s / 2, *s, "0")
      }

   else if last == "1" then suspend {
      ("1" || vpred_noinc(middle) || "0") |
      ("2" || vpred_noinc(\zmid) || "9") |
      ("2" || vpred_noinc(minus1("1" || mtail)) || "9") |
      ("2" || vpred_inc("1" || \zmid) || "9")
      }

   else suspend {			# last digit > 1
      ((last + 1) || vpred_noinc(\zmid) || "9") |
      ((last + 1) || vpred_noinc(minus1("1" || mtail)) || "9") |
      ((last + 1) || vpred_inc("1" || \zmid) || "9") |
      (last || vpred_inc("1" || mtail) || "0")
      }

end

procedure vpred_in(s)			# initial > 1
   local first, middle, last, t, f, l

   first := s[1]
   middle := s[2:-1]
   last := s[-1]

   if first == last then {
      if first % 2 = 0 then
         suspend (first / 2) || vpred_noinc(middle) || (first / 2)
      else
         suspend ((first / 2) + 1) || vpred_noinc(middle) || (first / 2)
         }

   else if first == (last + 1) then {
      if first % 2 = 0 then
         suspend (first / 2) || vpred_inc("1" || middle) || ((first / 2) - 1)
      else
         suspend (first / 2) || vpred_inc("1" || middle) || (first / 2)
      }

   else fail

end

procedure vpred_inc(s)			# predecessor produces carry
   local t

   suspend 1(t := vpred_(s), *s = (*t + 1))

end

procedure vpred_noinc(s)		# predecessor doesn't produce carry
   local t

   suspend 1(t := vpred_(s), *t = *s)

end

procedure isversum(s)
   local i, strip1, strip2, p, middle, pred, midpred, head

   if s[1] ~== s[-1] then {
      if vpred(s) then return s
      else fail
      }

   i := *s / 2 + 1

   if s == reverse(s) then {		# handle palindromes
      if *s % 2 = 0 then return s
      else if s[i] % 2 = 0 then return s
      else fail
      }

   strip1 := s[1:i]
   strip2 := reverse(s)[1:i]

   strip1 ? {				# look for common substrings
      every head := =strip2[1:(*strip2 + 1) to 1 by -1] do {
         p := *head + 1
         middle := s[p:-p + 1]
         if *middle = 0 then return s
         if middle[1] == "0" then midpred := vpred_(middle) | next
         else midpred := right(vpred(middle), *middle, "0") | next
         pred := strip1[1:p] || midpred || repl("0", p - 1)
         if s == pred + reverse(pred) then return s else next
         }
      }

   if vpred(s) then return s else fail	# if all else fails

end

procedure  vpred_init()
   local tbl

   tbl := table()

   nopreds := []		# common empty list for no predecessors

   tbl["0"] := ["0"]
   tbl["1"] := nopreds
   tbl["2"] := ["1"]
   tbl["3"] := nopreds
   tbl["4"] := ["2"]
   tbl["5"] := nopreds
   tbl["6"] := ["3"]
   tbl["7"] := nopreds
   tbl["8"] := ["4"]
   tbl["9"] := nopreds
   tbl["00"] := ["00"]
   tbl["01"] := nopreds
   tbl["02"] := nopreds
   tbl["03"] := nopreds
   tbl["04"] := nopreds
   tbl["05"] := nopreds
   tbl["06"] := nopreds
   tbl["07"] := nopreds
   tbl["08"] := nopreds
   tbl["09"] := nopreds
   tbl["10"] := ["5"]
   tbl["11"] := ["10"]
   tbl["12"] := ["6"]
   tbl["13"] := nopreds
   tbl["14"] := ["7"]
   tbl["15"] := nopreds
   tbl["16"] := ["8"]
   tbl["17"] := nopreds
   tbl["18"] := ["9"]
   tbl["19"] := nopreds
   tbl["20"] := nopreds
   tbl["21"] := nopreds
   tbl["22"] := ["20"]
   tbl["23"] := nopreds
   tbl["24"] := nopreds
   tbl["25"] := nopreds
   tbl["26"] := nopreds
   tbl["27"] := nopreds
   tbl["28"] := nopreds
   tbl["29"] := nopreds
   tbl["30"] := nopreds
   tbl["31"] := nopreds
   tbl["32"] := nopreds
   tbl["33"] := ["30"]
   tbl["34"] := nopreds
   tbl["35"] := nopreds
   tbl["36"] := nopreds
   tbl["37"] := nopreds
   tbl["38"] := nopreds
   tbl["39"] := nopreds
   tbl["40"] := nopreds
   tbl["41"] := nopreds
   tbl["42"] := nopreds
   tbl["43"] := nopreds
   tbl["44"] := ["40"]
   tbl["45"] := nopreds
   tbl["46"] := nopreds
   tbl["47"] := nopreds
   tbl["48"] := nopreds
   tbl["49"] := nopreds
   tbl["50"] := nopreds
   tbl["51"] := nopreds
   tbl["52"] := nopreds
   tbl["53"] := nopreds
   tbl["54"] := nopreds
   tbl["55"] := ["50"]
   tbl["56"] := nopreds
   tbl["57"] := nopreds
   tbl["58"] := nopreds
   tbl["59"] := nopreds
   tbl["60"] := nopreds
   tbl["61"] := nopreds
   tbl["62"] := nopreds
   tbl["63"] := nopreds
   tbl["64"] := nopreds
   tbl["65"] := nopreds
   tbl["66"] := ["60"]
   tbl["67"] := nopreds
   tbl["68"] := nopreds
   tbl["69"] := nopreds
   tbl["70"] := nopreds
   tbl["71"] := nopreds
   tbl["72"] := nopreds
   tbl["73"] := nopreds
   tbl["74"] := nopreds
   tbl["75"] := nopreds
   tbl["76"] := nopreds
   tbl["77"] := ["70"]
   tbl["78"] := nopreds
   tbl["79"] := nopreds
   tbl["80"] := nopreds
   tbl["81"] := nopreds
   tbl["82"] := nopreds
   tbl["83"] := nopreds
   tbl["84"] := nopreds
   tbl["85"] := nopreds
   tbl["86"] := nopreds
   tbl["87"] := nopreds
   tbl["88"] := ["80"]
   tbl["89"] := nopreds
   tbl["90"] := nopreds
   tbl["91"] := nopreds
   tbl["92"] := nopreds
   tbl["93"] := nopreds
   tbl["94"] := nopreds
   tbl["95"] := nopreds
   tbl["96"] := nopreds
   tbl["97"] := nopreds
   tbl["98"] := nopreds
   tbl["99"] := ["90"]
   tbl["000"] := ["000"]
   tbl["001"] := nopreds
   tbl["002"] := nopreds
   tbl["003"] := nopreds
   tbl["004"] := nopreds
   tbl["005"] := nopreds
   tbl["006"] := nopreds
   tbl["007"] := nopreds
   tbl["008"] := nopreds
   tbl["009"] := nopreds
   tbl["010"] := nopreds
   tbl["011"] := nopreds
   tbl["012"] := nopreds
   tbl["013"] := nopreds
   tbl["014"] := nopreds
   tbl["015"] := nopreds
   tbl["016"] := nopreds
   tbl["017"] := nopreds
   tbl["018"] := nopreds
   tbl["019"] := nopreds
   tbl["020"] := ["010"]
   tbl["021"] := nopreds
   tbl["022"] := nopreds
   tbl["023"] := nopreds
   tbl["024"] := nopreds
   tbl["025"] := nopreds
   tbl["026"] := nopreds
   tbl["027"] := nopreds
   tbl["028"] := nopreds
   tbl["029"] := nopreds
   tbl["030"] := nopreds
   tbl["031"] := nopreds
   tbl["032"] := nopreds
   tbl["033"] := nopreds
   tbl["034"] := nopreds
   tbl["035"] := nopreds
   tbl["036"] := nopreds
   tbl["037"] := nopreds
   tbl["038"] := nopreds
   tbl["039"] := nopreds
   tbl["040"] := ["020"]
   tbl["041"] := nopreds
   tbl["042"] := nopreds
   tbl["043"] := nopreds
   tbl["044"] := nopreds
   tbl["045"] := nopreds
   tbl["046"] := nopreds
   tbl["047"] := nopreds
   tbl["048"] := nopreds
   tbl["049"] := nopreds
   tbl["050"] := nopreds
   tbl["051"] := nopreds
   tbl["052"] := nopreds
   tbl["053"] := nopreds
   tbl["054"] := nopreds
   tbl["055"] := nopreds
   tbl["056"] := nopreds
   tbl["057"] := nopreds
   tbl["058"] := nopreds
   tbl["059"] := nopreds
   tbl["060"] := ["030"]
   tbl["061"] := nopreds
   tbl["062"] := nopreds
   tbl["063"] := nopreds
   tbl["064"] := nopreds
   tbl["065"] := nopreds
   tbl["066"] := nopreds
   tbl["067"] := nopreds
   tbl["068"] := nopreds
   tbl["069"] := nopreds
   tbl["070"] := nopreds
   tbl["071"] := nopreds
   tbl["072"] := nopreds
   tbl["073"] := nopreds
   tbl["074"] := nopreds
   tbl["075"] := nopreds
   tbl["076"] := nopreds
   tbl["077"] := nopreds
   tbl["078"] := nopreds
   tbl["079"] := nopreds
   tbl["080"] := ["040"]
   tbl["081"] := nopreds
   tbl["082"] := nopreds
   tbl["083"] := nopreds
   tbl["084"] := nopreds
   tbl["085"] := nopreds
   tbl["086"] := nopreds
   tbl["087"] := nopreds
   tbl["088"] := nopreds
   tbl["089"] := nopreds
   tbl["090"] := nopreds
   tbl["091"] := nopreds
   tbl["092"] := nopreds
   tbl["093"] := nopreds
   tbl["094"] := nopreds
   tbl["095"] := nopreds
   tbl["096"] := nopreds
   tbl["097"] := nopreds
   tbl["098"] := nopreds
   tbl["099"] := nopreds
   tbl["100"] := ["050"]
   tbl["101"] := ["100"]
   tbl["102"] := nopreds
   tbl["103"] := nopreds
   tbl["104"] := nopreds
   tbl["105"] := nopreds
   tbl["106"] := nopreds
   tbl["107"] := nopreds
   tbl["108"] := nopreds
   tbl["109"] := nopreds
   tbl["110"] := ["19", "055"]
   tbl["111"] := nopreds
   tbl["112"] := nopreds
   tbl["113"] := nopreds
   tbl["114"] := nopreds
   tbl["115"] := nopreds
   tbl["116"] := nopreds
   tbl["117"] := nopreds
   tbl["118"] := nopreds
   tbl["119"] := nopreds
   tbl["120"] := ["060"]
   tbl["121"] := ["29", "110"]
   tbl["122"] := nopreds
   tbl["123"] := nopreds
   tbl["124"] := nopreds
   tbl["125"] := nopreds
   tbl["126"] := nopreds
   tbl["127"] := nopreds
   tbl["128"] := nopreds
   tbl["129"] := nopreds
   tbl["130"] := ["065"]
   tbl["131"] := nopreds
   tbl["132"] := ["39"]
   tbl["133"] := nopreds
   tbl["134"] := nopreds
   tbl["135"] := nopreds
   tbl["136"] := nopreds
   tbl["137"] := nopreds
   tbl["138"] := nopreds
   tbl["139"] := nopreds
   tbl["140"] := ["070"]
   tbl["141"] := ["120"]
   tbl["142"] := nopreds
   tbl["143"] := ["49"]
   tbl["144"] := nopreds
   tbl["145"] := nopreds
   tbl["146"] := nopreds
   tbl["147"] := nopreds
   tbl["148"] := nopreds
   tbl["149"] := nopreds
   tbl["150"] := ["075"]
   tbl["151"] := nopreds
   tbl["152"] := nopreds
   tbl["153"] := nopreds
   tbl["154"] := ["59"]
   tbl["155"] := nopreds
   tbl["156"] := nopreds
   tbl["157"] := nopreds
   tbl["158"] := nopreds
   tbl["159"] := nopreds
   tbl["160"] := ["080"]
   tbl["161"] := ["130"]
   tbl["162"] := nopreds
   tbl["163"] := nopreds
   tbl["164"] := nopreds
   tbl["165"] := ["69"]
   tbl["166"] := nopreds
   tbl["167"] := nopreds
   tbl["168"] := nopreds
   tbl["169"] := nopreds
   tbl["170"] := ["085"]
   tbl["171"] := nopreds
   tbl["172"] := nopreds
   tbl["173"] := nopreds
   tbl["174"] := nopreds
   tbl["175"] := nopreds
   tbl["176"] := ["79"]
   tbl["177"] := nopreds
   tbl["178"] := nopreds
   tbl["179"] := nopreds
   tbl["180"] := ["090"]
   tbl["181"] := ["140"]
   tbl["182"] := nopreds
   tbl["183"] := nopreds
   tbl["184"] := nopreds
   tbl["185"] := nopreds
   tbl["186"] := nopreds
   tbl["187"] := ["89"]
   tbl["188"] := nopreds
   tbl["189"] := nopreds
   tbl["190"] := ["095"]
   tbl["191"] := nopreds
   tbl["192"] := nopreds
   tbl["193"] := nopreds
   tbl["194"] := nopreds
   tbl["195"] := nopreds
   tbl["196"] := nopreds
   tbl["197"] := nopreds
   tbl["198"] := ["99"]
   tbl["199"] := nopreds
   tbl["200"] := nopreds
   tbl["201"] := ["150"]
   tbl["202"] := ["101"]
   tbl["203"] := nopreds
   tbl["204"] := nopreds
   tbl["205"] := nopreds
   tbl["206"] := nopreds
   tbl["207"] := nopreds
   tbl["208"] := nopreds
   tbl["209"] := nopreds
   tbl["210"] := nopreds
   tbl["211"] := nopreds
   tbl["212"] := nopreds
   tbl["213"] := nopreds
   tbl["214"] := nopreds
   tbl["215"] := nopreds
   tbl["216"] := nopreds
   tbl["217"] := nopreds
   tbl["218"] := nopreds
   tbl["219"] := nopreds
   tbl["220"] := nopreds
   tbl["221"] := ["160"]
   tbl["222"] := ["111"]
   tbl["223"] := nopreds
   tbl["224"] := nopreds
   tbl["225"] := nopreds
   tbl["226"] := nopreds
   tbl["227"] := nopreds
   tbl["228"] := nopreds
   tbl["229"] := nopreds
   tbl["230"] := nopreds
   tbl["231"] := nopreds
   tbl["232"] := nopreds
   tbl["233"] := nopreds
   tbl["234"] := nopreds
   tbl["235"] := nopreds
   tbl["236"] := nopreds
   tbl["237"] := nopreds
   tbl["238"] := nopreds
   tbl["239"] := nopreds
   tbl["240"] := nopreds
   tbl["241"] := ["170"]
   tbl["242"] := ["121"]
   tbl["243"] := nopreds
   tbl["244"] := nopreds
   tbl["245"] := nopreds
   tbl["246"] := nopreds
   tbl["247"] := nopreds
   tbl["248"] := nopreds
   tbl["249"] := nopreds
   tbl["250"] := nopreds
   tbl["251"] := nopreds
   tbl["252"] := nopreds
   tbl["253"] := nopreds
   tbl["254"] := nopreds
   tbl["255"] := nopreds
   tbl["256"] := nopreds
   tbl["257"] := nopreds
   tbl["258"] := nopreds
   tbl["259"] := nopreds
   tbl["260"] := nopreds
   tbl["261"] := ["180"]
   tbl["262"] := ["131"]
   tbl["263"] := nopreds
   tbl["264"] := nopreds
   tbl["265"] := nopreds
   tbl["266"] := nopreds
   tbl["267"] := nopreds
   tbl["268"] := nopreds
   tbl["269"] := nopreds
   tbl["270"] := nopreds
   tbl["271"] := nopreds
   tbl["272"] := nopreds
   tbl["273"] := nopreds
   tbl["274"] := nopreds
   tbl["275"] := nopreds
   tbl["276"] := nopreds
   tbl["277"] := nopreds
   tbl["278"] := nopreds
   tbl["279"] := nopreds
   tbl["280"] := nopreds
   tbl["281"] := ["190"]
   tbl["282"] := ["141"]
   tbl["283"] := nopreds
   tbl["284"] := nopreds
   tbl["285"] := nopreds
   tbl["286"] := nopreds
   tbl["287"] := nopreds
   tbl["288"] := nopreds
   tbl["289"] := nopreds
   tbl["290"] := nopreds
   tbl["291"] := nopreds
   tbl["292"] := nopreds
   tbl["293"] := nopreds
   tbl["294"] := nopreds
   tbl["295"] := nopreds
   tbl["296"] := nopreds
   tbl["297"] := nopreds
   tbl["298"] := nopreds
   tbl["299"] := nopreds
   tbl["300"] := nopreds
   tbl["301"] := nopreds
   tbl["302"] := ["151"]
   tbl["303"] := ["102"]
   tbl["304"] := nopreds
   tbl["305"] := nopreds
   tbl["306"] := nopreds
   tbl["307"] := nopreds
   tbl["308"] := nopreds
   tbl["309"] := nopreds
   tbl["310"] := nopreds
   tbl["311"] := nopreds
   tbl["312"] := nopreds
   tbl["313"] := nopreds
   tbl["314"] := nopreds
   tbl["315"] := nopreds
   tbl["316"] := nopreds
   tbl["317"] := nopreds
   tbl["318"] := nopreds
   tbl["319"] := nopreds
   tbl["320"] := nopreds
   tbl["321"] := nopreds
   tbl["322"] := ["161"]
   tbl["323"] := ["112"]
   tbl["324"] := nopreds
   tbl["325"] := nopreds
   tbl["326"] := nopreds
   tbl["327"] := nopreds
   tbl["328"] := nopreds
   tbl["329"] := nopreds
   tbl["330"] := nopreds
   tbl["331"] := nopreds
   tbl["332"] := nopreds
   tbl["333"] := nopreds
   tbl["334"] := nopreds
   tbl["335"] := nopreds
   tbl["336"] := nopreds
   tbl["337"] := nopreds
   tbl["338"] := nopreds
   tbl["339"] := nopreds
   tbl["340"] := nopreds
   tbl["341"] := nopreds
   tbl["342"] := ["171"]
   tbl["343"] := ["122"]
   tbl["344"] := nopreds
   tbl["345"] := nopreds
   tbl["346"] := nopreds
   tbl["347"] := nopreds
   tbl["348"] := nopreds
   tbl["349"] := nopreds
   tbl["350"] := nopreds
   tbl["351"] := nopreds
   tbl["352"] := nopreds
   tbl["353"] := nopreds
   tbl["354"] := nopreds
   tbl["355"] := nopreds
   tbl["356"] := nopreds
   tbl["357"] := nopreds
   tbl["358"] := nopreds
   tbl["359"] := nopreds
   tbl["360"] := nopreds
   tbl["361"] := nopreds
   tbl["362"] := ["181"]
   tbl["363"] := ["132"]
   tbl["364"] := nopreds
   tbl["365"] := nopreds
   tbl["366"] := nopreds
   tbl["367"] := nopreds
   tbl["368"] := nopreds
   tbl["369"] := nopreds
   tbl["370"] := nopreds
   tbl["371"] := nopreds
   tbl["372"] := nopreds
   tbl["373"] := nopreds
   tbl["374"] := nopreds
   tbl["375"] := nopreds
   tbl["376"] := nopreds
   tbl["377"] := nopreds
   tbl["378"] := nopreds
   tbl["379"] := nopreds
   tbl["380"] := nopreds
   tbl["381"] := nopreds
   tbl["382"] := ["191"]
   tbl["383"] := ["142"]
   tbl["384"] := nopreds
   tbl["385"] := nopreds
   tbl["386"] := nopreds
   tbl["387"] := nopreds
   tbl["388"] := nopreds
   tbl["389"] := nopreds
   tbl["390"] := nopreds
   tbl["391"] := nopreds
   tbl["392"] := nopreds
   tbl["393"] := nopreds
   tbl["394"] := nopreds
   tbl["395"] := nopreds
   tbl["396"] := nopreds
   tbl["397"] := nopreds
   tbl["398"] := nopreds
   tbl["399"] := nopreds
   tbl["400"] := nopreds
   tbl["401"] := nopreds
   tbl["402"] := nopreds
   tbl["403"] := ["152"]
   tbl["404"] := ["103"]
   tbl["405"] := nopreds
   tbl["406"] := nopreds
   tbl["407"] := nopreds
   tbl["408"] := nopreds
   tbl["409"] := nopreds
   tbl["410"] := nopreds
   tbl["411"] := nopreds
   tbl["412"] := nopreds
   tbl["413"] := nopreds
   tbl["414"] := nopreds
   tbl["415"] := nopreds
   tbl["416"] := nopreds
   tbl["417"] := nopreds
   tbl["418"] := nopreds
   tbl["419"] := nopreds
   tbl["420"] := nopreds
   tbl["421"] := nopreds
   tbl["422"] := nopreds
   tbl["423"] := ["162"]
   tbl["424"] := ["113"]
   tbl["425"] := nopreds
   tbl["426"] := nopreds
   tbl["427"] := nopreds
   tbl["428"] := nopreds
   tbl["429"] := nopreds
   tbl["430"] := nopreds
   tbl["431"] := nopreds
   tbl["432"] := nopreds
   tbl["433"] := nopreds
   tbl["434"] := nopreds
   tbl["435"] := nopreds
   tbl["436"] := nopreds
   tbl["437"] := nopreds
   tbl["438"] := nopreds
   tbl["439"] := nopreds
   tbl["440"] := nopreds
   tbl["441"] := nopreds
   tbl["442"] := nopreds
   tbl["443"] := ["172"]
   tbl["444"] := ["123"]
   tbl["445"] := nopreds
   tbl["446"] := nopreds
   tbl["447"] := nopreds
   tbl["448"] := nopreds
   tbl["449"] := nopreds
   tbl["450"] := nopreds
   tbl["451"] := nopreds
   tbl["452"] := nopreds
   tbl["453"] := nopreds
   tbl["454"] := nopreds
   tbl["455"] := nopreds
   tbl["456"] := nopreds
   tbl["457"] := nopreds
   tbl["458"] := nopreds
   tbl["459"] := nopreds
   tbl["460"] := nopreds
   tbl["461"] := nopreds
   tbl["462"] := nopreds
   tbl["463"] := ["182"]
   tbl["464"] := ["133"]
   tbl["465"] := nopreds
   tbl["466"] := nopreds
   tbl["467"] := nopreds
   tbl["468"] := nopreds
   tbl["469"] := nopreds
   tbl["470"] := nopreds
   tbl["471"] := nopreds
   tbl["472"] := nopreds
   tbl["473"] := nopreds
   tbl["474"] := nopreds
   tbl["475"] := nopreds
   tbl["476"] := nopreds
   tbl["477"] := nopreds
   tbl["478"] := nopreds
   tbl["479"] := nopreds
   tbl["480"] := nopreds
   tbl["481"] := nopreds
   tbl["482"] := nopreds
   tbl["483"] := ["192"]
   tbl["484"] := ["143"]
   tbl["485"] := nopreds
   tbl["486"] := nopreds
   tbl["487"] := nopreds
   tbl["488"] := nopreds
   tbl["489"] := nopreds
   tbl["490"] := nopreds
   tbl["491"] := nopreds
   tbl["492"] := nopreds
   tbl["493"] := nopreds
   tbl["494"] := nopreds
   tbl["495"] := nopreds
   tbl["496"] := nopreds
   tbl["497"] := nopreds
   tbl["498"] := nopreds
   tbl["499"] := nopreds
   tbl["500"] := nopreds
   tbl["501"] := nopreds
   tbl["502"] := nopreds
   tbl["503"] := nopreds
   tbl["504"] := ["153"]
   tbl["505"] := ["104"]
   tbl["506"] := nopreds
   tbl["507"] := nopreds
   tbl["508"] := nopreds
   tbl["509"] := nopreds
   tbl["510"] := nopreds
   tbl["511"] := nopreds
   tbl["512"] := nopreds
   tbl["513"] := nopreds
   tbl["514"] := nopreds
   tbl["515"] := nopreds
   tbl["516"] := nopreds
   tbl["517"] := nopreds
   tbl["518"] := nopreds
   tbl["519"] := nopreds
   tbl["520"] := nopreds
   tbl["521"] := nopreds
   tbl["522"] := nopreds
   tbl["523"] := nopreds
   tbl["524"] := ["163"]
   tbl["525"] := ["114"]
   tbl["526"] := nopreds
   tbl["527"] := nopreds
   tbl["528"] := nopreds
   tbl["529"] := nopreds
   tbl["530"] := nopreds
   tbl["531"] := nopreds
   tbl["532"] := nopreds
   tbl["533"] := nopreds
   tbl["534"] := nopreds
   tbl["535"] := nopreds
   tbl["536"] := nopreds
   tbl["537"] := nopreds
   tbl["538"] := nopreds
   tbl["539"] := nopreds
   tbl["540"] := nopreds
   tbl["541"] := nopreds
   tbl["542"] := nopreds
   tbl["543"] := nopreds
   tbl["544"] := ["173"]
   tbl["545"] := ["124"]
   tbl["546"] := nopreds
   tbl["547"] := nopreds
   tbl["548"] := nopreds
   tbl["549"] := nopreds
   tbl["550"] := nopreds
   tbl["551"] := nopreds
   tbl["552"] := nopreds
   tbl["553"] := nopreds
   tbl["554"] := nopreds
   tbl["555"] := nopreds
   tbl["556"] := nopreds
   tbl["557"] := nopreds
   tbl["558"] := nopreds
   tbl["559"] := nopreds
   tbl["560"] := nopreds
   tbl["561"] := nopreds
   tbl["562"] := nopreds
   tbl["563"] := nopreds
   tbl["564"] := ["183"]
   tbl["565"] := ["134"]
   tbl["566"] := nopreds
   tbl["567"] := nopreds
   tbl["568"] := nopreds
   tbl["569"] := nopreds
   tbl["570"] := nopreds
   tbl["571"] := nopreds
   tbl["572"] := nopreds
   tbl["573"] := nopreds
   tbl["574"] := nopreds
   tbl["575"] := nopreds
   tbl["576"] := nopreds
   tbl["577"] := nopreds
   tbl["578"] := nopreds
   tbl["579"] := nopreds
   tbl["580"] := nopreds
   tbl["581"] := nopreds
   tbl["582"] := nopreds
   tbl["583"] := nopreds
   tbl["584"] := ["193"]
   tbl["585"] := ["144"]
   tbl["586"] := nopreds
   tbl["587"] := nopreds
   tbl["588"] := nopreds
   tbl["589"] := nopreds
   tbl["590"] := nopreds
   tbl["591"] := nopreds
   tbl["592"] := nopreds
   tbl["593"] := nopreds
   tbl["594"] := nopreds
   tbl["595"] := nopreds
   tbl["596"] := nopreds
   tbl["597"] := nopreds
   tbl["598"] := nopreds
   tbl["599"] := nopreds
   tbl["600"] := nopreds
   tbl["601"] := nopreds
   tbl["602"] := nopreds
   tbl["603"] := nopreds
   tbl["604"] := nopreds
   tbl["605"] := ["154"]
   tbl["606"] := ["105"]
   tbl["607"] := nopreds
   tbl["608"] := nopreds
   tbl["609"] := nopreds
   tbl["610"] := nopreds
   tbl["611"] := nopreds
   tbl["612"] := nopreds
   tbl["613"] := nopreds
   tbl["614"] := nopreds
   tbl["615"] := nopreds
   tbl["616"] := nopreds
   tbl["617"] := nopreds
   tbl["618"] := nopreds
   tbl["619"] := nopreds
   tbl["620"] := nopreds
   tbl["621"] := nopreds
   tbl["622"] := nopreds
   tbl["623"] := nopreds
   tbl["624"] := nopreds
   tbl["625"] := ["164"]
   tbl["626"] := ["115"]
   tbl["627"] := nopreds
   tbl["628"] := nopreds
   tbl["629"] := nopreds
   tbl["630"] := nopreds
   tbl["631"] := nopreds
   tbl["632"] := nopreds
   tbl["633"] := nopreds
   tbl["634"] := nopreds
   tbl["635"] := nopreds
   tbl["636"] := nopreds
   tbl["637"] := nopreds
   tbl["638"] := nopreds
   tbl["639"] := nopreds
   tbl["640"] := nopreds
   tbl["641"] := nopreds
   tbl["642"] := nopreds
   tbl["643"] := nopreds
   tbl["644"] := nopreds
   tbl["645"] := ["174"]
   tbl["646"] := ["125"]
   tbl["647"] := nopreds
   tbl["648"] := nopreds
   tbl["649"] := nopreds
   tbl["650"] := nopreds
   tbl["651"] := nopreds
   tbl["652"] := nopreds
   tbl["653"] := nopreds
   tbl["654"] := nopreds
   tbl["655"] := nopreds
   tbl["656"] := nopreds
   tbl["657"] := nopreds
   tbl["658"] := nopreds
   tbl["659"] := nopreds
   tbl["660"] := nopreds
   tbl["661"] := nopreds
   tbl["662"] := nopreds
   tbl["663"] := nopreds
   tbl["664"] := nopreds
   tbl["665"] := ["184"]
   tbl["666"] := ["135"]
   tbl["667"] := nopreds
   tbl["668"] := nopreds
   tbl["669"] := nopreds
   tbl["670"] := nopreds
   tbl["671"] := nopreds
   tbl["672"] := nopreds
   tbl["673"] := nopreds
   tbl["674"] := nopreds
   tbl["675"] := nopreds
   tbl["676"] := nopreds
   tbl["677"] := nopreds
   tbl["678"] := nopreds
   tbl["679"] := nopreds
   tbl["680"] := nopreds
   tbl["681"] := nopreds
   tbl["682"] := nopreds
   tbl["683"] := nopreds
   tbl["684"] := nopreds
   tbl["685"] := ["194"]
   tbl["686"] := ["145"]
   tbl["687"] := nopreds
   tbl["688"] := nopreds
   tbl["689"] := nopreds
   tbl["690"] := nopreds
   tbl["691"] := nopreds
   tbl["692"] := nopreds
   tbl["693"] := nopreds
   tbl["694"] := nopreds
   tbl["695"] := nopreds
   tbl["696"] := nopreds
   tbl["697"] := nopreds
   tbl["698"] := nopreds
   tbl["699"] := nopreds
   tbl["700"] := nopreds
   tbl["701"] := nopreds
   tbl["702"] := nopreds
   tbl["703"] := nopreds
   tbl["704"] := nopreds
   tbl["705"] := nopreds
   tbl["706"] := ["155"]
   tbl["707"] := ["106"]
   tbl["708"] := nopreds
   tbl["709"] := nopreds
   tbl["710"] := nopreds
   tbl["711"] := nopreds
   tbl["712"] := nopreds
   tbl["713"] := nopreds
   tbl["714"] := nopreds
   tbl["715"] := nopreds
   tbl["716"] := nopreds
   tbl["717"] := nopreds
   tbl["718"] := nopreds
   tbl["719"] := nopreds
   tbl["720"] := nopreds
   tbl["721"] := nopreds
   tbl["722"] := nopreds
   tbl["723"] := nopreds
   tbl["724"] := nopreds
   tbl["725"] := nopreds
   tbl["726"] := ["165"]
   tbl["727"] := ["116"]
   tbl["728"] := nopreds
   tbl["729"] := nopreds
   tbl["730"] := nopreds
   tbl["731"] := nopreds
   tbl["732"] := nopreds
   tbl["733"] := nopreds
   tbl["734"] := nopreds
   tbl["735"] := nopreds
   tbl["736"] := nopreds
   tbl["737"] := nopreds
   tbl["738"] := nopreds
   tbl["739"] := nopreds
   tbl["740"] := nopreds
   tbl["741"] := nopreds
   tbl["742"] := nopreds
   tbl["743"] := nopreds
   tbl["744"] := nopreds
   tbl["745"] := nopreds
   tbl["746"] := ["175"]
   tbl["747"] := ["126"]
   tbl["748"] := nopreds
   tbl["749"] := nopreds
   tbl["750"] := nopreds
   tbl["751"] := nopreds
   tbl["752"] := nopreds
   tbl["753"] := nopreds
   tbl["754"] := nopreds
   tbl["755"] := nopreds
   tbl["756"] := nopreds
   tbl["757"] := nopreds
   tbl["758"] := nopreds
   tbl["759"] := nopreds
   tbl["760"] := nopreds
   tbl["761"] := nopreds
   tbl["762"] := nopreds
   tbl["763"] := nopreds
   tbl["764"] := nopreds
   tbl["765"] := nopreds
   tbl["766"] := ["185"]
   tbl["767"] := ["136"]
   tbl["768"] := nopreds
   tbl["769"] := nopreds
   tbl["770"] := nopreds
   tbl["771"] := nopreds
   tbl["772"] := nopreds
   tbl["773"] := nopreds
   tbl["774"] := nopreds
   tbl["775"] := nopreds
   tbl["776"] := nopreds
   tbl["777"] := nopreds
   tbl["778"] := nopreds
   tbl["779"] := nopreds
   tbl["780"] := nopreds
   tbl["781"] := nopreds
   tbl["782"] := nopreds
   tbl["783"] := nopreds
   tbl["784"] := nopreds
   tbl["785"] := nopreds
   tbl["786"] := ["195"]
   tbl["787"] := ["146"]
   tbl["788"] := nopreds
   tbl["789"] := nopreds
   tbl["790"] := nopreds
   tbl["791"] := nopreds
   tbl["792"] := nopreds
   tbl["793"] := nopreds
   tbl["794"] := nopreds
   tbl["795"] := nopreds
   tbl["796"] := nopreds
   tbl["797"] := nopreds
   tbl["798"] := nopreds
   tbl["799"] := nopreds
   tbl["800"] := nopreds
   tbl["801"] := nopreds
   tbl["802"] := nopreds
   tbl["803"] := nopreds
   tbl["804"] := nopreds
   tbl["805"] := nopreds
   tbl["806"] := nopreds
   tbl["807"] := ["156"]
   tbl["808"] := ["107"]
   tbl["809"] := nopreds
   tbl["810"] := nopreds
   tbl["811"] := nopreds
   tbl["812"] := nopreds
   tbl["813"] := nopreds
   tbl["814"] := nopreds
   tbl["815"] := nopreds
   tbl["816"] := nopreds
   tbl["817"] := nopreds
   tbl["818"] := nopreds
   tbl["819"] := nopreds
   tbl["820"] := nopreds
   tbl["821"] := nopreds
   tbl["822"] := nopreds
   tbl["823"] := nopreds
   tbl["824"] := nopreds
   tbl["825"] := nopreds
   tbl["826"] := nopreds
   tbl["827"] := ["166"]
   tbl["828"] := ["117"]
   tbl["829"] := nopreds
   tbl["830"] := nopreds
   tbl["831"] := nopreds
   tbl["832"] := nopreds
   tbl["833"] := nopreds
   tbl["834"] := nopreds
   tbl["835"] := nopreds
   tbl["836"] := nopreds
   tbl["837"] := nopreds
   tbl["838"] := nopreds
   tbl["839"] := nopreds
   tbl["840"] := nopreds
   tbl["841"] := nopreds
   tbl["842"] := nopreds
   tbl["843"] := nopreds
   tbl["844"] := nopreds
   tbl["845"] := nopreds
   tbl["846"] := nopreds
   tbl["847"] := ["176"]
   tbl["848"] := ["127"]
   tbl["849"] := nopreds
   tbl["850"] := nopreds
   tbl["851"] := nopreds
   tbl["852"] := nopreds
   tbl["853"] := nopreds
   tbl["854"] := nopreds
   tbl["855"] := nopreds
   tbl["856"] := nopreds
   tbl["857"] := nopreds
   tbl["858"] := nopreds
   tbl["859"] := nopreds
   tbl["860"] := nopreds
   tbl["861"] := nopreds
   tbl["862"] := nopreds
   tbl["863"] := nopreds
   tbl["864"] := nopreds
   tbl["865"] := nopreds
   tbl["866"] := nopreds
   tbl["867"] := ["186"]
   tbl["868"] := ["137"]
   tbl["869"] := nopreds
   tbl["870"] := nopreds
   tbl["871"] := nopreds
   tbl["872"] := nopreds
   tbl["873"] := nopreds
   tbl["874"] := nopreds
   tbl["875"] := nopreds
   tbl["876"] := nopreds
   tbl["877"] := nopreds
   tbl["878"] := nopreds
   tbl["879"] := nopreds
   tbl["880"] := nopreds
   tbl["881"] := nopreds
   tbl["882"] := nopreds
   tbl["883"] := nopreds
   tbl["884"] := nopreds
   tbl["885"] := nopreds
   tbl["886"] := nopreds
   tbl["887"] := ["196"]
   tbl["888"] := ["147"]
   tbl["889"] := nopreds
   tbl["890"] := nopreds
   tbl["891"] := nopreds
   tbl["892"] := nopreds
   tbl["893"] := nopreds
   tbl["894"] := nopreds
   tbl["895"] := nopreds
   tbl["896"] := nopreds
   tbl["897"] := nopreds
   tbl["898"] := nopreds
   tbl["899"] := nopreds
   tbl["900"] := nopreds
   tbl["901"] := nopreds
   tbl["902"] := nopreds
   tbl["903"] := nopreds
   tbl["904"] := nopreds
   tbl["905"] := nopreds
   tbl["906"] := nopreds
   tbl["907"] := nopreds
   tbl["908"] := ["157"]
   tbl["909"] := ["108"]
   tbl["910"] := nopreds
   tbl["911"] := nopreds
   tbl["912"] := nopreds
   tbl["913"] := nopreds
   tbl["914"] := nopreds
   tbl["915"] := nopreds
   tbl["916"] := nopreds
   tbl["917"] := nopreds
   tbl["918"] := nopreds
   tbl["919"] := nopreds
   tbl["920"] := nopreds
   tbl["921"] := nopreds
   tbl["922"] := nopreds
   tbl["923"] := nopreds
   tbl["924"] := nopreds
   tbl["925"] := nopreds
   tbl["926"] := nopreds
   tbl["927"] := nopreds
   tbl["928"] := ["167"]
   tbl["929"] := ["118"]
   tbl["930"] := nopreds
   tbl["931"] := nopreds
   tbl["932"] := nopreds
   tbl["933"] := nopreds
   tbl["934"] := nopreds
   tbl["935"] := nopreds
   tbl["936"] := nopreds
   tbl["937"] := nopreds
   tbl["938"] := nopreds
   tbl["939"] := nopreds
   tbl["940"] := nopreds
   tbl["941"] := nopreds
   tbl["942"] := nopreds
   tbl["943"] := nopreds
   tbl["944"] := nopreds
   tbl["945"] := nopreds
   tbl["946"] := nopreds
   tbl["947"] := nopreds
   tbl["948"] := ["177"]
   tbl["949"] := ["128"]
   tbl["950"] := nopreds
   tbl["951"] := nopreds
   tbl["952"] := nopreds
   tbl["953"] := nopreds
   tbl["954"] := nopreds
   tbl["955"] := nopreds
   tbl["956"] := nopreds
   tbl["957"] := nopreds
   tbl["958"] := nopreds
   tbl["959"] := nopreds
   tbl["960"] := nopreds
   tbl["961"] := nopreds
   tbl["962"] := nopreds
   tbl["963"] := nopreds
   tbl["964"] := nopreds
   tbl["965"] := nopreds
   tbl["966"] := nopreds
   tbl["967"] := nopreds
   tbl["968"] := ["187"]
   tbl["969"] := ["138"]
   tbl["970"] := nopreds
   tbl["971"] := nopreds
   tbl["972"] := nopreds
   tbl["973"] := nopreds
   tbl["974"] := nopreds
   tbl["975"] := nopreds
   tbl["976"] := nopreds
   tbl["977"] := nopreds
   tbl["978"] := nopreds
   tbl["979"] := nopreds
   tbl["980"] := nopreds
   tbl["981"] := nopreds
   tbl["982"] := nopreds
   tbl["983"] := nopreds
   tbl["984"] := nopreds
   tbl["985"] := nopreds
   tbl["986"] := nopreds
   tbl["987"] := nopreds
   tbl["988"] := ["197"]
   tbl["989"] := ["148"]
   tbl["990"] := nopreds
   tbl["991"] := nopreds
   tbl["992"] := nopreds
   tbl["993"] := nopreds
   tbl["994"] := nopreds
   tbl["995"] := nopreds
   tbl["996"] := nopreds
   tbl["997"] := nopreds
   tbl["998"] := nopreds
   tbl["999"] := nopreds

   return tbl

end

procedure vpred_all(i)		#: all predecessors of versum number

   suspend eqvseeds(vpred(i))

end

$define MinusLimit 500

procedure minus1(s)
   local result, digit, i

   if *s < MinusLimit then {
      if s <= 0 then fail
      else return string(s - 1)
      }

   if (s[1] == "-") | not(upto(s, '123456789')) then fail

   result := ""

   every digit := s[i := *s to 1 by -1] do {
      if (digit - 1) >= 0 then {
         result := s[1:i] || (digit - 1) || result 
         if result[1] == "0"  & *result > 1 then result := result[2:0]
         return result
         }
      else result := "9" || result
      }

   fail

end