cvit.red 117 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660
  1. module cvit; % Header module for CVIT package.
  2. % Authors: A.Kryukov, A.Rodionov, A.Taranov.
  3. % Copyright (C) 1988,1990, Institute of Nuclear Physics, Moscow State
  4. % University.
  5. % Modifications for Reduce 3.4.1 by John Fitch.
  6. % The CVITMAC module can be loaded for compilation only,
  7. % and need not be present during run time.
  8. % The High Energy Physics package must be loaded first.
  9. load_package hephys;
  10. endmodule;
  11. module cvitmac; % smacro procedures for Cvitanovich package.
  12. % COPYRIGHT (C) 1988,1990, INSTITUTE OF NUCLEAR PHYSICS, MOSCOW STATE
  13. % UNIV.
  14. % AUTHOR A.KRYUKOV, A.RODIONOV, A.TARANOV
  15. % VERSION 2.1
  16. % RELEASE 11-MAR-90
  17. % 07.06.90 all MAP replaced by MAP_ RT
  18. % 08.06.90 SOME MACROS FROM CVITMAP FILE ADDED to section IV RT
  19. % 10.06.90 SOME MACROS FROM CVITMAP FILE ADDED RT
  20. % These fluids and globals have been moved here for cleaner compilation.
  21. fluid '(!*msg ndims!* dindices!*)$
  22. global '(windices!* indices!* !*cvit gamma5!* !*g5cvit)$
  23. if null windices!*
  24. then windices!*:=
  25. '(nil !_f0 !_f1 !_f2 !_f3 !_f4 !_f5 !_f6 !_f7 !_f8 !_f9)$
  26. if null gamma5!*
  27. then gamma5!*:=
  28. '(nil !_a0 !_a1 !_a2 !_a3 !_a4 !_a5 !_a6 !_a7 !_a8 !_a9)$
  29. %GGGGGGGGGGGGGGGGGGGGGGGGG GLOBALS & FLUIDS FFFFFFFFFFFFFFFFFFFFFFFFF$
  30. global '( !_0edge)$
  31. fluid '( new_edge_list old_edge_list )$
  32. % NEW_EDGE_LIST - LIST OF CREATED EDGES$
  33. % OLD_EDGE_LIST - LIST OF INITIAL EDGES$
  34. fluid '(n_edge)$
  35. % N_EDGE - NUMBER OF CREATED EDGES$
  36. %************ SECTION I ************************************
  37. smacro procedure hvectorp x$
  38. get(x,'rtype) eq 'hvector$
  39. smacro procedure windexp x$
  40. x memq car windices!*$
  41. smacro procedure replace_by_indexp v$
  42. get(v,'replace_by_index)$
  43. smacro procedure indexp i$
  44. i memq indices!*$
  45. smacro procedure replace_by_vectorp i$
  46. get(i,'replace_by_vector)$
  47. smacro procedure replace_by_vector i$
  48. get(i,'replace_by_vector) or i$
  49. smacro procedure gamma5p x$
  50. memq(x,car gamma5!*)$
  51. smacro procedure nospurp x$
  52. flagp(x,'nospur)$
  53. smacro procedure clear_gamma5()$
  54. gamma5!* := nil . append(reverse car gamma5!*,cdr gamma5!*)$
  55. %********************* SECTION II **************************
  56. symbolic smacro procedure p_empty_map_ map_$
  57. % IS MAP_ EMPTY ? $
  58. null map_$
  59. symbolic smacro procedure p_empty_vertex vertex$
  60. % IS VERTEX EMPTY ? $
  61. null vertex$
  62. %++++++++++++++++++++++++++ SELECTORS +++++++++++++++++++++++++++++++$
  63. symbolic smacro procedure s_vertex_first map_$
  64. % SELECT FIRST VERTEX IN MAP_ $
  65. car map_$
  66. symbolic smacro procedure s_map__rest map_$
  67. % SELECT TAIL OF MAP_ $
  68. cdr map_$
  69. symbolic smacro procedure s_vertex_second map_$
  70. % SELECT SECOND VERTEX IN MAP_ $
  71. s_vertex_first s_map__rest map_$
  72. symbolic smacro procedure first_edge vertex$
  73. % SELECT FIRST EDGE IN VERTEX $
  74. car vertex$
  75. symbolic smacro procedure s_vertex_rest vertex$
  76. % SELECT TAIL OF VERTEX $
  77. cdr vertex$
  78. symbolic smacro procedure second_edge vertex$
  79. % SELECT SECOND EDGE IN VERTEX $
  80. first_edge s_vertex_rest vertex$
  81. symbolic smacro procedure s_edge_name edge$
  82. % SELECT EDGE'S NAME $
  83. car edge$
  84. symbolic smacro procedure s_edge_prop_ edge$
  85. % SELECT PROP_ERTY OF AN EDGE (NAMES OF PARENTS OR NUMBERS)$
  86. cadr edge$
  87. symbolic smacro procedure s_edge_type edge$
  88. % SELEC TYPE (PARITY) OF AN EDGE$
  89. caddr edge$
  90. %?????????????????????? CONSTRUCTORS ??????????????????????????????$
  91. symbolic smacro procedure add_vertex (vertex,map_)$
  92. % ADD VERTEX TO MAP_ $
  93. vertex . map_ $
  94. symbolic smacro procedure add_edge (edge,vertex)$
  95. % ADD EDGE TO VERTEX$
  96. edge . vertex$
  97. symbolic smacro procedure append_map_s (map_1,map_2)$
  98. % APPEND TWO MAP_S $
  99. append(map_1,map_2)$
  100. symbolic smacro procedure conc_map_s (map_1,map_2)$
  101. % APPEND TWO MAP_S $
  102. nconc(map_1,map_2)$
  103. symbolic smacro procedure conc_vertex (vertex1,vertex2)$
  104. % APPEND TWO VERTICES
  105. nconc(vertex1,vertex2)$
  106. symbolic smacro procedure mk_name1 name$
  107. explode name$
  108. symbolic smacro procedure mk_edge_prop_ (prop_1,prop_2)$
  109. prop_1 . prop_2 $
  110. symbolic smacro procedure mk_edge_type (typ1,typ2)$
  111. % DEFINED EDGE <=> TYPE T,
  112. % UNDEFINED EDGE <=> TYPE NIL$
  113. typ1 and typ2 $
  114. symbolic smacro procedure mk_edge (name,prop_,type)$
  115. % MAKE UP NEW EDGE $
  116. list(name,prop_,type)$
  117. symbolic smacro procedure mk_edge3_vertex (edge1,edge2,edge3)$
  118. % MAKES PRIMITIVE VERTEX $
  119. list(edge1,edge2,edge3)$
  120. symbolic smacro procedure mk_empty_map_ ()$
  121. % GENERATE EMPTY MAP_ $
  122. nil $
  123. symbolic smacro procedure mk_empty_vertex ()$
  124. % GENERATE EMPTY VERTEX $
  125. nil $
  126. symbolic smacro procedure mk_vertex1_map_ vertex1$
  127. % MAKE MAP_ OF ONE VERTEX $
  128. list(vertex1)$
  129. symbolic smacro procedure mk_vertex2_map_ (vertex1,vertex2)$
  130. % MAKE MAP_ OF TWO VERTICES $
  131. list(vertex1,vertex2)$
  132. symbolic smacro procedure mk_edge2_vertex (edge1,edge2)$
  133. %MAKES VERTEX FROM TWO EDGES$
  134. list(edge1,edge2)$
  135. symbolic smacro procedure conc_vertex (vertex1,vertex2)$
  136. nconc(vertex1,vertex2)$
  137. symbolic smacro procedure cycl_map_ map_$
  138. % MAKES CYCLIC PERMUTATION OF MAP_$
  139. append(cdr map_,list car map_)$
  140. symbolic smacro procedure cycl_vertex vertex$
  141. % MAKES CYCLIC PERMUTATION OF VERTEX$
  142. append(cdr vertex,list car vertex)$
  143. symbolic smacro procedure mk_world (actedges,world1)$
  144. list(actedges,list nil,world1)$
  145. %====================== PREDICATES (CONTINUE) =====================$
  146. symbolic smacro procedure p_member_edge (edge,vertex)$
  147. % IS EDGE (WITH THE SAME NAME) CONTAINS IN VERTEX ?$
  148. assoc(s_edge_name edge,vertex)$
  149. symbolic smacro procedure equal_edges (edge1,edge2)$
  150. % IF EDGES HAVE THE SAME NAMES ? $
  151. eq ( s_edge_name edge1, s_edge_name edge2)$
  152. symbolic smacro procedure single_no_parents edges$
  153. length edges = 1 $
  154. symbolic smacro procedure resto_map__order map_$
  155. % REVERSE (BETTER REVERSIP) MAP_ $
  156. reverse map_$
  157. symbolic smacro procedure map__length map_$
  158. % NUMBER OF VERTICES IN MAP_$$
  159. length map_$
  160. symbolic smacro procedure vertex_length vertex$
  161. % NUMBER OF EDGES IN VERTEX $
  162. length vertex$
  163. symbolic smacro procedure prepare_map_ map_$
  164. for each x in map_
  165. collect mk_old_edge x$
  166. symbolic smacro procedure p_vertex_prim vertex$
  167. % IS VERTEX PRIMITIVE ? $
  168. vertex_length (vertex) <= 3 $
  169. %************ SECTION III ************************************
  170. symbolic smacro procedure s!-edge!-name edge$ car edge$
  171. symbolic smacro procedure sappend(x,y)$ append(x,y)$
  172. symbolic smacro procedure sreverse y $ reverse y$
  173. symbolic smacro procedure getedge(x,y)$ cdr assoc(x,y)$
  174. symbolic smacro procedure mk!-road!-name(x,y,n)$
  175. list(car x . n,car y . n)$
  176. symbolic smacro procedure mk!-external!-leg edge$
  177. %< FLAG(LIST EDGE,'EXTRNL)$
  178. list( edge . 0) $
  179. symbolic smacro procedure index!-in(ind,l)$
  180. if atom ind then nil
  181. else member(ind,l)$
  182. %************ SECTION IV ************************************
  183. symbolic smacro procedure reverse_map_ map_$
  184. reverse map_$
  185. symbolic smacro procedure mk_edge1_vertex edge$
  186. list edge$
  187. symbolic smacro procedure mk_edges_vertex edges$
  188. edges$
  189. symbolic smacro procedure reversip_vertex vertex$
  190. reversip vertex$
  191. symbolic smacro procedure append_vertex (vertex1,vertex2)$
  192. append(vertex1,vertex2)$
  193. %symbolic smacro procedure conc_vertex (vertex1,vertex2)$
  194. % nconc(vertex1,vertex2)$
  195. symbolic smacro procedure mk_edge4_vertex (edge1,edge2,edge3,edge4)$
  196. list(edge1,edge2,edge3,edge4)$
  197. symbolic smacro procedure p_old_edge edge$
  198. assoc(s_edge_name edge,old_edge_list )$
  199. symbolic smacro procedure s_atlas_map_ atlas$
  200. car atlas$
  201. symbolic smacro procedure s_atlas_coeff atlas$
  202. cadr atlas$
  203. symbolic smacro procedure s_atlas_den_om atlas$
  204. caddr atlas$
  205. symbolic smacro procedure mk_atlas (map_,atlases,den_om)$
  206. list(map_,atlases,den_om)$
  207. symbolic smacro procedure vertex_edges edge$
  208. edge$
  209. symbolic smacro procedure s_coeff_world1 world1$
  210. cadr world1 $
  211. symbolic smacro procedure s_edgelist_world world$
  212. car world$
  213. symbolic smacro procedure s_world1 world$
  214. caddr world $
  215. symbolic smacro procedure s_world_var world$
  216. cadr world$
  217. symbolic smacro procedure s_world_atlas world$
  218. caddr world$
  219. symbolic smacro procedure s_world_edges world$
  220. car world$
  221. endmodule;
  222. module red_to_cvit_interface$
  223. % COPYRIGHT (C) 1988,1990,INSTITUTE OF NUCLEAR PHYSICS,MOSCOW STATE
  224. % UNIV.
  225. % PURPOSE INTERFACE BETWEEN REDUCE AND CVITANOVICH ALGORITHM.
  226. % AUTHOR A.KRYUKOV
  227. % VERSION 2.1
  228. % RELEASE 11-MAR-90
  229. exports isimp1,replace_by_vector,replace_by_vectorp,gamma5p$
  230. imports calc_spur,isimp2$
  231. switch cvit$ % CVITANOVICH ALGORITHM SWITCH
  232. !*cvit := t$ % DEFAULT ON
  233. %************ ISIMP1 REDEFINITION ************************
  234. remflag('(isimp1),'lose)$
  235. symbolic procedure isimp1(u,i,v,w,x)$
  236. if null u then nil
  237. else if domainp u
  238. then if x then multd(u,if !*cvit
  239. then calc_spurx (i,v,w,x)
  240. else spur0 (car x,i,v,w,cdr x)
  241. )
  242. else if v then multd(u,index_simp (1,i,v,w))
  243. else if w then multfs(emult w,isimp1(u,i,v,nil,nil))
  244. else u
  245. else addfs(isimp2(car u,i,v,w,x),isimp1(cdr u,i,v,w,x))$
  246. flag('(isimp1),'lose)$
  247. %************* INDEX_SIMP *******************************
  248. symbolic procedure index_simp (u,i,v,w)$
  249. if v then index_simp (multf(mksprod(caar v,cdar v),u),
  250. update_index (i,car v),cdr v,w)
  251. else isimp1(u,i,nil,w,nil)$
  252. symbolic procedure mksprod(x,y)$
  253. mkdot(if indexp x then replace_by_vector x else x,
  254. if indexp y then replace_by_vector y else y)$
  255. symbolic procedure update_index (i,v)$
  256. % I - LIST OF UNMATCH INDICES
  257. % V - PAIR: (I/V . I/V)
  258. % VALUE - UPDATE LIST OF INDICES
  259. delete(cdr v,delete(car v,i))$
  260. %************ CALC_SPURX - MAIN PROCEDURE ***************
  261. symbolic procedure calc_spurx (i,v,w,x)$
  262. % I - LIST OF INDICES
  263. % V - LIST OF SCALAR PRODUCT:(<I/V> . <I/V>)
  264. % W - EPS-EXPR
  265. % X - LIST OF SPURS
  266. % VALUE - CALCULATED SPUR(S.F.)
  267. begin scalar u, % SPUR: (LNAME G5SWITCH I/V I/V ... )
  268. x1, % (UN ... U1)
  269. dindices!*,% A-LIST OF DUMMY INDICES: (I . NIL/T)
  270. c$ % COEFFICIENT GENERATIED BY GX*GX
  271. if numberp ndims!* and null evenp ndims!*
  272. then cviterr list('calc_spur,":",ndims!*,
  273. "is not even dimension of G-matrix space")$
  274. c := 1$ % INITIAL VALUE
  275. while x
  276. do << if nospurp caar x
  277. then cviterr list "Nospur not yet implemented"$
  278. u := cdar x$
  279. x := cdr x$
  280. if car u
  281. then if evenp ndims!*
  282. then u := next_gamma5() . reverse cdr u
  283. else cviterr
  284. list("G5 invalid for non even dimension")
  285. else u := reverse cdr u$
  286. if null u then nil % SP()
  287. else if null evenp length(if gamma5p car u and cdr u
  288. then cdr u
  289. else u)
  290. then x := c := nil % ODD - VALUE=0
  291. else << u := remove_gx!*gx u$
  292. c := multf(car u,c)$
  293. u := replace_vector(cdr u,i,v,w)$
  294. i := cadr u$
  295. v := caddr u$
  296. w := cadddr u$
  297. if u then x1 := car u . x1
  298. >>
  299. >>$
  300. x1 := if null c then nil ./ 1 % ZERO
  301. else if x1 then multsq(c ./ 1,calc_spur x1)
  302. else c ./ 1$
  303. if denr x1 neq 1 then cviterr list('calc_spurx,":",x1,
  304. "has non unit denominator")$
  305. clear_windices ()$
  306. clear_gamma5 ()$
  307. return isimp1(numr x1,i,v,w,nil)
  308. end$
  309. symbolic procedure third_eq_indexp i$
  310. begin scalar z$
  311. if null(z := assoc(i,dindices!*))
  312. then dindices!* := (i . nil) . dindices!*
  313. else if null cdr z
  314. then dindices!* := (i . t) . delete(z,dindices!*)$
  315. return if z then cdr z else nil
  316. end$
  317. symbolic procedure replace_vector(u,i,v,w)$
  318. % U - SPUR (INVERSE)
  319. % I - LIST OF UNMATCH INDICES
  320. % V - A-LIST OF SCALAR PRODUCT
  321. % W - EPS-EXPRESION
  322. % VALUE - LIST(U,UPDATE I,UPDATE V,UPDATE W)
  323. begin scalar z,y,x, % WORK VARIABLES
  324. u1$ % SPUR WITHOUT VECTOR
  325. while u
  326. do << z := car u$
  327. u := cdr u$
  328. if indexp z
  329. then << % REMOVE DUMMY INDICES
  330. while (y := bassoc(z,v))
  331. do << i := delete(z,i)$
  332. v := delete(y,v)$
  333. % W := ....
  334. x := if z eq car y then cdr y
  335. else car y$
  336. if indexp x then z := x
  337. else if gamma5p x
  338. then cviterr list "G5 bad structure"
  339. else replace_by_index (x,z)
  340. >>$
  341. u1 := z . u1
  342. >>
  343. else if gamma5p z then u1 := z . u1
  344. else << z := replace_by_index (z,next_windex())$
  345. u1 := z . u1
  346. >>
  347. >>$
  348. return list(reverse u1,i,v,w)
  349. end$
  350. symbolic procedure replace_by_index (v,y)$
  351. begin scalar z$
  352. if (z := replace_by_vectorp y) eq v
  353. then cviterr list('replace_by_index,":",y,
  354. "is already defined for vector",z)$
  355. put(y,'replace_by_vector ,v)$
  356. return y
  357. end$
  358. symbolic procedure remove_gx!*gx u$
  359. begin scalar x,c$
  360. integer l,l1$
  361. c := 1$
  362. l1 := l := length u$
  363. u := for each z in u % MAKE COPY
  364. collect << if indexp z then
  365. if third_eq_indexp z
  366. then cviterr list("Three indices have name",z)
  367. else nil
  368. else if null hvectorp z then
  369. if cvitdeclp(z,'vector)
  370. then vector1 list z
  371. else cviterr nil
  372. else nil$
  373. z
  374. >>$
  375. if l < 2 then return u$
  376. x := u$
  377. while cdr x do x := cdr x$
  378. rplacd(x,u)$ % MAKE CYCLE
  379. while l1 > 0
  380. do if car u eq cadr u % EQUAL ?
  381. then << c := multf(if indexp car u then ndims!*
  382. else mkdot(car u,car u)
  383. ,c)$
  384. rplaca(u,caddr u)$ % YES - DELETE
  385. rplacd(u,cdddr u)$
  386. l1 := l := l - 2
  387. >>
  388. else << u := cdr u$ % NO - CHECK NEXT PAIR
  389. l1 := l1 - 1
  390. >>$
  391. x := cdr u$
  392. rplacd(u,nil)$ % CUT CYCLE
  393. return (c . if cdr x and car x eq cadr x then nil else x)
  394. end$
  395. %************* ERROR,MESSAGE *****************************
  396. symbolic procedure cviterr u$
  397. << clear_windices()$
  398. clear_gamma5()$
  399. if u then rederr u else error(0,nil) >>$
  400. symbolic procedure cvitdeclp(u,v)$
  401. if null !*msg then nil
  402. else if terminalp()
  403. then yesp list("Declare",u,v,"?")
  404. else << lprim list(u,"Declare",v)$ t >>$
  405. %*********** WORK INDICES & VECTOR ***********************
  406. symbolic procedure clear_windices ()$
  407. while car windices!*
  408. do begin scalar z$
  409. z := caar windices!*$
  410. windices!* := cdar windices!* . z . cdr windices!*$
  411. remprop(z,'replace_by_vector)$
  412. indices!* := delete(z,indices!*)$
  413. end$
  414. symbolic procedure next_windex()$
  415. begin scalar i$
  416. windices!* := if null cdr windices!*
  417. then (intern gensym() . car windices!*) .
  418. cdr windices!*
  419. else (cadr windices!* . car windices!*) .
  420. cddr windices!*$
  421. i := caar windices!*$
  422. vector1 list i$
  423. indices!* := i . indices!*$
  424. return i
  425. end$
  426. symbolic procedure next_gamma5()$
  427. begin scalar v$
  428. cviterr list "GAMMA5 is not yet implemented. use OFF CVIT";
  429. gamma5!* := if null cdr gamma5!*
  430. then (intern gensym() . car gamma5!*) .
  431. cdr gamma5!*
  432. else (cadr gamma5!* . car gamma5!*) .
  433. cddr gamma5!*$
  434. v := list caar gamma5!*$
  435. vector1 v$
  436. return car v
  437. end$
  438. %************ END ****************************************
  439. %prin2t "_Cvitanovich_algorithm_is_ready"$
  440. endmodule$
  441. module map_to_strand$
  442. %************* TRANSFORMATION OF MAP TO STRAND **********************$
  443. % $
  444. % 25.11.87 $
  445. % $
  446. %********************************************************************$
  447. exports color!-strand,contract!-strand $
  448. imports nil$
  449. %---------------- utility added 09.06.90 ---------------------------
  450. symbolic procedure constimes u;
  451. % u=list of terms
  452. % inspect u, delete all 1's
  453. % and form smar product $
  454. cstimes(u,nil)$
  455. symbolic procedure cstimes(u,s);
  456. if null u then
  457. if null s then 1
  458. else if null cdr s then car s
  459. else 'times . s
  460. else if car u = 1 then cstimes(cdr u,s)
  461. else cstimes(cdr u,car u . s)$
  462. symbolic procedure consrecip u;
  463. % do same as consTimes
  464. if or(car u = 1,car u = -1) then car u
  465. else 'recip . u$
  466. symbolic procedure listquotient(u,v)$
  467. % the same !!!
  468. if v=1 then u
  469. else
  470. if v = u then 1
  471. else list('quotient,u,v)$
  472. symbolic procedure consplus u;
  473. % u=list of terms
  474. % inspect u, delete all 0's
  475. % and form smar sum $
  476. csplus(u,nil)$
  477. symbolic procedure csplus(u,s);
  478. if null u then
  479. if null s then 0
  480. else if null cdr s then car s
  481. else 'plus . s
  482. else if car u = 0 then csplus(cdr u,s)
  483. else csplus(cdr u,car u . s)$
  484. %--------------------------------------------------------------------
  485. %---------------- CONVERTING OF MAP TO STRAND DIAGRAM ---------------$
  486. symbolic procedure map_!-to!-strand(edges,map_)$
  487. %.....................................................................
  488. % ACTION: CONVERTS "MAP_" WITH "EDGES" INTO STRAND DIAGRAM.
  489. % STRAND ::= <LIST OF STRAND VERTICES>,
  490. % STRAND VERTEX ::= <SVERTEX NAME> . (<LIST1 OF ROADS> <LIST2 ...>),
  491. % ROAD ::= <ATOM> . <NUMBER>.
  492. % LIST1,2 CORRESPOND TO OPPOSITE SIDES OF STRAND VERTEX.
  493. % ROADS LISTED CLOCKWISE.
  494. %....................................................................$
  495. if null edges then nil
  496. else mk!-strand!-vertex(car edges,map_) .
  497. map_!-to!-strand(cdr edges,map_)$
  498. %YMBOLIC PROCEDURE MAP_!-TO!-STRAND(EDGES,MAP_)$
  499. %F NULL EDGES THEN NIL
  500. %LSE (LAMBDA SVERT$ IF SVERT THEN SVERT .
  501. % MAP_!-TO!-STRAND(CDR EDGES,MAP_)
  502. % ELSE MAP_!-TO!-STRAND(CDR EDGES,MAP_) )
  503. % MK!-STRAND!-VERTEX(CAR EDGES,MAP_)$
  504. symbolic procedure mk!-strand!-vertex(edge,map_)$
  505. begin
  506. scalar vert1,vert2,tail$
  507. tail:=incident(edge,map_,1)$
  508. vert1:=car tail$
  509. tail:=incident(edge,cdr tail,add1 cdar vert1)$
  510. vert2:= if null tail then mk!-external!-leg edge
  511. else car tail$
  512. return %F NULL VERT2 THEN NIL
  513. mk!-strand!-vertex2(edge,vert1,vert2)
  514. end$
  515. symbolic procedure incident(edge,map_,vertno)$
  516. if null map_ then nil
  517. else (lambda z$ if z then z . cdr map_
  518. else incident(edge,cdr map_,add1 vertno) )
  519. incident1( edge,car map_,vertno)$
  520. symbolic procedure incident1(edname,vertex,vertno)$
  521. if eq(edname,s!-edge!-name car vertex) then
  522. mk!-road!-name(cadr vertex,caddr vertex,vertno)
  523. else if eq(edname,s!-edge!-name cadr vertex) then
  524. mk!-road!-name(caddr vertex,car vertex,vertno)
  525. else if eq(edname,s!-edge!-name caddr vertex) then
  526. mk!-road!-name(car vertex,cadr vertex,vertno)
  527. else nil$
  528. symbolic procedure mk!-strand!-vertex2(edge,vert1,vert2)$
  529. list(edge, vert1, vert2)$
  530. %------------------ COLOURING OF ROADS IN STRAND --------------------$
  531. symbolic procedure color!-strand(alst,map_,count)$
  532. %.....................................................................
  533. % ACTION: GENERATE REC. ALIST COLORING STRAND, CORRESPONDING TO "MAP_".
  534. % COLORING OF STRAND INDUCED BY "MAP_" COLORING, DEFINED BY ALIST
  535. % "ALST". "COUNT" COUNTS MAP_ VERTICES. INITIALLY IS 1.
  536. % REC.ALIST::= ( ... <(ATOM1 . COL1 ATOM2 . COL2 ...) . NUMBER> ... )
  537. % WHERE COL1 IS COLOR OF ROAD=ATOM1 . NUMBER.
  538. %....................................................................$
  539. if null map_ then nil
  540. else (color!-roads(alst,car map_) . count) .
  541. color!-strand(alst,cdr map_,add1 count)$
  542. symbolic procedure color!-roads(alst,vertex)$
  543. begin
  544. scalar e1,e2,e3,lines$
  545. e1:=getedge(s!-edge!-name car vertex,alst)$
  546. e2:=getedge(s!-edge!-name cadr vertex,alst)$
  547. e3:=getedge(s!-edge!-name caddr vertex,alst)$
  548. lines:=(e1+e2+e3)/2$
  549. e1:=lines-e1$
  550. e2:=lines-e2$
  551. e3:=lines-e3$
  552. return list(
  553. s!-edge!-name car vertex . e1,
  554. s!-edge!-name cadr vertex . e2,
  555. s!-edge!-name caddr vertex . e3)
  556. end$
  557. symbolic procedure zero!-roads l$
  558. %---------------------------------------------------------------------
  559. % L IS OUTPUT OF COLOR!-STRAND
  560. %--------------------------------------------------------------------$
  561. if null l then nil
  562. else (lambda z$ if z then z . zero!-roads cdr l
  563. else zero!-roads cdr l)
  564. z!-roads car l$
  565. symbolic procedure z!-roads y$
  566. (lambda w$ w and (car w . cdr y))
  567. ( if (0=cdr caar y)then caar y
  568. else if (0=cdr cadar y) then cadar y
  569. else if (0=cdr caddar y) then caddar y
  570. else nil)$
  571. %------------------- CONTRACTION OF STRAND --------------------------$
  572. symbolic procedure deletez1(strand,alst)$
  573. %.....................................................................
  574. % ACTION: DELETES FROM "STRAND" VERTICES WITH NAMES HAVING 0-COLOR
  575. % VIA MAP_-COLORING ALIST "ALST".
  576. %....................................................................$
  577. if null strand then nil
  578. else if 0 = cdr assoc(caar strand,alst) then
  579. deletez1(cdr strand,alst)
  580. else car strand . deletez1(cdr strand,alst)$
  581. symbolic procedure contract!-strand(strand,slst)$
  582. %.....................................................................
  583. % ACTION: CONTRACTS "STRAND".
  584. % "SLST" IS REC. ALIST COLORING "STRAND"
  585. %....................................................................$
  586. contr!-strand(strand,zero!-roads slst)$
  587. symbolic procedure contr!-strand(strand,zlst)$
  588. if null zlst then strand
  589. else contr!-strand(contr1!-strand(strand,car zlst),cdr zlst)$
  590. symbolic procedure contr1!-strand(strand,rname)$
  591. contr2!-strand(strand,rname,nil,nil)$
  592. symbolic procedure contr2!-strand(st,rname,rand,flag_)$
  593. if null st then rand
  594. else (lambda z$
  595. if z then
  596. if member(car z,cdr z) then sappend(st,rand) % 16.12 ****$
  597. else
  598. if null flag_ then
  599. contr2!-strand(contr2(z,cdr st,rand),rname,nil,t)
  600. else contr2(z,cdr st,rand)
  601. else contr2!-strand(cdr st,rname,car st . rand,nil) )
  602. contrsp(car st,rname)$
  603. symbolic procedure contrsp(svertex,rname)$
  604. contrsp2(cadr svertex,caddr svertex,rname)
  605. or
  606. contrsp2(caddr svertex,cadr svertex,rname)$
  607. symbolic procedure contrsp2(l1,l2,rname)$
  608. if 2 = length l1 then
  609. if rname = car l1 then (cadr l1) . l2
  610. else if rname = cadr l1 then (car l1) . l2
  611. else nil$
  612. symbolic procedure contr2(single,st,rand)$
  613. if null st then contr(single,rand)
  614. else if null rand then contr(single,st)
  615. else split!-road(single,car st) . contr2(single,cdr st,rand)$
  616. symbolic procedure contr(single,strand)$
  617. if null strand then nil
  618. else split!-road(single,car strand) . contr(single,cdr strand)$
  619. symbolic procedure split!-road(single,svertex)$
  620. list(car svertex,
  621. sroad(car single,cdr single,cadr svertex),
  622. sroad(car single,cdr single,caddr svertex))$
  623. symbolic procedure sroad(line_,lines,lst)$
  624. if null lst then nil
  625. else if line_ = car lst then sappend(lines,cdr lst)
  626. else car lst . sroad(line_,lines,cdr lst)$
  627. endmodule$
  628. %********************************************** **********************
  629. %******************** INTERACTION WITH ALG MODE **********************
  630. %******************** 11.12.87 **********************
  631. %******************** VARIANT WITHOUT NONLOCALS **********************
  632. %********************************************************************$
  633. module eval_map_s$
  634. exports strand!-alg!-top $
  635. imports color!-strand,contract!-strand $
  636. lisp$
  637. %------------------ AUXILIARRY ROUTINES -----------------------------$
  638. symbolic procedure permpl(u,v)$
  639. if null u then t
  640. else if car u = car v then permpl(cdr u,cdr v)
  641. else not permpl(cdr u,l!-subst1(car v,car u,cdr v))$
  642. symbolic procedure repeatsp u$
  643. if null u then nil
  644. else (member(car u,cdr u) or repeatsp cdr u )$
  645. symbolic procedure l!-subst1(new,old,l)$
  646. if null l then nil
  647. else if old = car l then new . cdr l
  648. else (car l) . l!-subst1(new,old,cdr l)$
  649. %-------------------FORMING ANTISYMMETRIHERS -----------------------$
  650. symbolic procedure propagator(u,v)$
  651. if null u then 1
  652. else if (repeatsp u) or (repeatsp v) then 0
  653. else 'plus . propag(u,permutations v,v)$
  654. symbolic procedure propag(u,l,v)$
  655. if null l then nil
  656. else (if permpl(v,car l) then 'times . prpg(u,car l)
  657. else list('minus,'times . prpg(u,car l) ) ) . propag(u,cdr l,v)$
  658. symbolic procedure prpg(u,v)$
  659. if null u then nil
  660. else list('cons,car u,car v) . prpg(cdr u,cdr v)$
  661. symbolic procedure line(x,y)$
  662. propagator(cdr x,cdr y)$
  663. %------------------ INTERFACE WITH CVIT3 ---------------------------$
  664. symbolic procedure strand!-alg!-top(strand,map_,edlst)$
  665. begin
  666. scalar rlst$
  667. strand:=deletez1(strand,edlst)$
  668. rlst:=color!-strand(edlst,map_,1)$
  669. strand:=contract!-strand(strand,rlst) $
  670. %RINT STRAND$ TERPRI()$
  671. %RINT RLST$ TERPRI()$
  672. %RINT EDLST$ TERPRI()$
  673. return dstr!-to!-alg(strand,rlst,nil)
  674. %ATHPRINT REVAL(W)$ RETURN W
  675. end$
  676. symbolic procedure mktails(side,rlst,dump)$
  677. begin
  678. scalar pntr,newdump,w,z$
  679. if null side then return nil . dump$
  680. pntr:=side$
  681. newdump:=dump$
  682. while pntr do << w:=mktails1(car pntr,rlst,newdump)$
  683. newdump:=cdr w$
  684. z:=sappend(car w,z)$
  685. pntr:=cdr pntr >>$
  686. return z . newdump
  687. end$
  688. symbolic procedure mktails1(rname,rlst,dump)$
  689. begin
  690. scalar color,prename,z$
  691. color:=getroad(rname,rlst)$
  692. if 0 = color then return nil . dump$
  693. if 0 = cdr rname then
  694. return (list replace_by_vector car rname) . dump$
  695. % IF FREEIND CAR RNAME THEN RETURN (LIST CAR RNAME) . DUMP$
  696. z:=assoc(rname,dump)$
  697. if z then return
  698. if null cddr z then cdr z . dump
  699. else (sreverse cdr z) . dump$
  700. % PRENAME:=APPEND(EXPLODE CAR RNAME,EXPLODE CDR RNAME)$
  701. prename:=rname$
  702. z:= mkinds(prename,color)$
  703. return z . ((rname . z) . dump)
  704. end$
  705. symbolic procedure mkinds(prename,color)$
  706. if color = 0 then nil
  707. else
  708. begin
  709. scalar indx$
  710. % INDX:=INTERN COMPRESS APPEND(PRENAME,EXPLODE COLOR)$
  711. indx:= prename . color $
  712. return indx . mkinds(prename,sub1 color)
  713. end$
  714. symbolic procedure getroad(rname,rlst)$
  715. if null rlst then 1 % ******EXT LEG IS ALWAYS SUPPOSET TO BE SIMPLE $
  716. else if cdr rname = cdar rlst then
  717. cdr qassoc(car rname,caar rlst)
  718. else getroad(rname,cdr rlst) $
  719. symbolic procedure qassoc(atm,alst)$
  720. if null alst then nil
  721. else if eq(atm,caar alst) then car alst
  722. else qassoc(atm,cdr alst)$
  723. %------------- INTERACTION WITH RODIONOV ---------------------------$
  724. symbolic procedure from!-rodionov x$
  725. begin scalar strand,edges,edgelsts,map_,w$
  726. edges:=car x$
  727. map_:=cadr x$
  728. edgelsts:=cddr x$
  729. strand := map_!-to!-strand(edges,map_)$
  730. w:= for each edlst in edgelsts collect
  731. strand!-alg!-top(strand,map_,edlst)$
  732. return reval('plus . w )
  733. end$
  734. symbolic procedure top1 x$
  735. mathprint from!-rodionov to_taranov x$
  736. %----------------------- COMBINATORIAL COEFFITIENTS -----------------$
  737. symbolic procedure f!^(n,m)$
  738. if n<m then cviterr "Incorrect args of f!^"
  739. else if n = m then 1
  740. else n*f!^(sub1 n,m)$
  741. %% This exists in basic REDUCE these days -- JPff
  742. %%symbolic procedure factorial n$
  743. %%f!^(n,0)$
  744. symbolic procedure mk!-coeff1(alist,rlst)$
  745. if null alist then 1
  746. else
  747. eval ('times .
  748. for each x in alist collect factorial getroad(car x,rlst) )$
  749. %--------------- CONTRACTION OF DELTA'S -----------------------------$
  750. symbolic procedure prop!-simp(l1,l2)$
  751. prop!-simp1(l1,l2,nil,0,1)$
  752. symbolic procedure prop!-simp1(l1,l2,s,lngth,sgn)$
  753. if null l2 then list(lngth,sgn) . (l1 . sreverse s)
  754. else
  755. (lambda z$ if null z then
  756. prop!-simp1(l1,cdr l2,car l2 . s,lngth,sgn)
  757. else prop!-simp1(cdr z,cdr l2,s,add1 lngth,
  758. (car z)*sgn*(-1)**(length s)) )
  759. prop!-simp2(l1,car l2)$
  760. symbolic procedure prop!-simp2(l,ind)$
  761. begin
  762. scalar sign$
  763. if sign:=index!-in(ind,l) then
  764. return ((-1)**(length(l)-length(sign))) . delete(ind,l)
  765. else return nil
  766. end$
  767. symbolic procedure mk!-contract!-coeff u$
  768. if caar u = 0 then 1
  769. else
  770. begin
  771. scalar numr,denr,pk,k$
  772. pk:=caar u$
  773. k:=length cadr u$
  774. numr:=constimes ((cadar u) .mk!-numr(ndim!*,k,k+pk))$
  775. % denr:=f!^(pk+k,k)*(cadar u)$
  776. return numr
  777. end$
  778. symbolic procedure mk!-numr(n,k,p)$
  779. if k=p then nil
  780. else (if k=0 then n else list('difference,n,k)) . mk!-numr(n,add1 k,p)$
  781. symbolic procedure mod!-index(term,dump)$
  782. %-------------------------------------------------------------------
  783. % MODYFIES INDECES OF "DUMP" VIA DELTAS IN "TERM"
  784. % DELETES UTILIZED DELTAS FROM "TERM"
  785. % RETURNS "TERM" . "DUMP"
  786. %------------------------------------------------------------------$
  787. begin
  788. scalar coeff,sign$
  789. coeff:=list 1$
  790. term:= if sign:= eq(car term,'minus) then cdadr term
  791. else cdr term$
  792. while term do << if free car term then
  793. coeff:=(car term) . coeff
  794. else dump:=mod!-dump(cdar term,dump)$
  795. term:=cdr term >>$
  796. return
  797. ( if sign then
  798. if null cdr coeff then (-1)
  799. else 'minus . list(constimes coeff)
  800. else if null cdr coeff then 1
  801. else constimes coeff ) . dump
  802. end$
  803. symbolic procedure dpropagator(l1,l2,dump)$
  804. (lambda z$
  805. if z=0 then z
  806. else if z=1 then nil . dump
  807. else for each trm in cdr z collect
  808. mod!-index(trm,dump) )
  809. propagator(l1,l2)$
  810. symbolic procedure dvertex!-to!-projector(svert,rlst,dump)$
  811. begin
  812. scalar l1,l2,coeff,w$
  813. l1:=mktails(cadr svert,rlst,dump)$
  814. if repeatsp car l1 then return 0$
  815. l2:= mktails(caddr svert,rlst,cdr l1)$
  816. if repeatsp car l2 then return 0$
  817. dump:=cdr l2$
  818. w:=prop!-simp(car l1,sreverse car l2)$
  819. coeff:=mk!-contract!-coeff w$
  820. return coeff . dpropagator(cadr w,cddr w,dump)
  821. end$
  822. %SYMBOLIC PROCEDURE DSTR!-TO!-ALG(STRAND,RLST,DUMP)$
  823. %IF NULL STRAND THEN LIST('RECIP,MK!-COEFF1(DUMP,RLST))
  824. %ELSE
  825. % BEGIN
  826. % SCALAR VRTX$
  827. % VRTX:=DVERTEX!-TO!-PROJECTOR(CAR STRAND,RLST,DUMP)$
  828. % IF 0=VRTX THEN RETURN 0$
  829. % IF NULL CADR VRTX THEN RETURN
  830. % LIST('TIMES,CAR VRTX,DSTR!-TO!-ALG(CDR STRAND,RLST,CDDR VRTX))$
  831. %
  832. % RETURN LIST('TIMES,CAR VRTX,
  833. % 'PLUS . (FOR EACH TRM IN CDR VRTX COLLECT
  834. % LIST('TIMES,CAR TRM,DSTR!-TO!-ALG(CDR STRAND,RLST,CDR TRM))) )
  835. %===MODYFIED 4.07.89
  836. remflag('(dstr!-to!-alg),'lose)$
  837. symbolic procedure dstr!-to!-alg(strand,rlst,dump)$
  838. %IF NULL STRAND THEN LIST('RECIP,MK!-COEFF1(DUMP,RLST))
  839. if null strand then consrecip list(mk!-coeff1(dump,rlst))
  840. else
  841. begin
  842. scalar vrtx$
  843. vrtx:=dvertex!-to!-projector(car strand,rlst,dump)$
  844. if 0=vrtx then return 0$
  845. if null cadr vrtx then return
  846. if 1 = car(vrtx) then
  847. dstr!-to!-alg(cdr strand,rlst,cddr vrtx)
  848. else
  849. cvitimes2(car vrtx,
  850. dstr!-to!-alg(cdr strand,rlst,cddr vrtx))$
  851. return
  852. cvitimes2(car vrtx,
  853. consplus (for each trm in cdr vrtx collect
  854. cvitimes2(car trm,
  855. dstr!-to!-alg(cdr strand,rlst,
  856. cdr trm))))$
  857. end$
  858. flag('(dstr!-to!-alg),'lose)$
  859. symbolic procedure cvitimes2(x,y)$
  860. if (x=0) or (y=0) then 0
  861. else if x = 1 then y
  862. else if y = 1 then x
  863. else list('times,x,y)$
  864. symbolic procedure free dlt$
  865. (freeind cadr dlt) and (freeind caddr dlt)$
  866. symbolic procedure freeind ind$
  867. atom ind $
  868. % AND
  869. %LAGP(IND,'EXTRNL)$
  870. symbolic procedure mod!-dump(l,dump)$
  871. if not freeind car l then mod!-dump1(cadr l,car l,dump)
  872. else mod!-dump1(car l,cadr l,dump)$
  873. symbolic procedure mod!-dump1(new,old,dump)$
  874. if null dump then nil
  875. else ( (caar dump) . l!-subst(new,old,cdar dump) ) .
  876. mod!-dump1(new,old,cdr dump)$
  877. symbolic procedure l!-subst(new,old,l)$
  878. if null l then nil
  879. else if old = car l then new . l!-subst(new,old,cdr l)
  880. else car l . l!-subst(new,old,cdr l) $
  881. endmodule$
  882. %********************************************************************$
  883. % $
  884. % INTERFACE WITH RODIONOV!-FIERZING ROUTE. 17.02.88 $
  885. % $
  886. %********************************************************************$
  887. module interfierz$
  888. exports calc_map_tar,calc_den_tar,pre!-calc!-map_ $
  889. imports mk!-numr,map_!-to!-strand $
  890. lisp$
  891. %----------- DELETING VERTS WITH _0'S ------------------------------$
  892. %symbolic procedure sort!-map_(map_,tadepoles,deltas,s)$
  893. %if null map_ then list(s,tadepoles,deltas)
  894. %else
  895. % begin
  896. % scalar vert,edges$
  897. % vert:=incident1('!_0,car map_,'ll)$
  898. % return
  899. % if null vert then sort!-map_(cdr map_,tadepoles,deltas,
  900. % car map_ . s)
  901. % else if car vert = cadr vert then
  902. % sort!-map_(cdr map_,caar vert . tadepoles,deltas,s)
  903. % else sort!-map_(cdr map_,tadepoles,list('cons,caar vert,
  904. % caadr vert) . deltas,s)
  905. % end$
  906. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  907. %%%%% modified 17.09.90 A.Taranov %%%%%%%%%%%%%%%%%%%%%
  908. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  909. symbolic procedure sort!-map_(map_,tadepoles,deltas,poles,s)$
  910. % tadepoles are verts with 1 0_ edge and contracted others
  911. % deltas are verts with 1 0_ edge
  912. % poles are verts with at list 2 0_ edges
  913. if null map_ then list(s,tadepoles,deltas,poles)
  914. else
  915. begin
  916. scalar vert,tdp$
  917. vert:=incident1('!_0,car map_,'ll)$
  918. if null vert then tdp:=tadepolep car map_
  919. else %%%% vertex contain !_0 edge
  920. return
  921. if (caar vert = '!_0) then
  922. sort!-map_(cdr map_,tadepoles,deltas,caadr vert . poles,s)
  923. else if (caadr vert = '!_0) then
  924. sort!-map_(cdr map_,tadepoles,deltas,caar vert . poles,s)
  925. else if car vert = cadr vert then
  926. sort!-map_(cdr map_,caar vert . tadepoles,deltas,
  927. poles,s)
  928. else sort!-map_(cdr map_,tadepoles,list('cons,
  929. caar vert,caadr vert) . deltas,poles,
  930. s)$
  931. %%%%% here car Map_ was checked to be a real tadpole
  932. return
  933. if null tdp then sort!-map_(cdr map_,tadepoles,deltas,
  934. poles,car map_ . s)
  935. else sort!-map_(cdr map_,cadr tdp . tadepoles,deltas,
  936. caar tdp . poles,s)
  937. end$
  938. symbolic procedure tadepolep vrt; %%%%%% 17.09.90
  939. % return edge1 . edge2 if vrt is tadpole,
  940. % NIL otherwise.
  941. % edge1 correspond to 'pole', edge2 - to 'loop' of a tadpole.
  942. if car vrt = cadr vrt then caddr vrt . car vrt
  943. else if car vrt = caddr vrt then cadr vrt . car vrt
  944. else if cadr vrt = caddr vrt then car vrt . cadr vrt
  945. else nil;
  946. symbolic procedure del!-tades(tades,edges)$
  947. if null tades then edges
  948. else del!-tades(cdr tades,delete(car tades,edges))$
  949. symbolic procedure del!-deltas(deltas,edges)$
  950. if null cdr deltas then edges
  951. else del!-deltas(cdr deltas,del!-tades(cdar deltas,edges))$
  952. %--------------- EVALUATING MAP_S -----------------------------------$
  953. symbolic procedure pre!-calc!-map_(map_,edges)$
  954. % : (STRAND NEWMAP_ TADEPOLES DELTAS)$
  955. begin
  956. scalar strand,w$
  957. w:=sort!-map_(map_,nil,list 1,nil,nil)$
  958. % delete from edge list deltas,poles and tades
  959. edges:=del!-deltas(caddr w,
  960. del!-tades(cadr w,delete('!_0,edges)))$
  961. strand:= if car w then map_!-to!-strand(edges,car w)
  962. else nil$
  963. return strand . w
  964. end$
  965. symbolic procedure calc_map_tar(gstrand,alst)$
  966. % THIRD VERSION.$
  967. begin
  968. scalar poles,edges,strand,deltas,tades,map_$
  969. strand:=car gstrand$
  970. map_:=cadr gstrand$
  971. tades:=caddr gstrand $
  972. deltas:=car cdddr gstrand $
  973. poles:= car cddddr gstrand $
  974. if ev!-poles(poles,alst) then return 0; %%%%% result is zero
  975. return constimes list(constimes deltas,
  976. constimes ev!-tades(tades,alst),
  977. (if null map_ then 1
  978. else strand!-alg!-top(strand,map_,alst)))
  979. end$
  980. symbolic procedure ev!-poles(poles,alst)$ %%% 10.09.90
  981. if null poles then nil
  982. else if getedge(car poles,alst) = 0 then ev!-poles(cdr poles,alst)
  983. else poles$
  984. symbolic procedure ev!-deltas(deltas)$
  985. if null deltas then list 1
  986. else ('cons . car deltas) . ev!-deltas(cdr deltas)$
  987. symbolic procedure ev!-tades(tades,alst)$
  988. if null tades then list 1
  989. else binc(ndim!*,getedge(car tades,alst))
  990. . ev!-tades(cdr tades,alst)$
  991. %------------------------ DENOMINATOR CALCULATION -------------------$
  992. symbolic procedure ev!-edgeloop(edge,alst)$
  993. % EVALUATES LOOP OF 'EDGE' COLORED VIA 'ALST'$
  994. binc(ndim!*,getedge(s!-edge!-name edge,alst) )$
  995. symbolic procedure ev!-denom2(vert,alst)$
  996. % EVALUATES DENOM FOR PROPAGATOR$
  997. ev!-edgeloop(car vert,alst)$
  998. symbolic procedure ev!-denom3(vert,alst)$
  999. % EVALUATES DENOM FOR 3 - VERTEX$
  1000. begin
  1001. scalar e1,e2,e3,lines,sign,!3j,numr$
  1002. e1:=getedge(s!-edge!-name car vert,alst)$
  1003. e2:=getedge(s!-edge!-name cadr vert,alst)$
  1004. e3:=getedge(s!-edge!-name caddr vert,alst)$
  1005. lines:=(e1+e2+e3)/2$
  1006. e1:=lines-e1$
  1007. e2:=lines-e2$
  1008. e3:=lines-e3$
  1009. sign:=(-1)**(e1*e2+e1*e3+e2*e3)$
  1010. numr:=mk!-numr(ndim!*,0,lines)$
  1011. numr:=(if numr then (constimes numr)
  1012. else 1)$
  1013. !3j:=listquotient(numr,
  1014. factorial(e1)*factorial(e2)*factorial(e3)*sign)$
  1015. return !3j
  1016. end$
  1017. symbolic procedure binc(n,p)$
  1018. % BINOMIAL COEFF C(N,P)$
  1019. if 0 = p then 1 else
  1020. listquotient(constimes mk!-numr(n,0,p),factorial p)$
  1021. symbolic procedure calc_den_tar(den_,alst)$
  1022. (lambda u$ if null u then 1
  1023. else if null cdr u then car u
  1024. else constimes u )
  1025. denlist(den_,alst)$
  1026. symbolic procedure denlist(den_,alst)$
  1027. if null den_ then nil
  1028. else if length car den_ = 2 then
  1029. ev!-denom2(car den_,alst) . denlist(cdr den_,alst)
  1030. else ev!-denom3(car den_,alst) . denlist(cdr den_,alst)$
  1031. endmodule$
  1032. module cvitmapping$
  1033. exports calc_spur$
  1034. imports simp!*,reval,calc_map_tar ,calc_den_tar,spaces$
  1035. % SIMP!* AND REVAL REDUCE SYSTEM GENERAL FUNCTIONS FOR
  1036. % EVALUATING ALGEBRAIC EXPRESSIONS.
  1037. %*********************************************************************
  1038. % *
  1039. % FOR CVITANOVIC GAMMA MATRICES *
  1040. % CALCULATIONS *
  1041. % *
  1042. % *
  1043. % 18.03.88 10.06.90 15.06.90 31.08.90 *
  1044. % 01.09.90 11.09.90 14.09.90 *
  1045. %********************************************************************$
  1046. lisp$
  1047. % 07.06.90 all MAP was replaced by MAP_
  1048. % 07.06.90 all DEN was replaced by DEN_
  1049. % 07.06.90 all PROP was replaced by PROP_
  1050. % SOME FUNCTIONS WAS MOVED TO SMACRO SECTION 08.06.90 10.06.90
  1051. %**********************************************************************
  1052. % *
  1053. % _DATA_STRUCTURE *
  1054. % *
  1055. % WORLD::=(EDGELIST,VARIANTS,WORLD1) *
  1056. % WORLD1::=(MAP_2,COEFF,DEN_OM) *
  1057. % MAP_2::=(MAP_S,VARIANTS,PLAN) *
  1058. % MAP_S::=(EDGEPAIR . GSTRAND) *
  1059. % MAP_1::=(EDGEPAIR . MAP_) *
  1060. % EDGEPAIR::=(OLDEDGELIST . NEWEDGELIST) *
  1061. % COEFF::=LIST OF WORLDS (UNORDERED) *
  1062. % ATLAS::=(MAP_,COEFF,DEN_OM) *
  1063. % MAP_::=LIST OF VERTICES (UNORDERED) *
  1064. % VERTEX::=LIST OF EDGES (CYCLIC ORDER) *
  1065. % VERTEX::=(NAME,PROP_ERTY,TYPE) *
  1066. % NAME::=ATOM *
  1067. % PROP_ERTY::= (FIRSTPARENT . SECONDPARENT) *
  1068. % TYPE::=T OR NIL *
  1069. % *
  1070. %*********************************************************************$
  1071. %========================== PREDICATES =============================$
  1072. symbolic procedure is_indexp x$ % 01.09.90 RT
  1073. (lambda z$
  1074. z and cdr z)
  1075. assoc(s_edge_name x,dindices!*)$
  1076. symbolic procedure mk_edge_name (name1,name2)$
  1077. % GENERATE NEW EDGE NAME $
  1078. << n_edge := n_edge +1$
  1079. %INTERN COMPRESS APPEND(MK_NAME1 NAME1,
  1080. compress append(mk_name1 name1,
  1081. append ( mk_name1 n_edge ,
  1082. mk_name1 name2)) >> $
  1083. symbolic procedure new_edge (fedge,sedge)$
  1084. % GENERATE NEW EDGE $
  1085. begin
  1086. scalar s$
  1087. s:=
  1088. mk_edge ( mk_edge_name ( s_edge_name fedge,
  1089. s_edge_name sedge),
  1090. mk_edge_prop_ ( s_edge_name fedge,
  1091. s_edge_name sedge),
  1092. mk_edge_type ( nil,
  1093. nil))$
  1094. % MK_EDGE_TYPE ( S_EDGE_TYPE FEDGE,
  1095. % S_EDGE_TYPE SEDGE))$
  1096. new_edge_list := s . new_edge_list $
  1097. return s
  1098. end$
  1099. symbolic procedure delete_vertex (vertex,map_)$
  1100. %DELETS VERTEX FROM MAP_$
  1101. if p_empty_map_ map_ then mk_empty_map_ ()
  1102. else
  1103. if p_eq_vertex (vertex,s_vertex_first map_)
  1104. then s_map__rest map_
  1105. else
  1106. add_vertex (s_vertex_first map_,
  1107. delete_vertex (vertex,s_map__rest map_))$
  1108. %====================== PREDICATES (CONTINUE) =====================$
  1109. symbolic procedure p_eq_vertex (vertex1,vertex2)$
  1110. % VERTICES ARE EQ IF THEY HAVE EQUAL NUMBER OF EDGES
  1111. % IN THE SAME ORDER WITH EQUAL _NAMES $
  1112. if p_empty_vertex vertex1 then p_empty_vertex vertex2
  1113. else
  1114. if p_empty_vertex vertex2 then nil
  1115. else
  1116. if equal_edges (first_edge vertex1,
  1117. first_edge vertex2)
  1118. then p_eq_vertex (s_vertex_rest vertex1,
  1119. s_vertex_rest vertex2)
  1120. else nil$
  1121. %::::::::::::::::::::::: SOME ROUTINES :::::::::::::::::::::::::::::$
  1122. symbolic procedure mk_old_edge x$
  1123. begin
  1124. scalar s$
  1125. s:=assoc(x,old_edge_list )$
  1126. if s then return s$
  1127. s:=mk_edge ( x,
  1128. if not gamma5p x
  1129. then mk_edge_prop_ (1,1) %10.06.90 RT
  1130. else mk_edge_prop_ (ndim!*,ndim!*),
  1131. mk_edge_type (t,t))$
  1132. old_edge_list :=cons(s,old_edge_list )$
  1133. return s
  1134. end$
  1135. symbolic procedure change_name (name,edge)$
  1136. % CHANGES EDGE'S NAME $
  1137. mk_edge (name,
  1138. s_edge_prop_ edge,
  1139. s_edge_type edge )$
  1140. %======================= PREDICATES (CONTINUE) ================== $
  1141. symbolic procedure is_tadpole vertex$ %11.09.90 RT
  1142. % RETURNS T IF THERE IS ONLY ONE EXTERNAL LEG
  1143. is_tadpolen(vertex) < 2$
  1144. symbolic procedure is_tadpolen vertex$ %11.09.90 RT
  1145. % RETURNS NUMBER OF EXTERNAL LEGS
  1146. vertex_length diff_legs(vertex,mk_empty_vertex())$
  1147. symbolic procedure diff_legs(vertex,vertex1)$ %11.09.90 RT
  1148. % RETURNS LIST OF EXTERNAL LEGS
  1149. if p_empty_vertex vertex then vertex1
  1150. else if p_member_edge(first_edge vertex,
  1151. s_vertex_rest vertex)
  1152. or
  1153. p_member_edge(first_edge vertex,
  1154. vertex1)
  1155. then diff_legs(s_vertex_rest vertex,vertex1)
  1156. else diff_legs(s_vertex_rest vertex,
  1157. add_edge(first_edge vertex,vertex1))$
  1158. symbolic procedure is_buble (vertex1,vertex2)$
  1159. % RETURNS NIL IF VERTEX1 AND VERTEX2 DOES NOT FORMED A BUBLE,
  1160. % OR N . MAP_ ,WHERE N IS A NUMBER OF EXTERNAL LINES ( 0 OR 2 ),
  1161. % MAP_ IS A MAP_ CONTAINING THIS BUBLE $
  1162. %NOT(IS_TADPOLE VERTEX1) AND NOT(IS_TADPOLE VERTEX2) AND %14.09.90 RT
  1163. (lambda z$ if z >= 2 then nil
  1164. else (2*z) . mk_vertex2_map_ (vertex1,vertex2))
  1165. vertex_length ( diff_vertex (vertex1,vertex2))$
  1166. %^^^^^^^^^^^^^^^^^^^^^^^ MAIN PROGRAM ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^$
  1167. symbolic procedure transform_map_ map_$
  1168. % GENERATE SIMPLE MAP_ (ONLY PRIMITIVE VERTICES) FROM INITIAL ONE$
  1169. begin
  1170. scalar n_edge$
  1171. n_edge := 0$
  1172. new_edge_list :=nil$
  1173. old_edge_list :=nil$
  1174. return
  1175. mk_simple_map_
  1176. (for each vertex in map_ collect
  1177. prepare_map_ vertex)$
  1178. end$
  1179. %,,,,,,,,,,,,,,,,,,,,,RODIONOV & TARANOV INTERFACE ,,,,,,,,,,,,,,,$
  1180. global '(bubltr freemap_)$
  1181. symbolic procedure to_taranov map_$
  1182. % MAP_ IS INITIAL MAP_,
  1183. % RETURNS (FULL LIST OF EDGES (INITIAL AND GENERATED) .
  1184. % (MAP_ OF PRIMITIVE VERTICES ) .
  1185. % (LIST OF ALL POSSIBLE ENUMERATION OF MAP_'S EDGES) $
  1186. begin
  1187. scalar new_edge_list ,old_edge_list ,full_edge_list ,
  1188. new_map_ ,free_map_ ,marks ,variants ,alst ,bubles$
  1189. new_map_ :=transform_map_ map_$
  1190. free_map_ :=find_bubltr new_map_ $
  1191. bubles:=car free_map_ $
  1192. bubltr:=bubles $
  1193. free_map_ := cdr free_map_ $
  1194. freemap_:=free_map_ $
  1195. full_edge_list := for each edge in old_edge_list collect
  1196. s_edge_name edge $
  1197. alst:=nconc(for each x in full_edge_list collect (x . 1) ,
  1198. list('!_0 . 0) ) $ %ADD EMPTY EDGE $
  1199. marks:=set_mark (new_edge_list ,
  1200. nil,
  1201. buble_proves bubles,
  1202. new_map_ ,
  1203. add_tadpoles (bubles,alst))$
  1204. variants:=edge_bind (marks,alst)$
  1205. full_edge_list :=nconc (for each edge in new_edge_list collect
  1206. s_edge_name edge,
  1207. full_edge_list )$
  1208. return full_edge_list .
  1209. new_map_ .
  1210. variants
  1211. end$
  1212. % TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST $
  1213. % TO_TARANOV '((A B C C B A)) $
  1214. %END$ %cvit2.red
  1215. %********************************************************************
  1216. % NOW WE MARKED THE MAP_ *
  1217. %*******************************************************************$
  1218. % 09.03.88 $
  1219. lisp$
  1220. global '(ndim!* )$
  1221. %ERROERRORERRORERRORERROR ERROR ROUTINES ERRORERRORERRORERRORERROR $
  1222. global '(!*cviterror)$
  1223. flag('(cviterror),'switch)$
  1224. !*cviterror:=t$ % IF T THEN ERROR MESSAGES WILL BE PRINTED$
  1225. % The FEXPR for set_error has been re-written by JPff
  1226. %%% symbolic fexpr procedure set_error u$
  1227. %%% if !*cviterror then set_error0 (u,alst)
  1228. %%% else
  1229. %%% error(55,"ERROR IN MAP_ CREATING ROUTINES") $
  1230. symbolic macro procedure set_error u$
  1231. list('set_error_real,mkquote cadr u,cons('list,cddr u))$
  1232. symbolic procedure set_error_real (u,v)$
  1233. <<
  1234. if !*cviterror then <<
  1235. prin2 "Function: "$
  1236. prin2 car u$
  1237. prin2 " Arguments: "$
  1238. if v then for each x in v do <<
  1239. prin2 x$ prin2 " IS " $
  1240. prin2 x$
  1241. terpri() >>;
  1242. >>;
  1243. error(55,"Error in MAP_ creating routines")
  1244. >>$
  1245. %ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE$
  1246. symbolic procedure mark_edges (newedges,oldedges,map_)$
  1247. mk_proves (map_,oldedges) .
  1248. set_mark (newedges,nil,nil,map_,
  1249. for each x in oldedges collect (s_edge_name x .
  1250. car s_edge_prop_ x ) ) $
  1251. symbolic procedure mk_proves (map_,oldedges)$
  1252. if p_empty_map_ map_ then nil
  1253. else
  1254. if defined_vertex (s_vertex_first map_,oldedges) then
  1255. s_vertex_first map_ .
  1256. mk_proves (s_map__rest map_,oldedges)
  1257. else
  1258. mk_proves (s_map__rest map_,oldedges)$
  1259. symbolic procedure defined_vertex (vertex,oldedges)$
  1260. if p_empty_vertex vertex then t
  1261. else
  1262. memq_edgelist (first_edge vertex,oldedges)
  1263. and
  1264. defined_vertex (s_vertex_rest vertex,oldedges)$
  1265. symbolic procedure set_mark (edges,notdef,toprove,map_,blst)$
  1266. % EDGES - LIST OF NEW EDGES CREATED WHILE MAKING A MAP_,
  1267. % NOTDEF - LIST OF EDGES WHICH CANNOT BE FULLY IDEN_TIFY,
  1268. % TOPROVE - LIST OF VERTICES FOR CHECKING TRIANGLE RULE,
  1269. % MAP_ - MAP_ CREATED EARLIER,
  1270. % BLST - ALIST OF BINDED EDGES$
  1271. if null edges then
  1272. if notdef or toprove then % 15.06.90 RT
  1273. set_error_real('set_mark,list(edges,notdef,toprove,map_,blst))
  1274. else nil
  1275. else
  1276. (lambda z$
  1277. if z then %THE EDGE IS FULLY DEFINED$
  1278. set_prove (append(notdef, %RESTOR LIST OF EDGES$
  1279. cdr edges),
  1280. car edges,
  1281. append(new_prove (car edges, %ADD CHECKS$
  1282. map_),
  1283. toprove),
  1284. map_,
  1285. (s_edge_name car edges . 0) .
  1286. blst)
  1287. else
  1288. set_mark (cdr edges, %TRY NEXT$
  1289. car edges . notdef, % ADD NOT DEF. LIST$
  1290. toprove,
  1291. map_,
  1292. blst))
  1293. ( assoc(caadar edges,blst) %CHECK IF BOTH PARENT IS $
  1294. and %ALREADY DEFINED $
  1295. assoc(cdadar edges,blst) ) $
  1296. symbolic procedure new_prove (edge,map_)$
  1297. % RETURNS NEW VERTEX FOR TRIANGLE RULE CHECKING LIST$
  1298. if null map_ then nil
  1299. else
  1300. (lambda z$ if z then list z
  1301. else new_prove (edge,cdr map_))
  1302. new_provev (edge,car map_) $
  1303. symbolic procedure new_provev (edge,vertex)$
  1304. % CAN THIS VERTEX BE UTILIZED FOR CHECKING ? $
  1305. if not member(edge,vertex) then nil
  1306. else
  1307. if (assoc(caadr edge,vertex)
  1308. and
  1309. assoc(cdadr edge,vertex))
  1310. then nil
  1311. else vertex $
  1312. symbolic procedure is_son (edge,vertex)$
  1313. assoc(car s_edge_prop_ edge,vertex)$
  1314. symbolic procedure not_parents (edge,proves)$
  1315. if null proves then nil
  1316. else
  1317. if is_son (edge,car proves)
  1318. then cdr proves
  1319. else car proves . not_parents (edge,cdr proves)$
  1320. symbolic procedure set_prove (edges,edge,toprove,map_,blst)$
  1321. % RETURNS A PAIR (EDGE . (LIST FOF VERICES FOR TRIANGLE RULE TEST))$
  1322. (lambda z$
  1323. (edge . not_parents (edge,car z)) .
  1324. set_mark (edges,nil,cdr z,map_,blst))
  1325. find_proved (toprove,nil,nil,blst)$
  1326. symbolic procedure find_proved (toprove,proved,unproved,blst)$
  1327. % RETURNS A PAIR ((LIST OF ALREADY DEFINED VERTICES) .
  1328. % (LIST OF NOT YET DEFINED EDGES) ) $
  1329. if null toprove then proved . unproved
  1330. else
  1331. if is_proved (car toprove,blst) then
  1332. find_proved (cdr toprove,
  1333. car toprove . proved,
  1334. unproved,
  1335. blst)
  1336. else find_proved (cdr toprove,
  1337. proved,
  1338. car toprove . unproved,
  1339. blst) $
  1340. symbolic procedure is_proved (vertex,blst)$
  1341. if null vertex then t
  1342. else if assoc(caar vertex,blst) then is_proved (cdr vertex,blst)
  1343. else nil $
  1344. %@@@@@@@@@@@@@@@@@@@@@@@ NOW GENERATES ALL POSSIBLE NUMBERS @@@@@@@@$
  1345. symbolic procedure mk_binding (provedge,blst)$
  1346. can_be_proved (car provedge,blst)
  1347. and
  1348. edge_bind (cdr provedge,blst)$
  1349. symbolic procedure edge_bind (edgelist,blst)$
  1350. if null edgelist then list blst
  1351. else
  1352. begin
  1353. scalar defedge,prop_,p,emin,emax,s,proves,i$
  1354. % DEFEDGE - EDGE WITH DEFINED RANG,
  1355. % PROP_ - ITS PROP_ERTY: (NUM1 . NUM2),
  1356. % P - ITS NAME,
  1357. % EMIN AND EMAX - RANGE OF P,
  1358. % S - TO STORE RESULTS,
  1359. % PROVES - CHECKS OF TRIANGLE LAW$
  1360. defedge:=car edgelist$
  1361. proves:=cdr defedge$
  1362. defedge:=car defedge$
  1363. edgelist:=cdr edgelist$
  1364. p:=s_edge_name defedge$
  1365. prop_:=s_edge_prop_ defedge$
  1366. emin:=assoc(car prop_,blst)$
  1367. emax:=assoc(cdr prop_,blst)$
  1368. if null emin or null emax then set_error_real ('edge_bind,list(prop_,blst))$
  1369. prop_:=(cdr emin) . (cdr emax)$
  1370. emin:=abs((car prop_)-(cdr prop_))$
  1371. emax:=(car prop_)+(cdr prop_)$
  1372. if numberp ndim!* then %NUMERICAL DIMENSIONAL$
  1373. << emax:=min(emax,ndim!*)$
  1374. if emin > ndim!* then return nil >> $
  1375. i:=emin$
  1376. loop:
  1377. if i > emax then return s$
  1378. if can_be_proved (proves,(p . i) . blst)
  1379. then s:=append(edge_bind (edgelist,
  1380. (p . i) . blst),
  1381. s) $
  1382. i:=i+2$
  1383. go loop
  1384. end$
  1385. symbolic procedure can_be_proved (proves,blst)$
  1386. if null proves then t
  1387. else if can_be_p (car proves,blst) then
  1388. can_be_proved (cdr proves,blst)
  1389. else nil$
  1390. symbolic procedure can_be_p (vertex,blst)$
  1391. %CHECKS TRIANGLE RULE$
  1392. begin
  1393. scalar i,j,k$
  1394. i:=assoc(car car vertex,blst)$
  1395. j:=assoc(car cadr vertex,blst)$
  1396. k:=assoc(car caddr vertex,blst)$
  1397. if null i or null j or null k then set_error_real ('can_be_proved,
  1398. list(vertex,%%edge,
  1399. blst))$
  1400. i:=cdr i$
  1401. j:=cdr j$
  1402. k:=cdr k$
  1403. if numberp ndim!* and (i+j+k) > (2*ndim!*) then
  1404. return nil $ %SINCE S+T+U<NDIM!* $
  1405. % ======== NOW CHECK TRIANGLE RULE ======= $
  1406. return
  1407. if not evenp(i+j+k) or
  1408. k < abs(i-j) or
  1409. k > (i+j)
  1410. then nil
  1411. else t
  1412. end$
  1413. %END$ %cvit4.red
  1414. %OOOOOOOOOOOOOOOOOOOOOOOOO ROUTINES TO SELECT BUBLES OOOOOOOOOOOOOOOO$
  1415. lisp$ %24.05.88$
  1416. symbolic procedure find_bubles atlas$
  1417. find_bubles1 (atlas,old_edge_list )$
  1418. symbolic procedure find_bubles_coeff (atlaslist,edgelist,bubles)$
  1419. %F NULL BUBLES THEN NIL . ATLASLIST
  1420. %LSE
  1421. find_bubles1_coeff (atlaslist,nil,edgelist,bubles)$
  1422. symbolic procedure find_bubles1_coeff (atlaslist,passed,edgelist,
  1423. bubles)$
  1424. if null atlaslist then bubles . passed
  1425. else
  1426. (lambda z$ %Z - PAIR = (BUBLES . REDUCED MAP_)
  1427. find_bubles1_coeff (cdr atlaslist,
  1428. cdr z . passed,
  1429. edgelist,
  1430. if null car z then bubles else
  1431. car z . bubles) )
  1432. find_bubles1 (car atlaslist,edgelist) $
  1433. symbolic procedure mk_atlaslist (map_,coeff,den_om)$
  1434. list mk_atlas (map_,coeff,den_om)$
  1435. symbolic procedure find_bubles1 (atlas,edgelist)$
  1436. select_bubles (nil,
  1437. s_atlas_map_ atlas,
  1438. nil,
  1439. s_atlas_coeff atlas,
  1440. s_atlas_den_om atlas,
  1441. edgelist)$
  1442. symbolic procedure select_bubles(bubles,map_,passed,coeff,den_om,al)$
  1443. % RETURNS (LIST OF BUBLES ) . ATLAS,
  1444. % WHERE BUBLES ARE TWO OR ONE VERTICES MAP_S $
  1445. if p_empty_map_ map_ then
  1446. (lambda x$
  1447. car x .
  1448. mk_atlas (passed,cdr x,den_om))
  1449. find_bubles_coeff (coeff,
  1450. union_edges (map__edges passed,
  1451. al),
  1452. bubles)
  1453. else
  1454. if (map__length map_ + map__length passed) < 3 then
  1455. select_bubles (bubles,
  1456. mk_empty_map_ (),
  1457. append_map_s(map_,
  1458. passed),
  1459. coeff,
  1460. den_om,
  1461. al)
  1462. else
  1463. (lambda z$ % Z IS NIL OR A PAIR
  1464. % N . MAP_ ,WHERE
  1465. % N - NUMBER OF FREE EDGES$
  1466. if z then %A BUBLE IS FIND$
  1467. (lambda d$
  1468. (lambda bool$ %BOOL=T IFF ALL EDGES CAN BE DEFINED$
  1469. if car z = 0 then %NO EXTERNAL LINES$
  1470. if bool then
  1471. select_bubles ( z . bubles,
  1472. mk_empty_map_ (),
  1473. cdr z,
  1474. mk_atlaslist ( conc_map_s (passed,
  1475. delete_vertex (
  1476. s_vertex_second
  1477. cdr z,
  1478. s_map__rest
  1479. map_)),
  1480. coeff,
  1481. den_om),
  1482. nil,
  1483. al)
  1484. else
  1485. select_bubles ( z . bubles, %ADD BUBLE$
  1486. delete_vertex (s_vertex_second cdr z,
  1487. s_map__rest map_),
  1488. passed,
  1489. try_sub_atlas (mk_atlas (cdr z,
  1490. nil,
  1491. nil),
  1492. coeff),
  1493. den_om,
  1494. al)
  1495. else
  1496. if not p_old_vertex d then
  1497. if bool then
  1498. select_bubles (z . bubles,
  1499. mk_empty_map_ (),
  1500. cdr z,
  1501. mk_atlaslist (conc_map_s (passed,
  1502. buble_vertex (
  1503. cdr z,
  1504. delete_vertex (
  1505. s_vertex_second
  1506. cdr z,
  1507. s_map__rest
  1508. map_ ),
  1509. al)),
  1510. coeff,
  1511. den_om),
  1512. list d,
  1513. al)
  1514. else
  1515. select_bubles ( z . bubles, %ADD NEW BUBLE$
  1516. buble_vertex (cdr z, %RENAME EDGES $
  1517. conc_map_s (passed,
  1518. delete_vertex (s_vertex_second cdr z,
  1519. s_map__rest map_)),
  1520. al),
  1521. mk_empty_map_ (),
  1522. try_sub_atlas (mk_atlas (cdr z,nil,list d),
  1523. coeff),
  1524. den_om,
  1525. al)
  1526. else
  1527. if bool then
  1528. select_bubles (z . bubles,
  1529. mk_empty_map_ (),
  1530. ren_vertmap_ (d,cdr z),
  1531. mk_atlaslist (
  1532. conc_map_s (
  1533. passed,
  1534. add_vertex (add_edge (!_0edge ,d),
  1535. delete_vertex (
  1536. s_vertex_second cdr z,
  1537. s_map__rest map_ ))),
  1538. coeff,
  1539. den_om),
  1540. list ren_vertices (d,d),
  1541. al)
  1542. else
  1543. select_bubles (z . bubles,
  1544. add_vertex (add_edge (!_0edge ,d),
  1545. delete_vertex (s_vertex_second cdr z,
  1546. s_map__rest map_)
  1547. ),
  1548. passed,
  1549. try_sub_atlas (mk_atlas (ren_vertmap_
  1550. (d,cdr z),
  1551. nil,
  1552. list
  1553. ren_vertices (d,d)
  1554. ),
  1555. coeff),
  1556. den_om,
  1557. al )
  1558. )
  1559. % ALL_DEFINED (CDR Z,AL))
  1560. t )
  1561. delta_edges cdr z
  1562. else
  1563. select_bubles (bubles,
  1564. s_map__rest map_,
  1565. add_vertex (s_vertex_first map_,passed),
  1566. coeff,
  1567. den_om,
  1568. al )
  1569. )
  1570. find_buble (s_vertex_first map_,
  1571. s_map__rest map_ ) $
  1572. symbolic procedure p_old_vertex vertex$
  1573. % RETURNS T IFF ALL EDGES OF VERTEX ARE OLD OR VERTEX IS EMPTY ONE$
  1574. if p_empty_vertex vertex then t
  1575. else p_old_edge first_edge vertex
  1576. and
  1577. p_old_vertex s_vertex_rest vertex$
  1578. symbolic procedure renames_edges (vertex,al)$
  1579. rename_edges_par (first_edge vertex,
  1580. second_edge vertex,
  1581. al)$
  1582. symbolic procedure rename_edges_par (vertex1,vertex2,al)$
  1583. % Here VERTEX1 and VERTEX2 are edges!
  1584. if defined_edge (vertex1,al)
  1585. and not p_old_edge(vertex2) then % 14.09.90 RT
  1586. replace_edge (vertex2,vertex1,new_edge_list )
  1587. else
  1588. if defined_edge (vertex2,al)
  1589. and not p_old_edge(vertex1) then % 14.09.90 RT
  1590. replace_edge (vertex1,vertex2,new_edge_list )
  1591. else
  1592. if p_old_edge (vertex1)
  1593. and not p_old_edge(vertex2) then % 14.09.90 RT
  1594. replace_edge (vertex2,vertex1,new_edge_list )
  1595. else
  1596. if p_old_edge (vertex2)
  1597. and not p_old_edge(vertex1) then % 14.09.90 RT
  1598. replace_edge (vertex1,vertex2,new_edge_list )
  1599. else rename_edges (vertex1,vertex2)$
  1600. symbolic procedure buble_vertex (map_2,map_,al)$
  1601. if p_empty_map_ map_2 then mk_empty_map_ ()
  1602. else
  1603. << renames_edges (delta_edges map_2,al)$
  1604. map_ >> $
  1605. symbolic procedure delta_edges map_2$
  1606. % MAP_2 - MAP_ OF TWO VERTICES $
  1607. mk_edge2_vertex (
  1608. first_edge
  1609. diff_vertex (s_vertex_first map_2,
  1610. s_vertex_second map_2),
  1611. first_edge
  1612. diff_vertex (s_vertex_second map_2,
  1613. s_vertex_first map_2 )
  1614. )$
  1615. symbolic procedure delta_names map_2$
  1616. % MAP_2 - MAP_ OF TWO VERTICES $
  1617. (lambda z$
  1618. s_edge_name first_edge car z .
  1619. s_edge_name first_edge cdr z )
  1620. (diff_vertex (s_vertex_first map_2,
  1621. s_vertex_second map_2) .
  1622. diff_vertex (s_vertex_second map_2,
  1623. s_vertex_first map_2) ) $
  1624. symbolic procedure old_rename_edges (names,map_)$
  1625. if p_empty_map_ map_ then mk_empty_map_ ()
  1626. else add_vertex (ren_edge (names,s_vertex_first map_),
  1627. old_rename_edges (names,
  1628. s_map__rest map_) ) $
  1629. symbolic procedure ren_vertmap_ (vertex1,map_)$
  1630. % VERTEX1 MUST BE TWO EDGE VERTEX,
  1631. % EDGES OF VERTEX2 TO BE RENAME$
  1632. if vertex_length vertex1 neq 2 then set_error_real ('ren_vertmap_ ,
  1633. list(vertex1,map_))
  1634. else old_rename_edges (s_edge_name first_edge vertex1 .
  1635. s_edge_name second_edge vertex1,
  1636. map_)$
  1637. symbolic procedure ren_vertices (vertex1,vertex2)$
  1638. % VERTEX1 MUST BE TWO EDGE VERTEX,
  1639. % EDGES OF VERTEX2 TO BE RENAME$
  1640. if vertex_length vertex1 neq 2 then set_error_real ('ren_vertices ,
  1641. list(vertex1,vertex2))
  1642. else ren_edge (s_edge_name first_edge vertex1 .
  1643. s_edge_name second_edge vertex1,
  1644. vertex2)$
  1645. symbolic procedure ren_edge (names,vertex)$
  1646. % NAMES IS NAME1 . NAME2,
  1647. % CHANGE NAME1 TO NAME2$
  1648. if null assoc(car names,vertex) then vertex %NO SUCH EDGES IN VERTEX$
  1649. else ren_edge1 (names,vertex)$
  1650. symbolic procedure ren_edge1 (names,vertex)$
  1651. if p_empty_vertex vertex then mk_empty_vertex ()
  1652. else if car names =s_edge_name first_edge vertex then
  1653. add_edge ( change_name (cdr names,first_edge vertex),
  1654. ren_edge1 (names ,s_vertex_rest vertex))
  1655. else
  1656. add_edge ( first_edge vertex,
  1657. ren_edge1 (names,s_vertex_rest vertex))$
  1658. symbolic procedure find_buble (vertex,map_)$
  1659. if p_empty_map_ map_ then mk_empty_map_ ()
  1660. else
  1661. is_buble (vertex,s_vertex_first map_)
  1662. or
  1663. find_buble (vertex,s_map__rest map_) $
  1664. symbolic procedure diff_vertex (vertex1,vertex2)$
  1665. if p_empty_vertex vertex1 then mk_empty_vertex ()
  1666. else
  1667. if p_member_edge (first_edge vertex1,vertex2)
  1668. and
  1669. not equal_edges (first_edge vertex1,!_0edge )
  1670. then diff_vertex (s_vertex_rest vertex1,vertex2)
  1671. else
  1672. add_edge (first_edge vertex1,
  1673. diff_vertex (s_vertex_rest vertex1,vertex2)) $
  1674. %SSSSSSSSSSSSSSSSSSSSSSSSSS NOW MAKES PROVES FROM BUBLE PPPPPPPPPPPPPP$
  1675. global '(!_0edge )$
  1676. !_0edge :=mk_edge ('!_0 ,
  1677. mk_edge_prop_ (0,0),
  1678. mk_edge_type (t,t)) $
  1679. symbolic procedure buble_proves bubles$
  1680. if null bubles then nil
  1681. else
  1682. if caar bubles = 0 %NO EXTERNAL LINES $
  1683. then buble_proves cdr bubles
  1684. else if caar bubles = 2 then
  1685. mk_edge3_vertex (
  1686. first_edge diff_vertex (
  1687. s_vertex_first cdar bubles,
  1688. s_vertex_second cdar bubles),
  1689. first_edge diff_vertex (
  1690. s_vertex_second cdar bubles,
  1691. s_vertex_first cdar bubles),
  1692. !_0edge ) .
  1693. buble_proves cdr bubles
  1694. else
  1695. if caar bubles = 3 then
  1696. car cdar bubles .
  1697. buble_proves cdr bubles
  1698. else buble_proves cdr bubles $
  1699. symbolic procedure try_sub_atlas (atlas,atlaslist)$
  1700. if null atlaslist then list atlas
  1701. else
  1702. if sub_map__p (s_atlas_map_ atlas,
  1703. s_atlas_den_om car atlaslist)
  1704. then try_sub_atlas (mk_sub_atlas (atlas,car atlaslist),
  1705. % THEN TRY_SUB_ATLAS (MK_SUB_ATLAS (CAR ATLASLIST,
  1706. % ATLAS ),
  1707. cdr atlaslist)
  1708. else car atlaslist .
  1709. try_sub_atlas (atlas,cdr atlaslist)$
  1710. symbolic procedure sub_map__p (map_1,den_)$
  1711. %MAP_1 AND DEN_ HAVE COMMON VERTEX (DEN_ - DEN_OMINATOR)$
  1712. if p_empty_map_ map_1 then nil
  1713. else sub_vertex_map_ (s_vertex_first map_1,den_)
  1714. or
  1715. sub_map__p (s_map__rest map_1,den_)$
  1716. symbolic procedure sub_vertex_map_ (vertex,den_)$
  1717. if null den_ then nil
  1718. else p_common_den_ (vertex,car den_)
  1719. or
  1720. sub_vertex_map_ (vertex,cdr den_)$
  1721. symbolic procedure p_common_den_ (vertex,vertexd)$
  1722. (lambda n$
  1723. if n = 3 then %TRIANGLE
  1724. p_eq_vertex (vertex,vertexd)
  1725. else
  1726. if n = 2 then %KRONEKER
  1727. p_member_edge (first_edge vertexd,vertex)
  1728. else nil )
  1729. vertex_length vertexd $
  1730. symbolic procedure mk_sub_atlas (atlas1,atlas2)$
  1731. mk_atlas (s_atlas_map_ atlas1,
  1732. atlas2 . s_atlas_coeff atlas1,
  1733. s_atlas_den_om atlas1)$
  1734. symbolic procedure all_defined (map_,al)$
  1735. all_defined_map_ (map_,
  1736. defined_append(map__edges map_,al))$
  1737. symbolic procedure all_defined_map_ (map_,al)$
  1738. al1_defined_map_ (map_,mk_empty_map_ (),al)$
  1739. symbolic procedure al1_defined_map_ (map_,passed,al)$
  1740. % T IF ALL EDGES IN MAP_ CAN BE DEFINED $
  1741. if p_empty_map_ map_ then
  1742. if p_empty_map_ passed then t
  1743. else nil
  1744. else
  1745. if all_defined_vertex (s_vertex_first map_,al) then
  1746. al1_defined_map_ (conc_map_s(passed,s_map__rest map_),
  1747. mk_empty_map_ (),
  1748. append(vertex_edges s_vertex_first map_ ,al))
  1749. else
  1750. al1_defined_map_ (s_map__rest map_,
  1751. add_vertex (s_vertex_first map_,passed),
  1752. al)$
  1753. symbolic procedure all_defined_vertex (vertex,al)$
  1754. al1_defined_vertex (vertex,mk_empty_vertex (),
  1755. mk_empty_vertex (),al)$
  1756. symbolic procedure al1_defined_vertex (vertex,passed,defined,al)$
  1757. % T IF ALL EDGES IN VERTEX CAN BE DEFINED $
  1758. if p_empty_vertex vertex then
  1759. if p_empty_vertex passed then t
  1760. else re_parents (passed,defined)
  1761. else
  1762. if defined_edge (first_edge vertex,al)
  1763. then
  1764. al1_defined_vertex (conc_vertex(passed,s_vertex_rest vertex),
  1765. mk_empty_vertex (),
  1766. add_edge (first_edge vertex,defined),
  1767. first_edge vertex . al)
  1768. else
  1769. al1_defined_vertex (s_vertex_rest vertex,
  1770. add_vertex (first_edge vertex,passed),
  1771. defined,
  1772. al)$
  1773. symbolic procedure re_parents (passed,defined)$
  1774. %TRY TO MAKE NEW PARENTS
  1775. if vertex_length passed = 1 and vertex_length defined = 2
  1776. then make_new_parents (first_edge passed,defined)
  1777. else nil$
  1778. symbolic procedure make_new_parents (edge,vertex)$
  1779. %VERTEX CONSISTS OF TWO EDGES
  1780. add_parents0 (edge,
  1781. s_edge_name first_edge vertex .
  1782. s_edge_name second_edge vertex ,
  1783. t)$
  1784. %^.^.^.^.^.^.^.^.^.^.^.^.^.^.^..^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^
  1785. % 13.05.88
  1786. symbolic procedure p_def_edge edge$
  1787. s_edge_type edge$
  1788. %P_OLD_EDGE EDGE$
  1789. symbolic procedure defined_edge (edge,al)$
  1790. p_old_edge edge
  1791. or
  1792. defined_all_edge (all_edge (s_edge_name edge,new_edge_list ),
  1793. nil,
  1794. al) $
  1795. symbolic procedure all_edge (edgename,edgelist)$
  1796. if null edgelist then nil
  1797. else
  1798. if edgename eq s_edge_name car edgelist then
  1799. car edgelist . all_edge (edgename,cdr edgelist)
  1800. else all_edge (edgename,cdr edgelist)$
  1801. symbolic procedure def_edge (edge,al)$
  1802. (lambda z$
  1803. assoc(car z,al) and assoc(cdr z,al))
  1804. s_edge_prop_ edge$
  1805. symbolic procedure defined_all_edge (edgelist,passed,al)$
  1806. if null edgelist then nil
  1807. else
  1808. if def_edge (car edgelist,al) then
  1809. if p_def_edge car edgelist then t %REPLACE WAS ALREADY DONE
  1810. else rep_edge_prop_ (nconc(passed,edgelist),
  1811. s_edge_prop_ car edgelist . list t)
  1812. else defined_all_edge (cdr edgelist,
  1813. car edgelist . passed,
  1814. al)$
  1815. symbolic procedure rep_edge_prop_ (edgelist,prop_)$
  1816. if null edgelist then t
  1817. else << rplacd(car edgelist,prop_)$ %CHANGE EDGE PARENTS
  1818. rep_edge_prop_ (cdr edgelist,prop_) >> $
  1819. %END$ %cvit6.red
  1820. %<><><><><><><><><><><> ROUTINES FOR SELECTING TRIANGLES <><><><><><>$
  1821. %24.05.88$
  1822. global '(!*cvitbtr !*cviterror)$
  1823. flag('(cvitbtr),'switch)$
  1824. !*cvitbtr:=t$ %IF T THEN BUBLES AND TRIANGLES WILL BE
  1825. % FACTORIZED
  1826. !*cviterror:=t$ %IF T THEN ERROR MESSAGES WILL BE PRINTED
  1827. symbolic procedure find_triangles atlas$
  1828. find_triangles1 (atlas,old_edge_list)$
  1829. symbolic procedure find_triangles1 (atlas,al)$
  1830. select_triangles (nil,
  1831. s_atlas_map_ atlas,
  1832. nil,
  1833. s_atlas_coeff atlas,
  1834. s_atlas_den_om atlas,
  1835. al)$
  1836. symbolic procedure find_triangl_coeff (atlaslist,edgelist,triangles)$
  1837. find_triangle_coeff (atlaslist,nil,edgelist,triangles)$
  1838. symbolic procedure find_triangle_coeff(atlaslist,passed,edgelist,
  1839. triangles)$
  1840. if null atlaslist then triangles . passed
  1841. else
  1842. (lambda z$ % Z - PAIR= (TRIANGLES . REDUCED MAP_)
  1843. find_triangle_coeff (cdr atlaslist,
  1844. cdr z . passed,
  1845. edgelist,
  1846. if null car z then triangles
  1847. else car z . triangles))
  1848. find_triangles1 (car atlaslist,edgelist)$
  1849. symbolic procedure select_triangles (triangles,map_,passed,
  1850. coeff,den_om,al)$
  1851. %RETURNS A PAIR OF THE FORM ( (LIST OF TRIANGLES) . (ATL.WITHOUT TR.))$
  1852. if p_empty_map_ map_ then %No triangles found.
  1853. (lambda x$
  1854. car x .
  1855. mk_atlas (passed,cdr x,den_om))
  1856. find_triangl_coeff (coeff,
  1857. union_edges (map__edges passed,al),
  1858. triangles)
  1859. else
  1860. if (map__length map_ + map__length passed) < 4 then
  1861. select_triangles (triangles,
  1862. mk_empty_map_ (),
  1863. append_map_s (map_,passed),
  1864. coeff,
  1865. den_om,
  1866. al)
  1867. else
  1868. (lambda z$
  1869. if z then %TRIANGLE IS FOUND$
  1870. (lambda trn$ %TRN - NEW VERTEX $
  1871. %IF ALL_DEFINED (CDDR Z,AL) THEN
  1872. if t then
  1873. select_triangles (
  1874. z . triangles,
  1875. mk_empty_map_ (),
  1876. add_vertex (trn,cddr z),
  1877. mk_atlaslist (
  1878. conc_map_s (
  1879. mk_vertex1_map_ trn,
  1880. conc_map_s (passed,delete_map_s (cddr z,map_))
  1881. ),
  1882. coeff,
  1883. % TRN . DEN_OM ),
  1884. den_om ),
  1885. % NIL,
  1886. list trn,
  1887. al )
  1888. else
  1889. select_triangles ( z . triangles, %ADD NEW TRIANGLE $
  1890. % SELECT_TRIANGLES ( CDDR Z . TRIANGLES, %ADD NEW TRIANGLE$
  1891. conc_map_s (mk_vertex1_map_
  1892. trn, %ADD NEW VERTEX$
  1893. conc_map_s (passed,
  1894. delete_map_s (cddr z,map_ )
  1895. )
  1896. ),
  1897. mk_empty_map_ (),
  1898. try_sub_atlas (
  1899. mk_atlas (add_vertex (trn,cddr z),
  1900. nil,
  1901. list trn),
  1902. coeff ),
  1903. den_om,
  1904. al
  1905. )
  1906. )
  1907. sk_vertextr z
  1908. else
  1909. select_triangles (triangles,
  1910. s_map__rest map_,
  1911. add_vertex (s_vertex_first map_,passed),
  1912. coeff,
  1913. den_om,
  1914. al
  1915. ) )
  1916. reduce_triangle
  1917. find_triangle (s_vertex_first map_,
  1918. s_map__rest map_) $
  1919. symbolic procedure vertex_neighbour (vertex,map_)$
  1920. %RETURNS A MAP_ OF VERTEX NEIGHBOURS $
  1921. if p_empty_vertex vertex
  1922. or
  1923. p_empty_map_ map_ then mk_empty_map_ ()
  1924. else
  1925. (lambda z$ %Z - NIL OR A PAIR (EDGE . ADJACENT EDGE )$
  1926. if z then
  1927. add_vertex (cdr z,
  1928. vertex_neighbour (delete_edge (car z,vertex),
  1929. delete_vertex (cdr z,map_)))
  1930. else
  1931. vertex_neighbour (vertex,s_map__rest map_))
  1932. is_neighbour (vertex,
  1933. s_vertex_first map_)$
  1934. symbolic procedure delete_map_s (map_1,map_2)$
  1935. if p_empty_map_ map_1 then map_2
  1936. else delete_map_s (s_map__rest map_1,
  1937. delete_vertex (s_vertex_first map_1,map_2) ) $
  1938. symbolic procedure delete_edge (edge,vertex)$
  1939. %DELETES EDGE FROM VERTEX $
  1940. if p_empty_vertex vertex then mk_empty_vertex ()
  1941. else
  1942. if equal_edges (edge,first_edge vertex)
  1943. then s_vertex_rest vertex
  1944. else
  1945. add_edge (first_edge vertex,
  1946. delete_edge (edge,
  1947. s_vertex_rest vertex ) ) $
  1948. symbolic procedure is_neighbourp (vertex1,vertex2)$
  1949. % ARE VERTEX1 AND VERTEX2 NEIGHBOURS ?
  1950. if p_empty_vertex vertex1 then nil % NIL IF NOT NEIGHBOURS$
  1951. else
  1952. p_member_edge (first_edge vertex1,vertex2)
  1953. or
  1954. is_neighbourp (s_vertex_rest vertex1,vertex2)$
  1955. symbolic procedure is_neighbour (vertex1,vertex2)$
  1956. % ARE VERTEX1 AND VERTEX2 NEIGHBOURS ?
  1957. % IF THEY ARE THEN RETURN A PAIR: (ADJ.EDGE . VERTEX2)$
  1958. if p_empty_vertex vertex1 then nil % NIL IF NOT NEIGHBOURS$
  1959. else
  1960. (lambda z$
  1961. if z then %FIRTS VERTEX IS ADJACENT TO VERTEX2$
  1962. first_edge vertex1 . vertex2
  1963. else is_neighbour (s_vertex_rest vertex1,
  1964. vertex2 ) )
  1965. p_member_edge (first_edge vertex1,
  1966. vertex2)$
  1967. symbolic procedure find_triangle (vertex,map_)$
  1968. %FINDS TRIANGLE WICH INCLUDES THE VERTEX.
  1969. %RETURNS MAP_ OF THREE VERTICES (TRIANGLE) OR NIL $
  1970. (lambda z$ %Z - MAP_ OF VERTICES WICH ARE NEIGHBOURS
  1971. % OF VERTEX OR (IF NO NEIGHBOURS) EMPTY MAP_$
  1972. if map__length z neq 2 then nil
  1973. else add_vertex (vertex,z) )
  1974. is_closed vertex_neighbour (vertex,map_)$
  1975. symbolic procedure is_closed map_$
  1976. if p_empty_map_ map_ or
  1977. p_empty_map_ s_map__rest map_ then mk_empty_map_ ()
  1978. else
  1979. two_neighbour (s_vertex_first map_,
  1980. s_map__rest map_)
  1981. or
  1982. is_closed s_map__rest map_$
  1983. symbolic procedure two_neighbour (vertex,map_)$
  1984. % HAS VERTEX A NEIGHBOUR IN THE MAP_ ? $
  1985. if p_empty_map_ map_ then nil
  1986. else
  1987. if is_neighbourp (vertex,s_vertex_first map_)
  1988. then mk_vertex2_map_ (vertex,s_vertex_first map_)
  1989. else two_neighbour (vertex,s_map__rest map_)$
  1990. symbolic procedure mk_vertextr map_$
  1991. %MAKES VERTEX FROM TRIANGLE MAP_$
  1992. if map__length map_ neq 3 then set_error_real ('mk_vertextr ,list(map_))
  1993. else
  1994. mk_vertextr3 (map_,3)$
  1995. symbolic procedure add_edge1(edge,vertex)$ % 14.09.90 RT
  1996. if null edge then vertex
  1997. else add_edge(edge,vertex)$
  1998. symbolic procedure mk_vertextr3 (map_,n)$
  1999. if n <= 0 then mk_empty_map_ ()
  2000. else
  2001. add_edge1 (take_edge (s_vertex_first map_,
  2002. s_map__rest map_),
  2003. mk_vertextr3 (cycl_map_ map_,n-1)) $
  2004. symbolic procedure take_edge (vertex,map_)$
  2005. if p_empty_vertex vertex then nil %14.09.90 RT
  2006. % SET_ERROR ('TAKE_EDGE ,VERTEX,MAP_) % 14.09.90 RT
  2007. else
  2008. % IF P_EMPTY_VERTEX S_VERTEX_REST VERTEX THEN FIRST_EDGE VERTEX
  2009. % ELSE % 14.09.90 RT
  2010. if contain_edge (first_edge vertex,map_)
  2011. and
  2012. not equal_edges (first_edge vertex,!_0edge )
  2013. then take_edge (s_vertex_rest vertex,map_)
  2014. else first_edge vertex$
  2015. symbolic procedure contain_edge (edge,map_)$
  2016. % IS THERE A VERTEX IN THE MAP_ CONTAINING THE EDGE? $
  2017. if p_empty_map_ map_ then nil
  2018. else
  2019. p_member_edge (edge,s_vertex_first map_)
  2020. or
  2021. contain_edge (edge,s_map__rest map_) $
  2022. % ,,,,,,,,,,,,,,,,,,,,,,,,,,,,SORTING AFTER FACTORIZATION ,,,,,,,,,,,$
  2023. % 19.05.88 $
  2024. symbolic procedure find_bubltr atlas$
  2025. if null !*cvitbtr then atlas else
  2026. begin
  2027. scalar s$
  2028. s:=errorset(list('find_bubltr0 ,mkquote atlas),
  2029. !*cviterror,
  2030. !*backtrace)$
  2031. return
  2032. if atom s then atlas
  2033. else car s
  2034. end$
  2035. symbolic procedure find_bubltr0 atlas$
  2036. %(LAMBDA Z$
  2037. % IF CAR Z THEN SORT_ATLAS CDR Z %FACTORIZATION HAPPENED
  2038. % ELSE CDR Z)
  2039. sort_atlas cdr
  2040. find_bubltr1 (atlas,old_edge_list )$
  2041. % ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,$
  2042. symbolic procedure find_bubltr1 (atlas,al)$
  2043. %FINDS BOTH BUBLES AND TRIANGLES IN ATLAS$
  2044. begin
  2045. scalar s,c,bubles$
  2046. s:=find_bubles1 (atlas,al)$
  2047. c:=car s$
  2048. atlas:=cdr s$
  2049. bubles:=append(c,bubles)$
  2050. loop:
  2051. s:=find_triangles1 (atlas,al)$
  2052. c:=car s$
  2053. atlas:=cdr s$
  2054. bubles:=append(c,bubles)$
  2055. if null c then return bubles . atlas$
  2056. s:=find_bubles1 (atlas,al)$
  2057. c:=car s$
  2058. atlas:=cdr s$
  2059. bubles:=append(c,bubles)$
  2060. if null c then return bubles . atlas$
  2061. go loop
  2062. end$
  2063. symbolic procedure reduce_triangle triangle$
  2064. % RETURN (N . VERTEX . TRIANGLE) OR NIL,
  2065. % N - NUMBER OF EXTERNAL EDGES$
  2066. if null triangle then nil
  2067. else
  2068. begin
  2069. scalar extedges,vertex,n$
  2070. %EXTEDGES - LIST OF EXTERNAL EDGES,
  2071. % N - NUMBER OF EXTERNAL EDGES,
  2072. %VERTEX - NEW VERTEX,MADE FROM TRIANGLE$
  2073. vertex:=mk_vertextr triangle$
  2074. extedges:=ext_edges vertex$
  2075. n:=length extedges$
  2076. return
  2077. if n = 1 then nil % 14.09.90 RT
  2078. else % 14.09.90 RT
  2079. n . vertex . triangle
  2080. end$
  2081. symbolic procedure sk_vertextr z$
  2082. % Z IS (N . VERTEX . TRIANGLE) $
  2083. if car z = 1 then mk_empty_vertex ()
  2084. else
  2085. if car z = 3 then cadr z
  2086. else set_error_real ('sk_vertextr,list z) $
  2087. symbolic procedure ext_edges vertex$
  2088. %SELECT EXTERNAL EDGES IN VERTEX $
  2089. if p_empty_vertex vertex then nil
  2090. else
  2091. if p_member_edge (first_edge vertex,s_vertex_rest vertex)
  2092. or
  2093. equal_edges (first_edge vertex,!_0edge )
  2094. then ext_edges delete_edge (first_edge vertex,
  2095. s_vertex_rest vertex)
  2096. else first_edge vertex .
  2097. ext_edges s_vertex_rest vertex $
  2098. symbolic procedure ext_edges_map_ map_$
  2099. %SELECT EXTERNAL EDGES OF MAP_$
  2100. if p_empty_map_ map_ then nil
  2101. else
  2102. ext_map__ver (ext_edges s_vertex_first map_,
  2103. ext_edges_map_ s_map__rest map_)$
  2104. symbolic procedure ext_map__ver (vlist,mlist)$
  2105. if null vlist then mlist
  2106. else
  2107. if memq(car vlist,mlist) then
  2108. ext_map__ver (cdr vlist,
  2109. delete(car vlist,mlist))
  2110. else ext_map__ver (cdr vlist,car vlist . mlist)$
  2111. symbolic procedure add_tadpoles (bubles,alst)$
  2112. if null bubles then alst
  2113. else
  2114. if caar bubles = 1 then
  2115. add_tadpoles (cdr bubles,
  2116. cons(cons(car mk_vertextr cadr car bubles,
  2117. 0),
  2118. alst))
  2119. else add_tadpoles (cdr bubles,alst)$
  2120. %END$ %cvit8.red
  2121. %::::::::::::::::::::::: ATLAS SORTING ROUTINES ********************** $
  2122. % 13.06.88$
  2123. lisp$
  2124. global '(!*cvitrace)$
  2125. !*cvitrace:=nil$ %IF T THEN TRACE BACTRAKING WHILE ATLAS SORTING$
  2126. flag('(cvitrace),'switch)$
  2127. symbolic procedure sort_atlas atlas$
  2128. %TOP LEVEL PROCEDURE
  2129. if null atlas then atlas
  2130. else
  2131. (lambda z$
  2132. if z then z %ATLAS FULLY SORTED
  2133. else set_error_real ('sort_atlas ,list atlas))
  2134. sort_atlas1 atlas $
  2135. symbolic procedure sort_atlas1 atlas$
  2136. (lambda z$
  2137. if z then z %ATLAS FULLY SORTED
  2138. else
  2139. if !*cviterror then print_atlas_sort (atlas,nil)
  2140. else nil )
  2141. atlas_sort (atlas,old_edge_list )$
  2142. symbolic procedure print_atlas_sort (atlas,edgelist)$
  2143. << print "Atlas not sorted "$
  2144. print_atlas atlas$
  2145. if edgelist then
  2146. << print "Defined edges: "$
  2147. for each edge in edgelist do print edge >> $
  2148. nil >> $
  2149. symbolic procedure atlas_sort (atlas,edgelist)$
  2150. begin
  2151. scalar z,newedges$
  2152. newedges:=store_edges new_edge_list$
  2153. z:=
  2154. errorset(list('atlas_sort1 ,mkquote atlas,mkquote edgelist),
  2155. !*cvitrace,
  2156. !*backtrace)$
  2157. return
  2158. if atom z then %ATLAS NOT SORTED
  2159. << restor_edges (newedges,new_edge_list)$ %RESTORE EDGES PARENTS
  2160. if !*cvitrace then print_atlas_sort (atlas,edgelist)
  2161. else nil >>
  2162. else car z
  2163. end$
  2164. symbolic procedure store_edges edgelist$
  2165. for each edge in edgelist collect
  2166. (car edge . cdr edge)$
  2167. symbolic procedure restor_edges (edgelist,newedgelist)$
  2168. if null edgelist then
  2169. if newedgelist then set_error_real ('restor_edges ,list(edgelist,newedgelist))
  2170. else nil
  2171. else
  2172. if null newedgelist then
  2173. set_error_real ('restor_edges ,list(edgelist,newedgelist))
  2174. else
  2175. if s_edge_name car edgelist = s_edge_name car newedgelist then
  2176. << rplacd(car newedgelist,cdar edgelist)$
  2177. car newedgelist . restor_edges (cdr edgelist,
  2178. cdr newedgelist) >>
  2179. else
  2180. set_error_real ('restor_edges ,list(edgelist,newedgelist))$
  2181. symbolic procedure defined_atlas (atlas,edgelist)$
  2182. (lambda edges$
  2183. defined_edges (edges,
  2184. % DEFINED_APPEND(EDGES,EDGELIST)))
  2185. edgelist))
  2186. atlas_edges atlas$
  2187. symbolic procedure defined_append (edges,edgelist)$
  2188. if null edges then edgelist
  2189. else if defined_edge (car edges,edgelist) then
  2190. car edges . defined_append (cdr edges,edgelist)
  2191. else defined_append (cdr edges,edgelist) $
  2192. symbolic procedure defined_edges (edges,edgelist)$
  2193. if null edges then t
  2194. else
  2195. if defined_edge (car edges,edgelist)
  2196. then
  2197. defined_edges (cdr edges,car edges . edgelist)
  2198. else definedl_edges (cdr edges,list car edges,edgelist)$
  2199. symbolic procedure definedl_edges (edges,passed,edgelist)$
  2200. if null edges then null passed
  2201. else
  2202. if defined_edge (car edges,edgelist) then
  2203. defined_edges (nconc(passed,cdr edges),car edges . edgelist)
  2204. else definedl_edges (cdr edges,car edges . passed,edgelist)$
  2205. symbolic procedure atlas_sort1 (atlas,edgelist)$
  2206. if all_defined (s_atlas_map_ atlas,edgelist) then
  2207. mk_atlas (s_atlas_map_ atlas,
  2208. coeff_sortl( s_atlas_coeff atlas,
  2209. nil,
  2210. nconc( map__edges s_atlas_map_ atlas,
  2211. edgelist)),
  2212. s_atlas_den_om atlas)
  2213. else coeff_sort (coeff_ordn (s_atlas_coeff atlas,edgelist),
  2214. %LSE COEFF_SORT (S_ATLAS_COEFF ATLAS,
  2215. mk_atlaslist (s_atlas_map_ atlas,
  2216. nil,
  2217. s_atlas_den_om atlas),
  2218. edgelist)$
  2219. symbolic procedure coeff_sortl (atlaslist,passed,edgelist)$
  2220. coeff_sortl1 (coeff_ordn (atlaslist,edgelist),passed,edgelist)$
  2221. symbolic procedure coeff_sort (atlaslist,passed,edgelist)$
  2222. if atlaslist then
  2223. (lambda z$ %Z - NIL OR SORDET ATLAS
  2224. if z then %FIRST ATLAS ALREADY DEFINED
  2225. mk_atlas (s_atlas_map_ z,
  2226. coeff_sortl (append(s_atlas_coeff z,
  2227. append(cdr atlaslist,passed)),
  2228. nil,
  2229. nconc(map__edges s_atlas_map_ z,
  2230. edgelist)),
  2231. s_atlas_den_om z)
  2232. else
  2233. coeff_sort (cdr atlaslist,
  2234. car atlaslist . passed,
  2235. edgelist))
  2236. atlas_sort (car atlaslist,edgelist)
  2237. else coeff_sort_f (passed,nil,edgelist)$
  2238. symbolic procedure coeff_sort_f (passed,farewell,edgelist)$
  2239. if null passed then
  2240. if null farewell then nil
  2241. else error(51,nil)
  2242. else
  2243. if s_atlas_coeff car passed then %NOT EMPTY COEFF
  2244. coeff_sort (append(
  2245. s_atlas_coeff car passed,
  2246. mk_atlas (s_atlas_map_ car passed,
  2247. nil,
  2248. s_atlas_den_om car passed) .
  2249. append(cdr passed,farewell)),
  2250. nil,
  2251. edgelist)
  2252. else coeff_sort_f (cdr passed,
  2253. car passed . farewell,
  2254. edgelist) $
  2255. %.......... 31.05.88 ::::::::::: $
  2256. symbolic procedure coeff_ordn (atlaslist,edgelist)$
  2257. for each satlas in
  2258. coeff_ordn1 (mk_spec_atlaslist (atlaslist,edgelist),nil)
  2259. collect cdr satlas$
  2260. symbolic procedure mk_spec_atlaslist (atlaslist,edgelist)$
  2261. for each atlas in atlaslist collect mk_spec_atlas (atlas,edgelist)$
  2262. symbolic procedure mk_spec_atlas (atlas,edgelist)$
  2263. %RETURN PAIR (PAIR1 . ATLAS)
  2264. %WHERE PAIR1 IS A PAIR - EDGES . PARENTS
  2265. %WHERE EDGES - ALL EDGES OF ATLAS
  2266. %WHERE PARENTS-THOSE PARENTS OF EDGES WICH NOT CONTAITED IN EDGELIST
  2267. (lambda edges$
  2268. (edges . diff_edges (edges_parents edges,edgelist)) . atlas)
  2269. atlas_edges atlas$
  2270. symbolic procedure edges_parents edgelist$
  2271. if null edgelist then nil
  2272. else
  2273. (lambda z$
  2274. append(z ,edges_parents cdr edgelist))
  2275. edge_new_parents car edgelist$
  2276. symbolic procedure edge_new_parents edge$
  2277. % SELECT EDGE PARENTS FROM NEW_EDGE_LIST$
  2278. if p_old_edge edge then nil else
  2279. (lambda names$
  2280. edge_new_parent list(car names,cdr names))
  2281. s_edge_prop_ edge$
  2282. symbolic procedure edge_new_parent namelist$
  2283. if null namelist then nil
  2284. else
  2285. (lambda z$
  2286. if z then z . edge_new_parent cdr namelist
  2287. else edge_new_parent cdr namelist)
  2288. assoc(car namelist,new_edge_list) $
  2289. symbolic procedure diff_edges (edgelist1,edgelist2)$
  2290. if null edgelist1 then nil
  2291. else
  2292. if p_member_edge (car edgelist1,edgelist2) then
  2293. diff_edges (cdr edgelist1,edgelist2)
  2294. else car edgelist1 .
  2295. diff_edges (cdr edgelist1,edgelist2)$
  2296. symbolic procedure coeff_ordn1 (satlaslist,passed)$
  2297. if null satlaslist then passed
  2298. else
  2299. %IF NULL CAAR SATLASLIST THEN %ATLAS HAS NO UNDEFINED
  2300. % COEFF_ORDN1 (CDR SATLASLIST,CAR SATLASLIST . PASSED)
  2301. %ELSE
  2302. (lambda z$ % Z - NIL OR SATLASLIST
  2303. if z then % SUBATLAS FINED AND ADDED$
  2304. coeff_ordn1 (z,passed)
  2305. else coeff_ordn1 (cdr satlaslist,car satlaslist . passed) )
  2306. p_subsatlaslist (car satlaslist,cdr satlaslist,nil)$
  2307. symbolic procedure p_subsatlaslist (satlas,satlaslist,passed)$
  2308. if null satlaslist then nil
  2309. else
  2310. if or_subsatlas(satlas,car satlaslist) then
  2311. embed_satlases (satlas,car satlaslist) .
  2312. nconc(passed,cdr satlaslist)
  2313. else p_subsatlaslist (satlas,
  2314. cdr satlaslist,
  2315. car satlaslist . passed)$
  2316. symbolic procedure or_subsatlas (satlas1,satlas2)$
  2317. p_subsatlas (satlas1,satlas2)
  2318. or
  2319. p_subsatlas (satlas2,satlas1) $
  2320. symbolic procedure p_subsatlas (satlas1,satlas2)$
  2321. p_subedgelist (caar satlas1,caar satlas2)
  2322. or
  2323. p_inbothlists (cdar satlas1,caar satlas2) $
  2324. symbolic procedure p_inbothlists (edgelist1,edgelist2)$
  2325. if null edgelist1 then nil
  2326. else p_member_edge (car edgelist1,edgelist2)
  2327. or
  2328. p_inbothlists (cdr edgelist1,edgelist2)$
  2329. symbolic procedure p_subedgelist (edgelist1,edgelist2)$
  2330. if null edgelist1 then t
  2331. else
  2332. p_member_edge (car edgelist1,edgelist2)
  2333. and
  2334. p_subedgelist (cdr edgelist1,edgelist2)$
  2335. symbolic procedure embed_satlases (satlas1,satlas2)$
  2336. if p_subsatlas (satlas1,satlas2) then embed_satlas (satlas1,satlas2)
  2337. else
  2338. if p_subsatlas (satlas2,satlas1) then embed_satlas (satlas2,satlas1)
  2339. else set_error_real ('embed_satlases,list(satlas1,satlas2)) $
  2340. symbolic procedure embed_satlas (satlas1,satlas2)$
  2341. car satlas2 . embed_atlas (cdr satlas1,cdr satlas2)$
  2342. symbolic procedure embed_atlas (atlas1,atlas2)$
  2343. %EMBED ATLAS1 INTO ATLAS2
  2344. mk_atlas (s_atlas_map_ atlas2,
  2345. atlas1 . s_atlas_coeff atlas2,
  2346. s_atlas_den_om atlas2)$
  2347. symbolic procedure coeff_sortl1 (atlaslist,passed,edgelist)$
  2348. if null atlaslist then
  2349. if null passed then nil
  2350. else list coeff_sort_f (passed,nil,edgelist)
  2351. else
  2352. (lambda z$
  2353. if z then %ATLAS SORTED
  2354. z . coeff_sortl1 (cdr atlaslist,passed,edgelist)
  2355. else coeff_sortl1 (cdr atlaslist,car atlaslist . passed,edgelist))
  2356. atlas_sort (car atlaslist,edgelist)$
  2357. % ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,$
  2358. %END$ %cvit82.red
  2359. %:*:*:*:*:*:*:*:*:*:*:*:* FACTORIZATION OF MAP_S :*:*:*:*:*:*:*:*:*:$
  2360. % 19.05.88 $
  2361. lisp$
  2362. symbolic procedure renamel_edges edges$
  2363. if not equal_edges (car edges,cadr edges) then
  2364. rename_edges (car edges ,cadr edges)$
  2365. symbolic procedure map__vertex_first map_$
  2366. mk_vertex1_map_
  2367. s_vertex_first map_$
  2368. symbolic procedure both_empty_map_s (map_1,map_2)$
  2369. p_empty_map_ map_1
  2370. and
  2371. p_empty_map_ map_2 $
  2372. symbolic procedure has_parents edge$
  2373. (lambda z$
  2374. car z neq '!? and
  2375. cdr z neq '!? )
  2376. s_edge_prop_ edge $
  2377. symbolic procedure less_edge (edge1,edge2,edgelist)$
  2378. % EDGE1 < EDGE2 IFF EDGE1 WAS CREATED EARLIER$
  2379. less_edge_name (s_edge_name edge1,
  2380. s_edge_name edge2,
  2381. edgelist)$
  2382. symbolic procedure less_edge_name (name1,name2,edgelist)$
  2383. if null edgelist then set_error_real ('less_edge_name ,
  2384. list(name1,name2,edgelist))
  2385. else
  2386. if name1 eq s_edge_name car edgelist then nil
  2387. else
  2388. if name2 eq s_edge_name car edgelist then t
  2389. else less_edge_name (name1,name2,cdr edgelist)$
  2390. symbolic procedure rename_edges (edge1,edge2)$
  2391. if p_old_edge edge1 then
  2392. %IF P_OLD_EDGE EDGE2 THEN OLD_EDGE_LIST
  2393. if p_old_edge edge2 then replace_old_edge (edge1,edge2)
  2394. else replace_edge (edge2,edge1,new_edge_list )
  2395. else
  2396. if p_old_edge edge2 then replace_edge (edge1,edge2,
  2397. new_edge_list )
  2398. else
  2399. if has_parents edge1 then
  2400. if has_parents edge2 then replace_new_edge (edge1,edge2)
  2401. else replace_edge (edge2,edge1,new_edge_list )
  2402. else
  2403. if has_parents edge2 then
  2404. replace_edge (edge1,edge2,new_edge_list )
  2405. else replace_new_edge (edge1,edge2)$
  2406. symbolic procedure replace_new_edge (edge1,edge2)$
  2407. replace_o_edge (edge1,edge2,new_edge_list )$
  2408. symbolic procedure replace_old_edge (edge1,edge2)$
  2409. % 31.08.90 RT
  2410. if is_indexp edge1 then
  2411. if is_indexp edge2 then
  2412. replace_o_edge (edge1,edge2,old_edge_list )
  2413. else replace_edge (edge1,edge2,old_edge_list)
  2414. else
  2415. if is_indexp edge2 then
  2416. replace_edge (edge2,edge1,old_edge_list)
  2417. else
  2418. replace_o_edge (edge1,edge2,old_edge_list )$
  2419. symbolic procedure replace_o_edge (edge1,edge2,edgelist)$
  2420. if less_edge (edge1,edge2,edgelist) then
  2421. replace_edge (edge2,edge1,edgelist)
  2422. else replace_edge (edge1,edge2,edgelist)$
  2423. symbolic procedure copy_edge edge$
  2424. car edge . cadr edge . caddr edge . nil $
  2425. symbolic procedure replace_edge2 (oldedge,newedge)$
  2426. << rplaca(oldedge,car newedge)$
  2427. rplacd(oldedge,cdr newedge) >> $
  2428. symbolic procedure replace_edge (oldedge,newedge,edgelist)$
  2429. replace1_edge (copy_edge oldedge,newedge,edgelist)$
  2430. symbolic procedure replace1_edge (oldedge,newedge,edgelist)$
  2431. if null edgelist then nil
  2432. else
  2433. << if equal_edges (oldedge,car edgelist) then
  2434. replace_edge2 (car edgelist,newedge)$
  2435. replace1_parents (oldedge,newedge,car edgelist)$
  2436. replace1_edge (oldedge,newedge,cdr edgelist) >> $
  2437. symbolic procedure replace1_parents (oldedge,newedge,edge)$
  2438. replace2_parents (s_edge_name oldedge,
  2439. s_edge_name newedge,
  2440. s_edge_prop_ edge)$
  2441. symbolic procedure replace2_parents (oldname,newname,edgeprop_)$
  2442. << if oldname = car edgeprop_ then rplaca(edgeprop_,newname)$
  2443. if oldname = cdr edgeprop_ then rplacd(edgeprop_,newname) >> $
  2444. symbolic procedure mk_simple_map_ inmap_$
  2445. mk_simple_map_1 (inmap_,mk_empty_map_ (),nil,nil)$
  2446. symbolic procedure both_old edges$
  2447. p_old_edge car edges
  2448. and
  2449. p_old_edge cadr edges$
  2450. symbolic procedure both_vectors edges$ % 31.08.90 RT
  2451. not is_indexp car edges
  2452. and
  2453. not is_indexp cadr edges$
  2454. symbolic procedure old_renamel_edv (vertex,edges)$
  2455. % RENAMES EDGES IN VERTEX$
  2456. ren_edge (s_edge_name car edges .
  2457. s_edge_name cadr edges,vertex)$
  2458. symbolic procedure mk1_simple_map_ map_d$
  2459. %MAP_D IS A PAIR (MAP_.DEN_OM)$
  2460. mk_simple_map_1 (car map_d,mk_empty_map_ (),list cdr map_d,nil)$
  2461. symbolic procedure mk_simple_map_1 (inmap_,outmap_,den_om,coeff)$
  2462. if p_empty_map_ inmap_ then <<
  2463. % FIND_BUBLTR
  2464. outmap_ := mk_parents_map_ outmap_;
  2465. mk_atlas (outmap_ ,
  2466. if null coeff then nil
  2467. else for each map_ in coeff collect mk1_simple_map_ map_,
  2468. den_om) >>
  2469. else
  2470. (lambda edges$
  2471. (lambda n$
  2472. if p_vertex_prim s_vertex_first inmap_ then
  2473. if n=2 then % VERTEX=(A,B)=DELTA(A,B) $
  2474. if both_old edges and both_vectors edges then % 31.08.90
  2475. mk_simple_map_1 (s_map__rest inmap_,
  2476. add_vertex (s_vertex_first inmap_,outmap_),
  2477. den_om,
  2478. coeff)
  2479. else
  2480. << renamel_edges edges$
  2481. if both_empty_map_s (s_map__rest inmap_,outmap_) then
  2482. mk_simple_map_1 (s_map__rest inmap_,
  2483. add_vertex (s_vertex_first inmap_,outmap_),
  2484. den_om,
  2485. coeff)
  2486. else
  2487. mk_simple_map_1 (s_map__rest inmap_,
  2488. outmap_,
  2489. den_om,
  2490. coeff )
  2491. >>
  2492. else
  2493. mk_simple_map_1 ( s_map__rest inmap_,
  2494. add_vertex ( s_vertex_first inmap_,outmap_),
  2495. den_om,
  2496. coeff)
  2497. else
  2498. if n=2 then
  2499. if both_old edges and both_vectors edges then %11.09.90 RT
  2500. mk_simple_map_1 (add_vertex (mk_edges_vertex edges,
  2501. s_map__rest inmap_),
  2502. outmap_,
  2503. den_om,
  2504. (mk_vertex1_map_ (
  2505. old_renamel_edv (s_vertex_first inmap_,edges) ) .
  2506. old_renamel_edv (mk_edges_vertex edges,edges))
  2507. . coeff )
  2508. else
  2509. << renamel_edges edges$
  2510. mk_simple_map_1 (s_map__rest inmap_,
  2511. outmap_,
  2512. den_om,
  2513. (map__vertex_first inmap_ . edges) . coeff)
  2514. >>
  2515. else
  2516. if n=3 and
  2517. ((map__length (inmap_) + map__length (outmap_)) > 2 )
  2518. then
  2519. (lambda v$
  2520. mk_simple_map_1 (add_vertex (v,s_map__rest inmap_),
  2521. outmap_,
  2522. den_om,
  2523. (add_vertex (v,map__vertex_first inmap_) . v)
  2524. . coeff))
  2525. mk_edges_vertex edges
  2526. else
  2527. if
  2528. (lambda k$
  2529. k > 4 and
  2530. n < k ) %NOT ALL LINES EXTERNAL $
  2531. vertex_length s_vertex_first inmap_
  2532. then
  2533. (lambda firz$
  2534. mk_simple_map_1 (append_map_s (firz,s_map__rest inmap_),
  2535. outmap_,
  2536. den_om,
  2537. coeff) )
  2538. (mk_firz_op s_vertex_first inmap_) %26.04.88
  2539. else if t then
  2540. mk_simple_map_1 (s_map__rest inmap_,
  2541. add_vertex (s_vertex_first inmap_,outmap_),
  2542. den_om,
  2543. coeff)
  2544. else
  2545. mk_simple_map_1 (append_map_s (mk_simple_vertex
  2546. s_vertex_first inmap_,
  2547. s_map__rest inmap_),
  2548. outmap_,
  2549. den_om,
  2550. coeff) )
  2551. length edges)
  2552. (ext_edges s_vertex_first inmap_) $
  2553. % ?^?^?^?^?^?^?^?^?^?^?^?^? FIERZ OPTIMIZATION ?^?^?^?^?^?^?^?^?^?^?^?$
  2554. % 13.05.88$
  2555. global '(!*cvitop)$
  2556. flag('(cvitop),'switch)$
  2557. symbolic procedure mk_firz_op vertex$
  2558. if null !*cvitop then mk_firz vertex
  2559. else firz_op vertex$
  2560. symbolic procedure firz_op vertex$
  2561. mk_firz find_cycle (optimal_edge vertex,
  2562. vertex,
  2563. mk_empty_vertex ())$
  2564. symbolic procedure find_cycle (edge,vertex,passed)$
  2565. if equal_edges (edge,first_edge vertex) then
  2566. append_vertex (vertex,reversip_vertex passed)
  2567. else find_cycle (edge,
  2568. s_vertex_rest vertex,
  2569. add_edge (first_edge vertex,passed))$
  2570. symbolic procedure optimal_edge vertex$
  2571. optimal1_edge
  2572. internal_edges (vertex,mk_empty_vertex ())$
  2573. symbolic procedure internal_edges (vertex1,vertex2)$
  2574. if p_empty_vertex vertex1 then vertex2
  2575. else
  2576. if p_member_edge (first_edge vertex1,s_vertex_rest vertex1)
  2577. or
  2578. p_member_edge (first_edge vertex1,vertex2)
  2579. then internal_edges (s_vertex_rest vertex1,
  2580. add_edge (first_edge vertex1,vertex2))
  2581. else internal_edges (s_vertex_rest vertex1,vertex2)$
  2582. symbolic procedure optimal1_edge vertex$
  2583. % VERTEX CONTAINS ONLY PAIRED EDGES
  2584. (lambda (l,z)$
  2585. opt_edge (z,
  2586. edge_distance (z,vertex,l),
  2587. s_vertex_rest vertex,
  2588. add_edge (z,mk_empty_vertex ()),
  2589. l))
  2590. (vertex_length vertex,
  2591. first_edge vertex)$
  2592. symbolic procedure edge_distance (edge,vertex,l)$
  2593. % L - FULL VERTEX LENGTH
  2594. (lambda n$
  2595. min(n,l - n - 2))
  2596. edge_dist (edge,s_vertex_rest vertex)$
  2597. symbolic procedure edge_dist (edge,vertex)$
  2598. if equal_edges (edge,first_edge vertex) then 0
  2599. else add1 edge_dist (edge,s_vertex_rest vertex)$
  2600. symbolic procedure opt_edge (edge,distance,vertex,passed,n)$
  2601. % N - FULL VERTEX LENGTH
  2602. if distance = 0 or p_empty_vertex vertex then edge
  2603. else
  2604. (lambda firstedge$
  2605. if p_member_edge (firstedge,passed) then
  2606. opt_edge (edge,
  2607. distance,
  2608. s_vertex_rest vertex,
  2609. passed,
  2610. n)
  2611. else
  2612. (lambda dist$
  2613. if dist < distance then
  2614. opt_edge (firstedge,
  2615. dist,
  2616. s_vertex_rest vertex,
  2617. add_edge (firstedge,passed),
  2618. n)
  2619. else opt_edge (edge,
  2620. distance,
  2621. s_vertex_rest vertex,
  2622. add_edge (firstedge,passed),
  2623. n))
  2624. edge_distance (firstedge,vertex,n))
  2625. first_edge vertex $
  2626. %<?><?><?><?><?><?><?> END OF OPTIMIZATION PART <?><?><?><?><?><?> $
  2627. symbolic procedure mk_firz vertex$
  2628. % VERTEX=(A1,...,AM,Z,B1,...,BN,Z,C1,...,CK)
  2629. % RETURNS UNION MAP_ WHERE
  2630. % MAP_ =MAP_1 & MAP_2 WHERE
  2631. % MAP_1=((B1,...,BN,X)(Y,C1,...,CK,A1,...,AM)),
  2632. % MAP_2=((Z,X,Z,Y)) $
  2633. mk_firz1 (vertex,mk_empty_vertex ())$
  2634. symbolic procedure mk_firz1 (vertex1,vertex2)$
  2635. if p_empty_vertex vertex1 then reversip_vertex vertex2
  2636. else
  2637. (lambda z$
  2638. if z then %FIRST EDGE CONTAINS TWICE$
  2639. mk_firz2 (first_edge vertex1,
  2640. car z,
  2641. append_vertex (cdr z,reversip_vertex vertex2))
  2642. else
  2643. mk_firz1 (s_vertex_rest vertex1,
  2644. add_edge (first_edge vertex1,vertex2) ) )
  2645. mp_member_edge (first_edge vertex1,
  2646. s_vertex_rest vertex1)$
  2647. symbolic procedure mk_firz2 (edge,vertex1,vertex2)$
  2648. %RETURNS MAP_ =MAP_1 & MAP_2 ,
  2649. %VERTEX1=(B1,...,BN),
  2650. %VERTEX2=(C1,...,CK,A1,...,AM) $
  2651. (lambda (nedge,nedg1)$
  2652. append_map_s (
  2653. mk_coeff2 (edge,nedge,nedg1),
  2654. mk_vertex2_map_ (conc_vertex (vertex1,mk_edge1_vertex nedge),
  2655. add_edge (nedg1,vertex2))
  2656. ))
  2657. (mk_nedge (),
  2658. mk_nedge ()) $
  2659. symbolic procedure mk_coeff2 (edge,nedge,nedg1)$
  2660. mk_vertex1_map_ mk_edge4_vertex (edge,nedge,edge,nedg1)$
  2661. symbolic procedure mk_nedge $
  2662. (lambda edge$
  2663. new_edge (edge,edge))
  2664. mk_edge ('!?,'!? . '!?,nil) $
  2665. symbolic procedure mp_member_edge (edge,vertex)$
  2666. % RETURNS NIL OR PAIR.
  2667. % IF VERTEX=(A1,...,AM,EDGE,...,B1,...,BN) THEN
  2668. % PAIR= (A1,...,AM) . (B1,...,BM) $
  2669. mp_member1_edge (edge,vertex,mk_empty_vertex ())$
  2670. symbolic procedure mp_member1_edge (edge,vertex,tail)$
  2671. if p_empty_vertex vertex then nil
  2672. else
  2673. if
  2674. equal_edges (edge,first_edge vertex) then
  2675. reversip_vertex tail .
  2676. s_vertex_rest vertex
  2677. else mp_member1_edge (edge,
  2678. s_vertex_rest vertex,
  2679. add_edge (first_edge vertex,tail) ) $
  2680. %END$ %cvit10.red
  2681. % ()()()()()()()()()()()()()() PRINTING ATLAS AND MAP_ ROUTINES ()()().
  2682. lisp$ %30.01.87$
  2683. fluid '(ntab!*)$
  2684. symbolic procedure print_atlas atlas$
  2685. begin
  2686. scalar ntab!*$
  2687. ntab!*:=0$
  2688. prin2_atlas atlas$
  2689. end$
  2690. symbolic procedure prin2_atlas atlas$
  2691. if null atlas then nil
  2692. else
  2693. << print_map_ s_atlas_map_ atlas$
  2694. print_den_om s_atlas_den_om atlas$
  2695. print_coeff s_atlas_coeff atlas
  2696. >> $
  2697. symbolic procedure print_map_ map_$
  2698. << pttab ntab!*$
  2699. prin2 "Map_ is: ("$
  2700. prin2_map_ map_$
  2701. prin2 " )"$
  2702. terpri() >> $
  2703. symbolic procedure prin2_map_ map_$
  2704. if p_empty_map_ map_ then nil
  2705. else
  2706. << print_vertex s_vertex_first map_$
  2707. prin2_map_ s_map__rest map_ >> $
  2708. symbolic procedure print_vertex vertex$
  2709. <<
  2710. prin2 "( "$
  2711. prin2_vertex vertex$
  2712. prin2 ")" >> $
  2713. symbolic procedure prin2_vertex vertex$
  2714. if p_empty_vertex vertex then nil
  2715. else
  2716. << print_edge first_edge vertex$
  2717. prin2_vertex s_vertex_rest vertex >> $
  2718. symbolic procedure print_edge edge$
  2719. << prin2_edge edge$
  2720. prin2 " " >> $
  2721. symbolic procedure prin2_edge edge$
  2722. prin2 s_edge_name edge $
  2723. symbolic procedure pttab n$
  2724. << spaces n $ % TTAB N$ % 07.06.90
  2725. prin2 n$
  2726. prin2 ":" >> $
  2727. symbolic procedure print_coeff coeff$
  2728. << ntab!*:=ntab!*+1$
  2729. prin2_coeff coeff$
  2730. ntab!*:=ntab!*-1 >> $
  2731. symbolic procedure prin2_coeff atlases$
  2732. if null atlases then nil
  2733. else << prin2_atlas car atlases$
  2734. prin2_coeff cdr atlases >> $
  2735. symbolic procedure print_den_om den_list$
  2736. << pttab ntab!*$
  2737. prin2 "DEN_OM is: "$
  2738. if null den_list then prin2 nil
  2739. else prin2_map_ den_list $
  2740. terpri() >> $
  2741. unfluid '(ntab!*)$
  2742. symbolic procedure print_old_edges ()$
  2743. print_edge_list old_edge_list $
  2744. symbolic procedure print_new_edges ()$
  2745. print_edge_list new_edge_list $
  2746. symbolic procedure print_edge_list edgelist$
  2747. if null edgelist then nil
  2748. else << print car edgelist$
  2749. print_edge_list cdr edgelist >> $
  2750. %END$ %cvit12.red
  2751. %---------------------- MAKES PARENTS AFTER FIERZING ----------------$
  2752. %24.05.88$
  2753. lisp$
  2754. symbolic procedure mk_simpl_map_ map_$
  2755. mk_simpl_map_1 (map_,mk_empty_map_ ())$
  2756. symbolic procedure mk_simpl_map_1 (inmap_,outmap_)$
  2757. if p_empty_map_ inmap_ then resto_map__order outmap_
  2758. else
  2759. if p_vertex_prim s_vertex_first inmap_ then
  2760. mk_simpl_map_1 ( s_map__rest inmap_,
  2761. add_vertex (mk_parents_prim s_vertex_first inmap_,
  2762. outmap_))
  2763. else
  2764. mk_simpl_map_1 (append_map_s (mk_simple_vertex s_vertex_first inmap_,
  2765. s_map__rest inmap_),
  2766. outmap_)$
  2767. symbolic procedure mk_simple_vertex vertex$
  2768. % VERTEX => MAP_ $
  2769. begin
  2770. scalar nedge,fedge,sedge$
  2771. fedge:=first_edge vertex$
  2772. sedge:=second_edge vertex$
  2773. if not has_parents fedge or not has_parents sedge then
  2774. return mk_simple_vertex cycl_vertex vertex$
  2775. nedge:=new_edge (fedge,sedge)$
  2776. vertex:=s_vertex_rest
  2777. s_vertex_rest vertex$
  2778. return
  2779. mk_vertex2_map_ ( mk_edge3_vertex (nedge,fedge,sedge),
  2780. add_edge (nedge,vertex))
  2781. end$
  2782. symbolic procedure mk_parents_map_ map_$
  2783. %MAKES PARENTS FOR ALL EDGES IN MAP_.
  2784. %THIS CAN BE DONE BECAUSE NEW EDGES NEVER CREATE CYCLES$
  2785. standard_map_
  2786. mk_simpl_map_
  2787. mk_parents1_map_ (map_,mk_empty_map_ (),mk_empty_map_ ())$
  2788. symbolic procedure standard_map_ map_$
  2789. if p_empty_map_ map_ then mk_empty_map_ ()
  2790. else
  2791. if vertex_length s_vertex_first map_ > 2 then
  2792. add_vertex (s_vertex_first map_,
  2793. standard_map_ s_map__rest map_)
  2794. else standard_map_ add_vertex (add_0_edge s_vertex_first map_,
  2795. s_map__rest map_)$
  2796. symbolic procedure add_0_edge vertex$
  2797. %ADDS SPECIAL VERTEX$
  2798. add_edge (!_0edge ,vertex)$
  2799. symbolic procedure mk_parents1_map_ (inmap_,outmap_,passed)$
  2800. if p_empty_map_ inmap_ then
  2801. if p_empty_map_ passed then outmap_ %ALL EDGES HAVE PARENTS$
  2802. else mk_parents1_map_ (passed,outmap_,mk_empty_map_ ())
  2803. else
  2804. (lambda edges$
  2805. if null edges then %IN FIRST VERTEX ALL EDGES HAVE PARENTS$
  2806. mk_parents1_map_ (s_map__rest inmap_,
  2807. add_vertex (s_vertex_first inmap_,outmap_),
  2808. passed)
  2809. else
  2810. if single_no_parents edges then %ONLY ONE EDGE IN THE VERTEX$
  2811. %HAS NO PARENTS$
  2812. mk_parents1_map_ (s_map__rest inmap_,
  2813. append_map_s (mk_parents_vertex s_vertex_first inmap_,
  2814. outmap_),
  2815. passed)
  2816. else
  2817. mk_parents1_map_ (s_map__rest inmap_,
  2818. outmap_,
  2819. add_vertex (s_vertex_first inmap_,passed)))
  2820. s_noparents s_vertex_first inmap_ $
  2821. symbolic procedure s_noparents vertex$
  2822. %SELECTS EDGES WITHOUT PARENTS IN VERTEX$
  2823. if p_empty_vertex vertex then nil
  2824. else
  2825. if has_parents first_edge vertex then
  2826. s_noparents s_vertex_rest vertex
  2827. else
  2828. first_edge vertex .
  2829. s_noparents s_vertex_rest vertex$
  2830. symbolic procedure mk_parents_vertex vertex$
  2831. %MAKES PARENTS FOR THE SINGLE EDGE WITHOUT PARENTS IN VERTEX,
  2832. % (VERTEX HAS ONLY ONE EDGE WITHOUT PARENTS ^) $
  2833. mk_simpl_map_ mk_vertex1_map_ vertex$
  2834. symbolic procedure mk_parents_prim pvertex$
  2835. % CREATES PARENTS FOR THE ONLY EDGE WITHOUT PARENTS IN PRIMITIVE
  2836. % (THREE EDGES) VERTEX $
  2837. if vertex_length pvertex neq 3 then pvertex
  2838. else
  2839. (lambda edges$
  2840. if null edges then pvertex
  2841. else
  2842. << mk_edge_parents (pvertex,car edges)$
  2843. pvertex >> )
  2844. s_noparents pvertex$
  2845. symbolic procedure mk_edge_parents (vertex,edge)$
  2846. mk_edge1_parents (delete_edge (edge,vertex),edge)$
  2847. symbolic procedure mk_edge1_parents (vertex2,edge)$
  2848. add_parents (edge,
  2849. mk_edge_prop_ (
  2850. s_edge_name first_edge vertex2,
  2851. s_edge_name second_edge vertex2))$
  2852. symbolic procedure add_parents (edge,names)$
  2853. add_parents0(edge,names,nil)$
  2854. symbolic procedure add_parents0 (edge,names,bool)$
  2855. addl_parents (new_edge_list,edge,names . list bool)$
  2856. symbolic procedure addl_parents (edgelist,edge,names)$
  2857. % NAMES IS A PAIR NAME1 . NAME2 $
  2858. if null edgelist then nil
  2859. else
  2860. (if equal_edges (car edgelist,edge) then
  2861. rep_parents (car edgelist,names)
  2862. else car edgelist) .
  2863. addl_parents (cdr edgelist,edge,names) $
  2864. symbolic procedure rep_parents (edge,names)$
  2865. << rplacd(edge,names)$
  2866. edge >> $
  2867. %END$ %cvit14.red
  2868. %EEEEEEEEEEEEEEEEEEEEEEEEE SELECT ALL EDGES %%%%%%%%%%%%%%%%%%%%%%%%% $
  2869. % 07.06.88$
  2870. lisp$
  2871. symbolic procedure atlas_edges atlas$
  2872. union_edges (
  2873. union_edges (map__edges s_atlas_map_ atlas,
  2874. den__edges s_atlas_den_om atlas),
  2875. coeff_edges s_atlas_coeff atlas)$
  2876. symbolic procedure den__edges den_om$
  2877. map__edges den_om$
  2878. symbolic procedure coeff_edges atlaslist$
  2879. if null atlaslist then nil
  2880. else union_edges (atlas_edges car atlaslist,
  2881. coeff_edges cdr atlaslist) $
  2882. symbolic procedure map__edges map_$
  2883. if p_empty_map_ map_ then nil
  2884. else union_edges (vertex_edges s_vertex_first map_,
  2885. map__edges s_map__rest map_)$
  2886. symbolic procedure union_edges (newlist,oldlist)$
  2887. if null newlist then oldlist
  2888. else union_edges (cdr newlist,
  2889. union_edge (car newlist,oldlist))$
  2890. symbolic procedure union_edge (edge,edgelist)$
  2891. if memq_edgelist (edge,edgelist) then edgelist
  2892. else edge . edgelist$
  2893. symbolic procedure memq_edgelist (edge,edgelist)$
  2894. assoc(s_edge_name edge,
  2895. edgelist)$
  2896. symbolic procedure exclude_edges (edgelist,exclude)$
  2897. % EXCLUDE IS A LIST OF EDGES TO BE EXCLUDED FROM EDGELIST$
  2898. if null edgelist then nil
  2899. else
  2900. if memq_edgelist (car edgelist,exclude) then
  2901. exclude_edges (cdr edgelist,exclude)
  2902. else car edgelist .
  2903. exclude_edges (cdr edgelist,exclude) $
  2904. symbolic procedure constr_worlds (atlas,edgelist)$
  2905. (lambda edges$
  2906. actual_edges_world (
  2907. mk_world1 (actual_edges_map_ (edges,
  2908. edgelist,
  2909. s_atlas_map_ atlas),
  2910. constr_coeff (s_atlas_coeff atlas,
  2911. union_edges (edges,edgelist)),
  2912. s_atlas_den_om atlas
  2913. )
  2914. ) )
  2915. union_edges(
  2916. den__edges s_atlas_den_om atlas,
  2917. map__edges s_atlas_map_ atlas)$
  2918. symbolic procedure constr_coeff (atlases,edgelist)$
  2919. if null atlases then nil
  2920. else
  2921. constr_worlds (car atlases,edgelist) .
  2922. constr_coeff (cdr atlases,edgelist)$
  2923. symbolic procedure actual_edges_map_ (edges,edgelist,map_)$
  2924. actedge_map_ (edges,edgelist,list_of_parents(edges,edgelist),nil)
  2925. %ACTEDGE_MAP_ (EDGES,EDGELIST,NIL,NIL)
  2926. . map_$
  2927. symbolic procedure list_of_parents (edges,edgelist)$
  2928. if null edges then nil
  2929. else append(list_of_parent (car edges,edgelist),
  2930. list_of_parents (cdr edges,edgelist))$
  2931. symbolic procedure list_of_parent (edge,edgelist)$
  2932. if p_old_edge edge or memq_edgelist (edge,edgelist) then nil
  2933. %IF EDGE IS DEF. THEN NO NEED IN ITS PARENTS
  2934. else
  2935. begin$
  2936. scalar pr1,pr2,p,s$
  2937. p:=s_edge_prop_ edge$
  2938. pr1:=assoc(car p,edgelist)$
  2939. if pr1 then s:=pr1 . s$
  2940. pr2:=assoc(cdr p,edgelist)$
  2941. if pr2 then s:=pr2 . s$
  2942. %IF NULL PR1 OR NULL PR2 THEN
  2943. % SET_ERROR (LIST_OF_PARENTS ,EDGE,EDGELIST)$
  2944. return s
  2945. end$
  2946. symbolic procedure actedge_map_ (edges,edgelist,old,new)$
  2947. if null edges then old . new
  2948. else
  2949. if memq_edgelist (car edges,edgelist) then
  2950. actedge_map_ (cdr edges,edgelist,car edges . old,new)
  2951. else actedge_map_ (cdr edges,edgelist,old,car edges . new) $
  2952. symbolic procedure actual_edges_world world1$
  2953. mk_world (actual_world (s_actual_world1 world1,
  2954. s_actual_coeff s_coeff_world1 world1),
  2955. world1)$
  2956. symbolic procedure mk_world1 (edges!-map_,coeff,den_om)$
  2957. mk_atlas (map_2_from_map_1 edges!-map_,coeff,den_om)$
  2958. symbolic procedure map_2_from_map_1 map_1$
  2959. list(map_1_to_strand1 map_1,
  2960. list nil,
  2961. mark_edges (cdar map_1,
  2962. % UNION_EDGES(OLD_EDGE_LIST,CAAR MAP_1),
  2963. caar map_1,
  2964. cdr map_1))$
  2965. symbolic procedure map_1_to_strand1 map_1$
  2966. car map_1 .
  2967. pre!-calc!-map_ (cdr map_1,
  2968. names_edgepair map__edges cdr map_1)$
  2969. symbolic procedure names_edgepair edgepair$
  2970. %NCONC(FOR EACH EDGE IN CAR EDGEPAIR COLLECT S_EDGE_NAME EDGE,
  2971. % FOR EACH EDGE IN CDR EDGEPAIR COLLECT S_EDGE_NAME EDGE)$
  2972. for each edge in edgepair collect s_edge_name edge $
  2973. symbolic procedure s_actual_world1 world1$
  2974. %RETURNS PAIR: OLDEDGES . NEWEDGES $
  2975. caar s_atlas_map_ world1$
  2976. symbolic procedure actual_world (map_edges,coeffedges)$
  2977. %MAP_EDGES IS A PAIR OLD . NEW,
  2978. %COEFFEDGES IS LIST OF ACTUAL EDGES OF COEEF.$
  2979. union_edges (car map_edges,
  2980. exclude_edges (coeffedges,cdr map_edges)) $
  2981. symbolic procedure s_actual_coeff worldlist$
  2982. if null worldlist then nil
  2983. else union_edges (s_edgelist_world car worldlist,
  2984. s_actual_coeff cdr worldlist) $
  2985. symbolic procedure world_from_atlas atlas$
  2986. %TOP LEVEL PROCEDURE$
  2987. constr_worlds (atlas,old_edge_list )$
  2988. %END$ %cvit16.red
  2989. %^^^^^^^^^^^^^^^^^^^^^^^^^^ CALCULATION OF WORLDS ^^^^^^^^^^^^^^^^^^^ $
  2990. %26.03.88$
  2991. lisp$
  2992. symbolic procedure s_world_names world$
  2993. for each edge in s_world_edges world
  2994. collect s_edge_name edge$
  2995. symbolic procedure calc_world (world,alst)$
  2996. % ALST LIST OF VALUES OF EXTERNAL EDGES: (... (EDGNAME . NUMBER) ...)$
  2997. begin
  2998. scalar s,v$
  2999. alst:=actual_alst (alst, %SELECT ONLY THOSE
  3000. s_world_names world)$ %EDGES WICH ARE IN WORLD
  3001. v:=s_world_var world $ %SELECT DATA BASE
  3002. s:=assoc(alst,cdr v)$ %CALC. PREVIOSLY?
  3003. if s then return cdr s$ %PREV. RESULT$
  3004. s:=reval
  3005. calc_atlas (s_world_atlas world,alst)$ %REAL CALCULATION
  3006. nconc (v,list(alst . s))$ %MODIFY DATA BASE
  3007. return s
  3008. end$
  3009. symbolic procedure actual_alst (alst,namelist)$
  3010. if null alst then nil
  3011. else
  3012. if memq(caar alst,namelist) then
  3013. car alst . actual_alst (cdr alst,namelist)
  3014. else actual_alst (cdr alst,namelist)$
  3015. symbolic procedure calc_atlas (atlas,alst)$
  3016. calc_map_2d (s_atlas_map_ atlas,
  3017. s_atlas_den_om atlas,
  3018. s_atlas_coeff atlas,
  3019. alst) $
  3020. symbolic procedure calc_coeff (worldlist,alst)$
  3021. if null worldlist then list 1
  3022. else
  3023. (lambda x$
  3024. if x=0 then list 0
  3025. else x . calc_coeff (cdr worldlist,alst))
  3026. calc_world (car worldlist,alst)$
  3027. symbolic procedure calc_map_2d (map_2,den_om,coeff,alst)$
  3028. coeff_calc (mk_names_map_2 caar map_2 .
  3029. cdar map_2 .
  3030. cadr map_2 .
  3031. den_om ,
  3032. coeff,
  3033. mk_binding (caddr map_2,alst)) $
  3034. symbolic procedure mk_names_map_2 edgespair$
  3035. % EDGESPAIR IS PAIR OF LISTS OF EDGES
  3036. % EDGELISTOLD . EDGELISTNEW $
  3037. for each edge in append(car edgespair,cdr edgespair)
  3038. collect s_edge_name edge$
  3039. symbolic procedure calc_coeffmap_ (s,coeff,alst)$
  3040. (lambda z$
  3041. if z = 0 then 0
  3042. else 'times . (z . calc_coeff (coeff,alst)))
  3043. calc_map_ (s,alst)$
  3044. symbolic procedure calc_map_ (mvd,alst)$
  3045. begin
  3046. scalar map_,v,names,s,den_om,al,d$
  3047. names:=car mvd$ %NAMES OF ALL EDGES
  3048. map_:=cadr mvd$ %SELECT MAP_
  3049. v:=caddr mvd$ %SELECT DATA BASE
  3050. den_om:=cdddr mvd$ %SELECT DEN_OMINATOR
  3051. al:=actual_alst (alst,names)$ %ACTUAL ALIST
  3052. if null al and names then return 0$ %NO VARIANTS OF
  3053. %COLOURING
  3054. s:=assoc(al,cdr v)$ %PREV.CALCULATED?
  3055. if s then s:=cdr s %YES, TAKE IT
  3056. else << %ELSE
  3057. s:=reval calc_map_tar (map_,al)$ %REAL CALCULATION
  3058. nconc(v,list(al . s)) %MODIFY DATA BASE
  3059. >> $
  3060. d:=calc_den_tar (den_om,alst)$ %CALC. DEN_OMINATOR
  3061. return
  3062. if d = 1 then s
  3063. else list('quotient,s,d) % 09.06.90 RT
  3064. end$
  3065. %SYMBOLIC PROCEDURE CALC_MAP_TAR (MAP_,BINDING)$
  3066. %1$
  3067. %SYMBOLIC PROCEDURE CALC_DEN_TAR (DEN_OMINATOR,BINDING)$
  3068. %1$
  3069. symbolic procedure coeff_calc (s,coeff,binding)$
  3070. %S IS EDGENAMES . MAP_ . DATABASE . DEN_OMINATOR $
  3071. reval
  3072. ('plus . coeff1_calc (s,coeff,binding))$
  3073. symbolic procedure coeff1_calc (s,coeff,binding)$
  3074. if null binding then list 0
  3075. else calc_coeffmap_ (s,coeff,car binding) .
  3076. coeff1_calc (s,coeff,cdr binding) $
  3077. %TOPTOPTOPTOPTOPTOPTOPTOPTOPTOPTOPTOPTOPTOPTOPTOPTOPTOPTOPTOPTOPTOPTOP$
  3078. symbolic procedure calc_spur0 u$
  3079. begin
  3080. scalar s$
  3081. if null u then return u$
  3082. s:=transform_map_ u$
  3083. old_edge_list := !_0edge . old_edge_list $
  3084. s:=find_bubltr s$
  3085. return
  3086. calc_world (world_from_atlas s,
  3087. for each edge in old_edge_list
  3088. collect s_edge_name edge .
  3089. car s_edge_prop_ edge )
  3090. end$
  3091. symbolic procedure calc_spur u$
  3092. simp!* calc_spur0 u$ %FOR KRYUKOV NEEDS$
  3093. endmodule$
  3094. end;