lat.fun 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #import std
  2. #import nat
  3. #comment -[
  4. This module contains some operations on lattices. Most depend on the
  5. assumption that the lattice has a single root.
  6. Copyright (C) 2007-2010 Dennis Furey]-
  7. #library+
  8. #optimize+
  9. --------------------------------------- construction and deconstruction of lattices -----------------------------------------
  10. edges = ~&/<&>; ~&xS+ ~&ar^& ~&rnSPlfPrmvPSLs3lart3XRX+ ~&iarhPlDrNrXlHAS2X
  11. levels = ~&NliNXSPNNNCCTXrNXHdS^*p/edges ~&
  12. lnodes = ~&L+ levels
  13. grid = # takes a specification (<<v..>..>,<e..>) where each e is an adjacency relational predicate, to a %G type
  14. ~&l&& -+
  15. * ^|H(:=^/~&l !+ ~&r,~&)=>[]+ ~&lrrlDPD; * ^/~&rrl ^V/~&rrr ^HlS\~&rrlX ~|+ ~&br;+ ~&l,
  16. zipp(0!)^/~&r ~&l; ~&tytpBzNXNCT+ * ~&/<<&>>; -&leql,not eql&-->~&llTrX; zipt^\~&r ~&NlDrlXSPNrDT:-0+ ~&l,
  17. ~&alh^?\&! ~&alt?\~&alhNCPNX ^bbI/~&abh ^R/~&f ^\~&artiY :^\~&altt ^H\~&althPhX gint+ ~&rlX;+ ~&arh,
  18. (any %fI; ~&a^& ||~&favPMik -&~&adl=='library',~&avhdrNHl=='mtwist'&-)?r\~& -+
  19. %sLfLXMk+ ^/~&l ~&rlytplrK0S2p; * %fcWLXMk; lsm^H\~&r *~+ ~&l,
  20. ~&alt^?\~&alNX ~&abh2faltPrtiYPXPRXbbI+-+-
  21. sever = # takes an argument of type t%G to one of type t%GG by replacing each node with the lattice rooted on it
  22. ^lxSPrp(edges,~&); %aLsaLXNoUXLMk; ~&a^& ~&at?(
  23. :^\~&fatPR (~&lrPllPrpX; ~&r->l ^\~&rt ^H\~&l :=^/(~&rhl; .\&d) !+ ~&rhr)^/~&ahlrX -+
  24. * :^/~&r ~&rrPlX; ~&ar^& ~&iarhPlDrNrXlHAS2X; :^\~&lfPrmvPSLs3lart3XR ~&r; ~&Hl\0+ :=+ ~&lNXSNNNCCTNrSXNXX,
  25. ~&atrSPhNliNXSPNNNCCTXrNXHPD+-,
  26. ~&ah; %aLsaLXNXMk; ~&liNXSPNNNCCTrNXX; ~&HlPNC\0+ :=^/~&l !+ ~&NlXrHdNCvVNCS)
  27. ------------------------------------- generalizations of list combinators to lattices ---------------------------------------
  28. ldis = ^H\~&r lmap+ ^\~&+ !+ ~&l # distributes a value to every node
  29. ldiz = # takes a list of values and a grid, and distributes a value to each level
  30. ~&/<&>; ~&arr^& ~&iarlh2rrh2lDrNrXlHASPDrnPlrmd2Xrmv2VAS2X; :^\~&lfPrmvPSLs3larbt4XR ~&Hl\0+ :=+ ~&rlNXSNNNCCTNrSXNXX
  31. lzip = # zips a couple of similarly shaped lattices together
  32. ^(edges,~&)~~; ~&llPrlPE?(
  33. ~&blrplNliNXSPNNNCCTXrNXHXS2lrp; ~&Hl\0+* :=+ ~&lliNXS2NNNCCTNlrdS2rrdS2prrvS2pXNXX,
  34. <'bad lzip'>!%)
  35. lmap = # applies a function to every node in a lattice
  36. "f". ~&/<&>; ~&ar^& -+
  37. :^\~&lfPrmvPSLs3lart3XR ^H(:=^/~&ll !+ ~&lr,~&r)=>0+ ~&r; * ^A/~&n ^V\~&mv "f"+ ~&md,
  38. ^/~& ~&arhPlDrNrXlHAS+-
  39. lfold = # applies a function to a node and a list of the results from the subtrees in a lattice
  40. "f". ~&i&& ~&/<&>; <:~&iarhPlDrNrXlHAS2X -+
  41. ~&Hl\0+ :=+ ~&liNXSPNNNCCTNrXNXX,
  42. ^/~&rnS "f"*+ ~&mvPk?r\~&rmS ~&lfPrmvPSLs3lart3XRrD; * ^V/~&rmd ~&lrmv2DNrXlHS+-
  43. ------------------------------------------------- induction patterns --------------------------------------------------------
  44. bwi = # takes a function mapping an ordinary tree to a new root and performs backward induction on a lattice
  45. "f". ~&i&& ~&/<&>; ~&r+ ~&ar^& ~&iallNiNXSNNNCCTXPrhPNXHpPX; ~&lart?(
  46. ~&rlfPrmvPSLs3lart3XRX; ^rlPrrPlCX/~&rr -+
  47. (~~ ~&Hl\0+ :=)^G/~&liNXSNNNCCT !~~+ ~&r,
  48. ^pllPSlrPSlrd2rVSXX\~&lmvPS ~&rlPlD; ^p/~&rnPS * ^V("f",~&v)+ ^V/~&rmd ~&lrmv2DNrXlHS+-,
  49. ~&iiNCX+ (~&Hl\0+ :=^/~&liNXSPNNNCCT !+ ~&r)^/~&rnS ~&rmS; * ^V/"f" ~&v)
  50. fwi = # operand takes (<inheritance..>,tree) to (root,<bequest..>); result is a lattice transformation
  51. "f". ~&NiX; ~&r&& ^lrrPXNCrlPX(~&l,~&r; ^/~& lfold ~&); ~&/<&>; <:~&ialNliNXSPNNNCCTXrrh2NXHpPX ~&larrt?(
  52. (:^/~&rr ^R/~&llf ^/~&rlnS ^/~&rlmS ~&llarrt)^/~& -+
  53. ^\-+~&Hl\0+ :=+ ~&liNXSPNNNCCTNrXNXX,^/~&rnPS ~&llPrmv2XS+- -+
  54. |=hlmr3rlPShrr2XXS&lmr+ *= ~&x+ psort<lleq+ ~&bln,~&blml; not nleq>,
  55. |=&lmr+ *= ^p\~&lr ^D/~&rn num+ ~&rmr+-,
  56. ^p\~&r ~&larl; * ^("f",~&rv); -&~&l,eql@lrPrX&-?/~&llPlrPrpX <'bad forward inducer'>!%+-,
  57. (~&H\0+ :=+ ~&liNXSPNNNCCTNrXNXX)^/~&rnS ~&larl; * "f"; ~&irZB?/~& <'bad boundary'>!%)
  58. fswi = # operand takes ((<inheritance..>,<sibling..>),tree) to (root,<bequest..>); result is a lattice transformation
  59. -+
  60. "f". @NiX ~&r&& ^lrrPXNCrlPX(~&l,~&r; ^/~& lfold ~&); ~&/<&>; <:~&ialNliNXSPNNNCCTXrrh2NXHpPX ~&larrt?(
  61. (:^/~&rr (~&rl; any ~&m)?\~&llarrt ^R/~&llf ^/~&rlnS ^/~&rlmS ~&llarrt)^/~& -+
  62. ~&i&& ^\-+~&Hl\0+ :=+ ~&liNXSPNNNCCTNrXNXX,^/~&rnPS ~&llPrmv2XS+- -+
  63. |=hlmr3rlPShrr2XXS&lmr+ *= ~&x+ psort<lleq+ ~&bln,~&blml; not nleq>,
  64. |=&lmr+ *= ^p\~&lr ^D/~&rn num+ ~&rmr+-,
  65. ^llrpB\~&r ~&rrlPSPlarl3D; * ~&rlPlXrrPX; ^("f",~&rv); eql?lrPrX/~&llPlrPrpX <'bad forward inducer'>!%+-,
  66. (~&H\0+ :=+ ~&liNXSPNNNCCTNrXNXX)^/~&rnS ~&rrlPSPlarl3D; * ~&rlPlXrrPX; "f"; ~&rZ?/~& <'bad boundary'>!%),
  67. ||(^/~&rd 0!*+ ~&rv)+-
  68. swi = "f". fswi ^("f"+ ~&lrPrdPX,0!*+ ~&rv) # f maps only (<sibling..>,root) to new root