mirror of
				https://github.com/arranstewart/magic.git
				synced 2025-11-02 22:41:13 +00:00 
			
		
		
		
	Import of code from J Slaney web-page.
url: http://users.cecs.anu.edu.au/~jks/software/magic.2.2.1.tar.gz
This commit is contained in:
		
						commit
						e2efc4b8cd
					
				
					 57 changed files with 12700 additions and 0 deletions
				
			
		
							
								
								
									
										47
									
								
								README
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								README
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,47 @@
 | 
			
		|||
MaGIC (Matrix Generator for Implication Connectives) is a tool that
 | 
			
		||||
produces small algebraic models of non-classical propositional logics,
 | 
			
		||||
especially of the substructural sort. The logics are considered as
 | 
			
		||||
Hilbert (axiom) systems. Interaction with MaGIC is through a plain
 | 
			
		||||
text "terminal" window and is based on a menu. Help is available from
 | 
			
		||||
the menu.
 | 
			
		||||
 | 
			
		||||
Synopsis:
 | 
			
		||||
  magic [-b <filename>] [-t] [-x]
 | 
			
		||||
 | 
			
		||||
Options:
 | 
			
		||||
 | 
			
		||||
-b <filename> runs the program in batch mode with the specified file
 | 
			
		||||
  as input. The file should be one previously saved with the "Save"
 | 
			
		||||
  option from a previous run of MaGIC. This allows output to be piped
 | 
			
		||||
  through another program such as one of the utilities provided with
 | 
			
		||||
  MaGIC.
 | 
			
		||||
 | 
			
		||||
-t produces "terse" output, mainly meaning that it suppresses system
 | 
			
		||||
   calls such as those that clear the window each time the menu is
 | 
			
		||||
   printed.
 | 
			
		||||
 | 
			
		||||
-x causes the dialogue to be in a form suitable for "xmagic", the (now
 | 
			
		||||
   defunct) X Windows interface to MaGIC. It is the result of a
 | 
			
		||||
   message from Gustav Meglicki to John Slaney to the effect that the
 | 
			
		||||
   machine-readable I/O was "insufficiently user-hostile". Since
 | 
			
		||||
   xmagic is no longer supported, this option is a mere relic.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Installation:
 | 
			
		||||
 | 
			
		||||
  The main directory containing this README should have two
 | 
			
		||||
  subdirectories, one containing the program sources and the other
 | 
			
		||||
  containing various data files used by MaGIC. To make, go to the src
 | 
			
		||||
  directory and edit the Makefile. Only the top few lines require any
 | 
			
		||||
  change - mainly it is a matter of filling in the directories where
 | 
			
		||||
  the data files and the binaries are to be kept. Then "make" should
 | 
			
		||||
  make the programs and "make install" should simply move them and the
 | 
			
		||||
  data into the specified directories.As usual, "make clean" removes
 | 
			
		||||
  the .o files and possibly other junk.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Problems in installing or using MaGIC should be reported to the author
 | 
			
		||||
  John.Slaney@anu.edu.au
 | 
			
		||||
 | 
			
		||||
It is also recommended that if you install MaGIC you let us know, so
 | 
			
		||||
that we can inform you of any bug fixes or updates.
 | 
			
		||||
							
								
								
									
										19
									
								
								dat/BTW.show
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								dat/BTW.show
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,19 @@
 | 
			
		|||
 B  Axioms 1 - 8 as for FD.
 | 
			
		||||
           9.   ((A -> B) & (A -> C)) -> (A -> (B & C))
 | 
			
		||||
          10.   ((A -> C) & (B -> C)) -> ((A v B) -> C)
 | 
			
		||||
 | 
			
		||||
    Rules 1 - 2, 8 - 12 as for FD.
 | 
			
		||||
    Rules 6 and 7 replaced by the above axioms.
 | 
			
		||||
    Rules 3 - 5 replaced by:
 | 
			
		||||
 | 
			
		||||
          4'.   A -> B  ==>  (C -> A) -> (C -> B)
 | 
			
		||||
          5'.   A -> B  ==>  (B -> C) -> (A -> C)
 | 
			
		||||
 | 
			
		||||
 DW is B with rule 8 replaced by the axiom form:
 | 
			
		||||
 | 
			
		||||
    Axiom 11.   (A -> ~B) -> (B -> ~A)
 | 
			
		||||
 | 
			
		||||
 TW is DW with rules 4' and 5' replaced by the axiom forms:
 | 
			
		||||
 | 
			
		||||
    Axiom 12.   (A -> B) -> ((C -> A) -> (C -> B))
 | 
			
		||||
          13.   (A -> B) -> ((B -> C) -> (A -> C))
 | 
			
		||||
							
								
								
									
										15
									
								
								dat/CUT.show
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								dat/CUT.show
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,15 @@
 | 
			
		|||
 A user-defined connective may optionally be marked with a "cut".
 | 
			
		||||
 This serves to control backtracking much as in Prolog. MaGIC will
 | 
			
		||||
 not generate two models whose most significant difference is in 
 | 
			
		||||
 a connective with a cut.
 | 
			
		||||
 | 
			
		||||
 Thus for example, where `A' is a primitive 0-adic connective and 
 | 
			
		||||
 a rule
 | 
			
		||||
     A v ~A /
 | 
			
		||||
 has been added, MaGIC will normally generate failures of the law 
 | 
			
		||||
 of the excluded middle. However, if `A' has been marked with a cut
 | 
			
		||||
 then MaGIC will generate models in which that law fails: if it 
 | 
			
		||||
 fails for more than one element of a model, only the smallest such 
 | 
			
		||||
 element will be reported.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										21
									
								
								dat/FDL.show
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								dat/FDL.show
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,21 @@
 | 
			
		|||
 FD Axioms:  1.  A -> A
 | 
			
		||||
             2.  (A & B) -> A
 | 
			
		||||
             3.  (A & B) -> B
 | 
			
		||||
             4.  A -> (A v B)
 | 
			
		||||
             5.  B -> (A v B)
 | 
			
		||||
             6.  ~~A -> A
 | 
			
		||||
             7.  F -> A
 | 
			
		||||
             8.  A -> T
 | 
			
		||||
 | 
			
		||||
 Rules:  1.       A -> B,  A  ==>  B
 | 
			
		||||
         2.            A,  B  ==>  A & B
 | 
			
		||||
         3.  A -> B,  B -> C  ==>  A -> C
 | 
			
		||||
         4.  A -> B,  B -> A  ==>  (C -> A) -> (C -> B)
 | 
			
		||||
         5.  A -> B,  B -> A  ==>  (B -> C) -> (A -> C)
 | 
			
		||||
         6.  A -> B,  A -> C  ==>  A -> (B & C)
 | 
			
		||||
         7.  A -> C,  B -> C  ==>  (A v B) -> C
 | 
			
		||||
         8.          A -> ~B  ==>  B -> ~A
 | 
			
		||||
         9.                A  ==>  t -> A
 | 
			
		||||
        10.           t -> A  ==>  A
 | 
			
		||||
        11.    A -> (B -> C)  ==>  (A o B) -> C
 | 
			
		||||
        12.     (A o B) -> C  ==>  A -> (B -> C)
 | 
			
		||||
							
								
								
									
										21
									
								
								dat/LOG.show
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								dat/LOG.show
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,21 @@
 | 
			
		|||
 Axioms for the stronger logics are as follows:
 | 
			
		||||
 | 
			
		||||
     EW  is  TW   plus   ((A -> A) -> B) -> B
 | 
			
		||||
 
 | 
			
		||||
      C  is  TW   plus   A -> ((A -> B) -> B)
 | 
			
		||||
 
 | 
			
		||||
      T  is  TW   plus   (A -> (A -> B)) -> (A -> B)
 | 
			
		||||
 | 
			
		||||
                  and    (A -> ~A) -> ~A
 | 
			
		||||
 
 | 
			
		||||
      E  is  T    plus   ((A -> A) -> B) -> B 
 | 
			
		||||
 | 
			
		||||
      R  is  C    plus   (A -> (A -> B)) -> (A -> B)
 | 
			
		||||
 | 
			
		||||
     CK  is  C    plus   A -> (B -> A)
 | 
			
		||||
 | 
			
		||||
     S4  is  E    plus   A -> (B -> B)
 | 
			
		||||
 | 
			
		||||
 Axiomatisations of fragments of these logics result by 
 | 
			
		||||
 selecting the axioms and rules which explicitly mention 
 | 
			
		||||
 the appropriate connectives. 
 | 
			
		||||
							
								
								
									
										41
									
								
								dat/MEN.show
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								dat/MEN.show
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,41 @@
 | 
			
		|||
 
 | 
			
		||||
 Menu options:
 | 
			
		||||
 | 
			
		||||
 a:  Add a pre- or user-defined axiom or rule to the logic.
 | 
			
		||||
 
 | 
			
		||||
 b:  Specify a formula to fail in the matrices found.
 | 
			
		||||
 
 | 
			
		||||
 c:  Define a connective.   E.g.  +  defined  ~a -> b.
 | 
			
		||||
 
 | 
			
		||||
 d:  Delete either an axiom, a user-defined connective or the bad guy.
 | 
			
		||||
 
 | 
			
		||||
 e:  Exit from MAGIC.
 | 
			
		||||
 
 | 
			
		||||
 f:  Choose the fragment (pre-defined connectives).
 | 
			
		||||
 
 | 
			
		||||
 g:  Search for matrices.
 | 
			
		||||
 
 | 
			
		||||
 h:  Display this page.
 | 
			
		||||
 
 | 
			
		||||
 i:  Change the output formats.
 | 
			
		||||
 
 | 
			
		||||
 j:  Set a condition on which to jump out of the search.
 | 
			
		||||
 
 | 
			
		||||
 k:  Re-initialise everything.
 | 
			
		||||
 
 | 
			
		||||
 l:  Change your mind about your favourite logic.
 | 
			
		||||
 | 
			
		||||
 m:  Display information about MaGIC (version number etc).
 | 
			
		||||
 | 
			
		||||
 n:  Change number of processes (parallel version only).
 | 
			
		||||
 | 
			
		||||
 o:  Re-order dyadic connectives for scope or significance purposes.
 | 
			
		||||
 | 
			
		||||
 p:  Select which tables to print when matrices are found.
 | 
			
		||||
 | 
			
		||||
 q:  Quit MaGIC (equivalent to e).
 | 
			
		||||
 | 
			
		||||
 r:  Read a job specification from a named file.
 | 
			
		||||
 | 
			
		||||
 s:  Write the current job specification to a named file.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										22
									
								
								dat/OUT.show
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								dat/OUT.show
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,22 @@
 | 
			
		|||
 | 
			
		||||
 Output formats are as follows:
 | 
			
		||||
 
 | 
			
		||||
 "Pretty":  Matrices are printed in human-readable form.
 | 
			
		||||
            This is the default for tty output.  Each 
 | 
			
		||||
            matrix is followed by an assignment of values
 | 
			
		||||
            falsifying the "bad guy" if there is one.
 | 
			
		||||
 | 
			
		||||
 "Ugly":    Matrices are printed in a standard machine-
 | 
			
		||||
            readable form with -1 as break character.
 | 
			
		||||
            No headings, comments, etc. are included.
 | 
			
		||||
 | 
			
		||||
 "Summary": Only the numbers of matrices are printed.
 | 
			
		||||
            This is useful for checking the size of a
 | 
			
		||||
            job before getting a printout of matrices.
 | 
			
		||||
            It runs slightly faster than "pretty" or
 | 
			
		||||
            "ugly".
 | 
			
		||||
 | 
			
		||||
 "None":    No matrices are printed, although the final
 | 
			
		||||
            statistics are still sent to the tty.  This
 | 
			
		||||
            is the default for file output.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										22
									
								
								dat/WFF.show
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								dat/WFF.show
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,22 @@
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
 The following conventions govern typing of formulas.
 | 
			
		||||
 
 | 
			
		||||
 (a)   Variables are any (upper or lower case) letters other 
 | 
			
		||||
       than those (such as 'o' and 'v') used as connectives.
 | 
			
		||||
       't', 'f', 'T' and 'F' are sentential constants.
 | 
			
		||||
 
 | 
			
		||||
 (b)   Parentheses are as normal, with the features that
 | 
			
		||||
       connectives of smaller scope bind more tightly than 
 | 
			
		||||
       those of larger scope, and that except as scope and 
 | 
			
		||||
       parentheses dictate, association is to the left.
 | 
			
		||||
 
 | 
			
		||||
       Unary connectives have minimal scope.  The binary ones
 | 
			
		||||
       in order of increasing scope are  o  &  v  -> followed
 | 
			
		||||
       by user-defined ones. The scope order may be changed.
 | 
			
		||||
 | 
			
		||||
       A period may replace a left parenthesis whose right 
 | 
			
		||||
       mate is as far to the right as is reasonable.
 | 
			
		||||
 | 
			
		||||
 (c)   Spaces are ignored.  RETURN terminates the formula.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								dat/ba.16
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								dat/ba.16
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								dat/dl.10
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								dat/dl.10
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								dat/dln.14
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								dat/dln.14
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										1
									
								
								dat/l.8
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								dat/l.8
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
/¿“ïý{Žütúv<C3BA>Æ¡ï×qèß}úŸÇ!¤‹A¿ÒÕd4è׺
ý\—£A¿Óõd4è÷ºž<EFBFBD>†ƒ~çëÉx8èg¿úݯ§ãá ßÿz<ô?ÝOý_÷³ÑpÐÿw?
úßï§ÃAÿÿý|<ä"]è/‘®LŒô—IWF†úÓ¤K#ƒý-Òµ‰‘<E280B0>þ6éÚÌÈÐà@Ëtmrdp ¿Åº6164Пj]èoµ®M<C2AE>
ôÇZ§†úÛkcCƒýñÖŹ±¡Á<C2A1>þzéêÈÐ@®uyjhp ?ߺ<7648Пs]žèï‘®OŒô÷I×gF†ú{¬ëcCƒý½Öõ©±¡Á<C2A1>þ~ëúÜØÐà@Ïu}rlhp ¿Ç»>1>4Ðßë]Ÿèïÿ®<C3BF>
ôÇìúkö«“£ƒýuûÕÑáÁ<C3A1>þ¼ýòèà@<>~}btp ¿g¿>9:8Ðß·_Ÿèïñ¯OŒô÷ü×'LJúsÿËÃý½ÿõéñáÁ<C3A1>þþÿúøðà@ÿ<>tb ÿOº?324Ðÿ/ÝŸèÿµîO
ôÿ[÷çÆ†ú®û“Cý¿×ý鱡Á<C2A1>þÿéþüÈ@ÿÿu~lhp ÿÿ»??>4Ðÿ³ßŸèÿÛïÏŽôÿï÷çGúÿûÓÃýÿÿýùñáÁ<C3A1>ü!Òú!ÒFè_ŒHWŒ2 2"]2bЀþMˆtÍ„ú7#Ò53F4 “"]3iÄ <C384>ú7aÒ5ÆÐ?)“.2h@ÿ¦Lºfʘ!ƒô<>ʤ‹¦4p@ÿæLºfÌ<66>AúGgÒEsÆ4p@ÿ0MºpÈ€þÕ‰tÕˆ!ôÏʤ˦4p@ÿìLºlΘ!ƒèŸ¥I—M2p@ÿ,Nºlâ˜!ƒèß…H×M1 7"]7cÄ<63><C384>úw1ÒuGп“®›0fÈ ý»2éº)c†8 w&]7gÌ<67>AôïÒ¤ë&<26>2hà€þ]œtÝÄ1C
Ð?›‘.1 7#]7sÄ<73><C384>úg1Óe‡Ð?›™.›9rÈÀý»péº	ã†èß•K×M7dÐÀý»wéºqCè¾KÎ7dà€þQªuÑ <C391>úW©ÖU“F
8 ˜j]8iÐÀý«UëªQÃ
Ð?[µ.5hà€þáªuá¬QÃ
Ð?Œµ.4 j]7aÔ ý»TëºI£
п[µ®›5jØ <C398>úw±ÖuG
8 n]7aܰAúwéÖu“Æ
4p@ÿ¬ÝºlØ <C398>úwíÖuÓÆ
4p@ÿ°ÝºpÚ°AôïÞëÆ
4p@ÿðݺpÞ¸aƒèÆ[Ž6hà€þåŠuå¬Ã
п|±®œ7bØ <C398>ú—-ו#
蟶I—Ž2h@ÿôMºtÞ˜!ƒèß¾I׎2h@ÿô]ºtÞ¸!ƒè§ZO4p@ÿxÕºxÖ¨aƒèÇZO5hà€þñ«uñ¼Qƒè·[O6hà€þñ»uñ¼qÃ
Ð?Ž·.ž8nØ <C398>ú×#ÖÕ3FпN±®ž4bЀþu‹uõ´Ã
è_§ZWO5hà€þõªuõ¬QÃ
пnµ®ž6jØ <C398>ú×±ÖÕG
4p@ÿúÕºzÞ¨aƒè_§\WO9hà€þuËuõ´‘Ã
пž¹®ž9rØ <C398>ú÷!ÒõFèß<C3A8>H×Ï1d@ÿ>Lº~˜!ƒôïˤ만2h@ÿþLº~Θ!ƒôïÓ¤ë'<27>2hà€þ}¸tý„qCèß—K×O7dÐÀýûwéúyã†Ð¿<C390>—®Ÿ8nÈÀýóvëòiÃ
Ð?·.Ÿ7nØ <C398>ú÷¡ÖõF
8 Ÿj]?iÔ <C394>ú÷«Öõ³F
4p@ÿ>Öº~â¨AôïÃë'Œ6hà€þ}ºuý¤qÃ
пo·®Ÿ6nØ <C398>ú÷ïÖõóÆ
4p@ÿ>Þº~â¸aƒè߇\×O9h@ÿ>åº~ÒÈaƒèß·\×O9lÐÀýãzéâ!úש×Õ“F8 Ýz]=mô°Aô¯c¯«'Ž4 ½{]=zØ <C398>ú÷¡×õF4p@ÿ>õº~Òèaƒèß·^×O=lÐÀýûØëú‰£‡
8 ¿{]?{ô°Aôïçë'Œ2 _>]?eü<65>Aú÷ÿÓõã‡è߇_×O?lÐÀýûôëúIã‡
8 ß~]?mü°Aôïã¯ë'Ž6hà€þýÿuýøaƒè߇×O?|Ѐþ}úwý¤ñÃ
Ð?ïÿ.>h@ÿ¾ÿ»~úøáƒôïÿ¿ëÇ4 ³_8p@ÿ2f¿râÈ<C3A2>ú—3û•#‡Ð?<3F>Ù/9xà€þmÌ~íÄ‘ôogökgŽ:xà€þmÎ~í䑃è߯í×N;tà€þiÝ~éÐÁôoëök§Ž:xà€þqÝ~ñÔ¡ƒèßÞí׎:xà€þñÝ~ñܱCп¾Ù¯9tà€þyÝ~ùÔ¡ƒèŸßí—Ï;tðÀýó¼ýòÉCè߇ì×O9p@ÿ>f¿~âÈ<C3A2>ú÷3ûõ3G8 ¶_?aìÐÁôïãöë'Ž:xà€þ}Ý~ýÔ±Cп¿Û¯Ÿ;vèà<C3A8>ú÷yûõ“Ç<p@ÿ>|¿~Âø¡ôïã÷ë'Ž:p@ÿ¾~¿~êø¡ƒèßÿï×<C3AF>:p@ÿ8÷¿xðÀýëÜÿêɣпÞý¯=|ðÀýóÝÿòуè߇þ×O=xà€þ}ìýÄуèßçþ×O=xà€þýîýìÑÃпÿ¯Ÿ0~øà<C3B8>ú÷ñÿõÇ<p@ÿ>ÿ¿~òøáƒèŸ÷ÿ—<p@ÿ¾ÿ¿~úøáƒèßÿÿ×<C3BF>>xà€þˆtÿ„ýÿéþ#†èÿŸH÷Ï1h@ÿ¿LºÊ<7F>AúÿgÒýsÆ4 ÿŸ&Ý?iÈÀýÿ6éþic†8 ÿÿ"Ý?oÄÀýÿ7éþyc†8 ÿß2Ý?mä<6D><C3A4>úÿïÒýóÆ
8 ÿŸjÝ?iÐÀýÿUëþY£†
8 ÿkÝ?qÔ <C394>úÿ¯ÖýóF
8 ÿßnÝ?mØ <C398>úÿïÖýóÆ
4p@ÿ?Þºâ¸aƒèÿ×K÷O2h@ÿ?׺ò¨Aôÿóû'<27>6hà€þÿŽuÿìÃ
èÿïZ÷Ï5lÐÀýÿœëþÉ#
èÿï\÷Ï9lÐÀýÿéþù#ôÿÿ¤ûç<C3BB>2h@ÿÿ_ºþ¸!ôÿûû§<C3BB>6hà€þÿ¯uÿüQƒèÿÿ[÷Ï7lÐÀýÿŸëþù#
èÿï^÷Ï=lÐÀýÿßëþù£‡
8 ÿÿ?Ý?ü<7F>ýÿÿëþùã‡
8 ÿßÿÝ?}ø ýÿÿïþùã‡Ðÿ<C390>ÙïŸ8p@ÿf¿æÈ¡ôÿoöûçŽ<p@ÿ¿n¿êÐÁôÿïöûçŽ:xà€þÞ~ÿä¡ôÿûöû§<C3BB>:xà€þÿÏ~ÿü‘ôÿÿöûç<C3BB>:xà€þÿÿ~ÿüñCèÿçþ÷O<p@ÿ÷¿öèáƒèÿÿþ÷Ï=xà€þÿÿôáƒèÿÿÿ÷Ï?|ðÀ
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								dat/ln.10
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								dat/ln.10
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								dat/po.6
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								dat/po.6
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								dat/pon.7
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								dat/pon.7
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								dat/pont.8
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								dat/pont.8
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								dat/pot.8
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								dat/pot.8
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								dat/tn.16
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								dat/tn.16
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								dat/to.16
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								dat/to.16
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										142
									
								
								src/MaGIC.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								src/MaGIC.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,142 @@
 | 
			
		|||
/*				MaGIC1.c	V2.1
 | 
			
		||||
*
 | 
			
		||||
*	This is the serial version of MaGIC intended eventually to be 
 | 
			
		||||
*	compatible with xmagic version 2.1.  It requires such 
 | 
			
		||||
*	structures as JOB to be defined in MAGIC.h.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
	/****************************************************************
 | 
			
		||||
	*								*
 | 
			
		||||
	*			    MaGIC 2.1				*
 | 
			
		||||
	*								*
 | 
			
		||||
	*	    (C) 1993 Australian National University		*
 | 
			
		||||
	*								*
 | 
			
		||||
	* 		       All rights reserved			*
 | 
			
		||||
	*								*
 | 
			
		||||
	* The information in this software is subject to change without	*
 | 
			
		||||
	* notice and should not be construed as a commitment by the	*
 | 
			
		||||
	* Australian National University. The Australian National Uni-	*
 | 
			
		||||
	* versity makes no representations about the suitability of	*
 | 
			
		||||
	* this software for any purpose. It is supplied "as is" without	*
 | 
			
		||||
	* express or implied warranty.  If the software is modified in 	*
 | 
			
		||||
	* a manner creating derivative copyright rights, appropriate	*
 | 
			
		||||
	* legends may be placed on the derivative work in addition to	*
 | 
			
		||||
	* that set forth above.						*
 | 
			
		||||
	*								*
 | 
			
		||||
	* Permission to use, copy, modify and distribute this software	*
 | 
			
		||||
	* and its documentation for any purpose and without fee is	*
 | 
			
		||||
	* hereby granted, provided that both the above copyright notice	*
 | 
			
		||||
	* and this permission notice appear in all copies and sup-	*
 | 
			
		||||
	* porting documentation, and that the name of the Australian	*
 | 
			
		||||
	* National University not be used in advertising or publicity	*
 | 
			
		||||
	* pertaining to distribution of the software without specific,	*
 | 
			
		||||
	* written prior permission.					*
 | 
			
		||||
	*								*
 | 
			
		||||
	****************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define TOPFILE
 | 
			
		||||
#include "MaGIC.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static boolean interrupted;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int main(argc,argv)
 | 
			
		||||
int argc;
 | 
			
		||||
char *argv[];
 | 
			
		||||
{
 | 
			
		||||
  int i, option;
 | 
			
		||||
  boolean batch;
 | 
			
		||||
  char batchfile[80];
 | 
			
		||||
  extern char *optarg;
 | 
			
		||||
  void timesup(), intrupt();
 | 
			
		||||
  int getopt();
 | 
			
		||||
 | 
			
		||||
  noclear = false;
 | 
			
		||||
  batch = false;
 | 
			
		||||
  filing = false;
 | 
			
		||||
  xdialog = false;
 | 
			
		||||
 | 
			
		||||
  while ((option = getopt (argc, argv, "b:tx#:")) != -1)
 | 
			
		||||
    switch( option ) {
 | 
			
		||||
    case 'x':
 | 
			
		||||
      xdialog = true;
 | 
			
		||||
    case 't':
 | 
			
		||||
      noclear = true;
 | 
			
		||||
      break;
 | 
			
		||||
    case 'b':
 | 
			
		||||
      batch = true;
 | 
			
		||||
      i = 0;
 | 
			
		||||
      while ((batchfile[i] = optarg[i])) i++;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  theJob = (JOB*) malloc(sizeof(JOB));
 | 
			
		||||
  signal( SIGALRM, timesup );
 | 
			
		||||
  interrupted = false;
 | 
			
		||||
  signal( SIGINT, intrupt );
 | 
			
		||||
 | 
			
		||||
  strings_initial();
 | 
			
		||||
  tests_initial();
 | 
			
		||||
  logics_initial();
 | 
			
		||||
  job_defaults( batch );
 | 
			
		||||
  perm_initial();
 | 
			
		||||
 | 
			
		||||
  while ((i = dialog(batch,batchfile)))
 | 
			
		||||
    if ( i > 0 ) {
 | 
			
		||||
      if ( !batch ) {
 | 
			
		||||
	printf("\n Searching.....\n");
 | 
			
		||||
	fflush(stdout);
 | 
			
		||||
      }
 | 
			
		||||
      job_start();
 | 
			
		||||
      subf_set();
 | 
			
		||||
      interrupted = false;
 | 
			
		||||
      alarm(theJob->maxtime);
 | 
			
		||||
 | 
			
		||||
      if ( newsiz() )
 | 
			
		||||
	do if ( pre_set() ) {
 | 
			
		||||
	  setperm();
 | 
			
		||||
	  transref(&(tr_par));
 | 
			
		||||
	}
 | 
			
		||||
	while ( newdes() );
 | 
			
		||||
 | 
			
		||||
      job_stop(batch);
 | 
			
		||||
      alarm(0);
 | 
			
		||||
      if ( batch ) exit(0);
 | 
			
		||||
    }
 | 
			
		||||
  if ( !noclear ) {
 | 
			
		||||
#ifdef __CYGWIN__
 | 
			
		||||
    puts( "\033[2J" );
 | 
			
		||||
#else
 | 
			
		||||
    system("clear");
 | 
			
		||||
#endif
 | 
			
		||||
  }
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Action on signal from alarm.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void timesup()
 | 
			
		||||
{
 | 
			
		||||
  tr_par.done = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Action on signal from ^C or whatever SIGINT may be.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void intrupt()
 | 
			
		||||
{
 | 
			
		||||
  tr_par.done = true;
 | 
			
		||||
  if ( interrupted++ ) exit(3);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										61
									
								
								src/MaGIC.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								src/MaGIC.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,61 @@
 | 
			
		|||
/*
 | 
			
		||||
*				MaGIC.h			May 1993
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/****************************************************************
 | 
			
		||||
	*								*
 | 
			
		||||
	*			    MaGIC 2.1				*
 | 
			
		||||
	*								*
 | 
			
		||||
	*	    (C) 1993 Australian National University		*
 | 
			
		||||
	*								*
 | 
			
		||||
	* 		       All rights reserved			*
 | 
			
		||||
	*								*
 | 
			
		||||
	* The information in this software is subject to change without	*
 | 
			
		||||
	* notice and should not be construed as a commitment by the	*
 | 
			
		||||
	* Australian National University. The Australian National Uni-	*
 | 
			
		||||
	* versity makes no representations about the suitability of	*
 | 
			
		||||
	* this software for any purpose. It is supplied "as is" without	*
 | 
			
		||||
	* express or implied warranty.  If the software is modified in 	*
 | 
			
		||||
	* a manner creating derivative copyright rights, appropriate	*
 | 
			
		||||
	* legends may be placed on the derivative work in addition to	*
 | 
			
		||||
	* that set forth above.						*
 | 
			
		||||
	*								*
 | 
			
		||||
	* Permission to use, copy, modify and distribute this software	*
 | 
			
		||||
	* and its documentation for any purpose and without fee is	*
 | 
			
		||||
	* hereby granted, provided that both the above copyright notice	*
 | 
			
		||||
	* and this permission notice appear in all copies and sup-	*
 | 
			
		||||
	* porting documentation, and that the name of the Australian	*
 | 
			
		||||
	* National University not be used in advertising or publicity	*
 | 
			
		||||
	* pertaining to distribution of the software without specific,	*
 | 
			
		||||
	* written prior permission.					*
 | 
			
		||||
	*								*
 | 
			
		||||
	****************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#include <signal.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
#ifdef SYSTEMV
 | 
			
		||||
#include <sys/systm.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "vntr.h"
 | 
			
		||||
#include "Mdef.h"
 | 
			
		||||
#include "axioms.h"
 | 
			
		||||
#include "Mtypes.h"
 | 
			
		||||
#include "Mglob.h"
 | 
			
		||||
#include "Mproto.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	We need more timing apparatus if times.h is available.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifdef HASTIMES
 | 
			
		||||
#include <sys/times.h>
 | 
			
		||||
#include <limits.h>
 | 
			
		||||
struct tms time_buffer;
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										98
									
								
								src/Makefile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								src/Makefile
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,98 @@
 | 
			
		|||
# Edit the first few lines of this file to suit your setup.
 | 
			
		||||
# You *must* set MAGLIB to the appropriate data directory.
 | 
			
		||||
 | 
			
		||||
# Where the data files live (must be readable to the MaGIC user)
 | 
			
		||||
 | 
			
		||||
MAGLIB		= /FullPathnameOfMyDataDirectory   !!! EDIT !!!
 | 
			
		||||
 | 
			
		||||
# Where the binaries live
 | 
			
		||||
 | 
			
		||||
BIN		= /FullPathnameOfMyBin             !!! EDIT !!!
 | 
			
		||||
 | 
			
		||||
# Set the optimization level to O3 (includes inlining of functions) for
 | 
			
		||||
# performance, or g for debugging.
 | 
			
		||||
 | 
			
		||||
OPTIMIZATION	= -O3
 | 
			
		||||
# OPTIMIZATION	= -g -Wall
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Uncomment WARNINGS to see warning messages during compilation.
 | 
			
		||||
 | 
			
		||||
# WARNINGS	= -w
 | 
			
		||||
 | 
			
		||||
# If you have times.h (NB _not_ time.h) on your system leave the next 
 | 
			
		||||
# item alone.  If you don't, comment it out.
 | 
			
		||||
 | 
			
		||||
HASTIMES	= -DHASTIMES
 | 
			
		||||
 | 
			
		||||
##########################################################################
 | 
			
		||||
# If you have no gcc or if you wish to compile MaGIC with another        #
 | 
			
		||||
# compiler, change the next line to suit yourself.                       #
 | 
			
		||||
##########################################################################
 | 
			
		||||
 | 
			
		||||
CC		= gcc
 | 
			
		||||
 | 
			
		||||
##########################################################################
 | 
			
		||||
# You should not have to change the stuff below                          #
 | 
			
		||||
##########################################################################
 | 
			
		||||
 | 
			
		||||
CFLAGS		= $(OPTIMIZATION) $(HASTIMES) $(WARNINGS) -DDATA_DIR=\"$(MAGLIB)/\"
 | 
			
		||||
MOBJECTS        =  MaGIC.o axioms.o dialog.o getjob.o wffs.o mp_parse.o isom.o logic_set.o logic_test.o logic_pretest.o setup.o logic_io.o axiom_tests.o
 | 
			
		||||
RMOBJECTS	= RM.o RM_input.o RM_output.o
 | 
			
		||||
UTES		= u2p u2pic onegen one_plus_t_gen u2tex sub_irr
 | 
			
		||||
MORPHS 		= image embedded homomorphic nt_homomorphic
 | 
			
		||||
POSTPROCS	= $(UTES) $(MORPHS)
 | 
			
		||||
UTOBJECTS	= u2p.o u2pic.o onegen.o one_plus_t_gen.o u2tex.o sub_irr.o
 | 
			
		||||
MORPHOBJECTS	= image.o embedded.o homomorphic.o nt_homomorphic.o hmi.o
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
all: magic utilities
 | 
			
		||||
 | 
			
		||||
magic: $(MOBJECTS) vntr.o
 | 
			
		||||
	$(CC) -o magic $(MOBJECTS) vntr.o $(LOCLIB)
 | 
			
		||||
 | 
			
		||||
utilities: $(POSTPROCS)
 | 
			
		||||
 | 
			
		||||
u2p: u2p.o $(RMOBJECTS)
 | 
			
		||||
	$(CC) -o u2p u2p.o $(RMOBJECTS)
 | 
			
		||||
 | 
			
		||||
u2pic: u2pic.o $(RMOBJECTS)
 | 
			
		||||
	$(CC) -o u2pic u2pic.o $(RMOBJECTS)
 | 
			
		||||
 | 
			
		||||
onegen: onegen.o $(RMOBJECTS)
 | 
			
		||||
	$(CC) -o onegen onegen.o $(RMOBJECTS)
 | 
			
		||||
 | 
			
		||||
one_plus_t_gen: one_plus_t_gen.o $(RMOBJECTS)
 | 
			
		||||
	$(CC) -o one_plus_t_gen one_plus_t_gen.o $(RMOBJECTS)
 | 
			
		||||
 | 
			
		||||
u2tex: u2tex.o $(RMOBJECTS)
 | 
			
		||||
	$(CC) -o u2tex u2tex.o $(RMOBJECTS)
 | 
			
		||||
 | 
			
		||||
sub_irr: sub_irr.o $(RMOBJECTS)
 | 
			
		||||
	$(CC) -o sub_irr sub_irr.o $(RMOBJECTS)
 | 
			
		||||
 | 
			
		||||
image: image.o hmi.o $(RMOBJECTS)
 | 
			
		||||
	$(CC) -o image image.o hmi.o $(RMOBJECTS)
 | 
			
		||||
 | 
			
		||||
embedded: embedded.o hmi.o $(RMOBJECTS)
 | 
			
		||||
	$(CC) -o embedded embedded.o hmi.o $(RMOBJECTS)
 | 
			
		||||
 | 
			
		||||
homomorphic: homomorphic.o hmi.o $(RMOBJECTS)
 | 
			
		||||
	$(CC) -o homomorphic homomorphic.o hmi.o $(RMOBJECTS)
 | 
			
		||||
 | 
			
		||||
nt_homomorphic: nt_homomorphic.o hmi.o $(RMOBJECTS)
 | 
			
		||||
	$(CC) -o nt_homomorphic nt_homomorphic.o hmi.o $(RMOBJECTS)
 | 
			
		||||
 | 
			
		||||
install: all
 | 
			
		||||
	mkdir -p $(BIN)
 | 
			
		||||
	mv magic $(POSTPROCS) $(BIN)
 | 
			
		||||
	mkdir -p $(MAGLIB)
 | 
			
		||||
	cp ../dat/*.* $(MAGLIB)
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	rm -f *.o core $(POSTPROCS) magic
 | 
			
		||||
 | 
			
		||||
$(MOBJECTS): MaGIC.h vntr.h Mproto.h Mdef.h Mglob.h Mtypes.h axioms.h
 | 
			
		||||
vntr.o: vntr.h
 | 
			
		||||
$(RMOBJECTS) $(UTOBJECTS) $(MORPHOBJECTS): RM.h
 | 
			
		||||
$(MORPHOBJECTS): hmi.h
 | 
			
		||||
							
								
								
									
										139
									
								
								src/Mdef.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								src/Mdef.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,139 @@
 | 
			
		|||
/*
 | 
			
		||||
*			Mdef.h
 | 
			
		||||
*
 | 
			
		||||
*	This is part of the header for MaGIC. It contains the definitions
 | 
			
		||||
*	of symbolic constants.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
	/****************************************************************
 | 
			
		||||
	*								*
 | 
			
		||||
	*			    MaGIC 2.1				*
 | 
			
		||||
	*								*
 | 
			
		||||
	*	    (C) 1993 Australian National University		*
 | 
			
		||||
	*								*
 | 
			
		||||
	* 		       All rights reserved			*
 | 
			
		||||
	*								*
 | 
			
		||||
	* The information in this software is subject to change without	*
 | 
			
		||||
	* notice and should not be construed as a commitment by the	*
 | 
			
		||||
	* Australian National University. The Australian National Uni-	*
 | 
			
		||||
	* versity makes no representations about the suitability of	*
 | 
			
		||||
	* this software for any purpose. It is supplied "as is" without	*
 | 
			
		||||
	* express or implied warranty.  If the software is modified in 	*
 | 
			
		||||
	* a manner creating derivative copyright rights, appropriate	*
 | 
			
		||||
	* legends may be placed on the derivative work in addition to	*
 | 
			
		||||
	* that set forth above.						*
 | 
			
		||||
	*								*
 | 
			
		||||
	* Permission to use, copy, modify and distribute this software	*
 | 
			
		||||
	* and its documentation for any purpose and without fee is	*
 | 
			
		||||
	* hereby granted, provided that both the above copyright notice	*
 | 
			
		||||
	* and this permission notice appear in all copies and sup-	*
 | 
			
		||||
	* porting documentation, and that the name of the Australian	*
 | 
			
		||||
	* National University not be used in advertising or publicity	*
 | 
			
		||||
	* pertaining to distribution of the software without specific,	*
 | 
			
		||||
	* written prior permission.					*
 | 
			
		||||
	*								*
 | 
			
		||||
	****************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define VERSION "2.1"
 | 
			
		||||
#define RELEASE_DATE "May 1993"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*       We need to distinguish between the main file where global 
 | 
			
		||||
*       variables are mostly defined and the other files where they are 
 | 
			
		||||
*       just declared.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifdef TOPFILE
 | 
			
		||||
#define GLOBAL
 | 
			
		||||
#else
 | 
			
		||||
#define GLOBAL extern
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	The input data files are all in a directory:
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef DATA_DIR
 | 
			
		||||
#define DATA_DIR "/usr/local/lib/MaGIC/"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	The clock returns times in 1/TICK sec.:
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#define TICK 100
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Next the bounds for various arrays. These are the maxima for
 | 
			
		||||
*	meaningful symbols (SYMBOLMAX), user-defined connectives (CMAX), 
 | 
			
		||||
*	(sub)formulae (FMAX), testable rules (TMAX) and isomorphs
 | 
			
		||||
*	per process (ISOMAX).  VMAX is the maximum number of variables 
 | 
			
		||||
*	for formulae. RTMAX is the maximum number of premises (or 
 | 
			
		||||
*	conclusions) in a rule.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#define SYMBOLMAX 256
 | 
			
		||||
#define CMAX 32
 | 
			
		||||
#define FMAX 1024
 | 
			
		||||
#define TMAX 64
 | 
			
		||||
#define ISOMAX 8192
 | 
			
		||||
#define SH_VL 128
 | 
			
		||||
#define VMAX 22
 | 
			
		||||
#define RTMAX 8
 | 
			
		||||
#define ISLMAX (ISOMAX * SH_VL)
 | 
			
		||||
#define SLEN 80
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	And a dummy formula offset for primitives.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#define PRIMITIVE -1
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	And the maximum sizes for the various fragments
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifdef SMALLDISK
 | 
			
		||||
#define S_pot  7
 | 
			
		||||
#else
 | 
			
		||||
#define S_pot  8
 | 
			
		||||
#endif
 | 
			
		||||
#define S_pO   6
 | 
			
		||||
#define S_pont 8
 | 
			
		||||
#define S_poN  7
 | 
			
		||||
#define S_ln   10
 | 
			
		||||
#define S_lat  8
 | 
			
		||||
#define S_ba   16
 | 
			
		||||
#define S_dln  14
 | 
			
		||||
#define S_dlat 10
 | 
			
		||||
#define S_Ton  16
 | 
			
		||||
#define S_to   16
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	The null premise and null conclusion are negative integers
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#define TRIVIAL -1
 | 
			
		||||
#define ABSURD -2
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	These constructs are useful abbreviations
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#define FORALL(x) for (x=0; x<=siz; x++)
 | 
			
		||||
#define FORaLL(x) for (x=siz; x>=0; x--)
 | 
			
		||||
#define READLN { fflush(stdout); while (getchar() != '\n') ; }
 | 
			
		||||
#define IFF(x,y) ((x && y) || (!x && !y))
 | 
			
		||||
#define REMOVE(x,y) y &= ~((unsigned)1 << x)
 | 
			
		||||
#define ADDTO(x,y) y |= ((unsigned)1 << x)
 | 
			
		||||
#define IN(x,y) ((y & (1 << x)) != 0)
 | 
			
		||||
#define SINGLETON(x) (!(x & (x-1)))
 | 
			
		||||
#define EP { if ( xdialog ) { printf("E\n"); fflush(stdout); }}
 | 
			
		||||
#define outfml(p,q,f) outformula(p,q,f,VARS);
 | 
			
		||||
#define symbol_listed(x,s) (symbol_position(x,s) >= 0)
 | 
			
		||||
							
								
								
									
										131
									
								
								src/Mglob.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								src/Mglob.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,131 @@
 | 
			
		|||
/*
 | 
			
		||||
*				Mglob.h
 | 
			
		||||
*
 | 
			
		||||
*	This file contains the declarations of global variables for
 | 
			
		||||
*	MaGIC. Note that TR.h contains its own globals.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
	/****************************************************************
 | 
			
		||||
	*								*
 | 
			
		||||
	*			    MaGIC 2.1				*
 | 
			
		||||
	*								*
 | 
			
		||||
	*	    (C) 1993 Australian National University		*
 | 
			
		||||
	*								*
 | 
			
		||||
	* 		       All rights reserved			*
 | 
			
		||||
	*								*
 | 
			
		||||
	* The information in this software is subject to change without	*
 | 
			
		||||
	* notice and should not be construed as a commitment by the	*
 | 
			
		||||
	* Australian National University. The Australian National Uni-	*
 | 
			
		||||
	* versity makes no representations about the suitability of	*
 | 
			
		||||
	* this software for any purpose. It is supplied "as is" without	*
 | 
			
		||||
	* express or implied warranty.  If the software is modified in 	*
 | 
			
		||||
	* a manner creating derivative copyright rights, appropriate	*
 | 
			
		||||
	* legends may be placed on the derivative work in addition to	*
 | 
			
		||||
	* that set forth above.						*
 | 
			
		||||
	*								*
 | 
			
		||||
	* Permission to use, copy, modify and distribute this software	*
 | 
			
		||||
	* and its documentation for any purpose and without fee is	*
 | 
			
		||||
	* hereby granted, provided that both the above copyright notice	*
 | 
			
		||||
	* and this permission notice appear in all copies and sup-	*
 | 
			
		||||
	* porting documentation, and that the name of the Australian	*
 | 
			
		||||
	* National University not be used in advertising or publicity	*
 | 
			
		||||
	* pertaining to distribution of the software without specific,	*
 | 
			
		||||
	* written prior permission.					*
 | 
			
		||||
	*								*
 | 
			
		||||
	****************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL JOB *theJob;		/* Run specification		*/
 | 
			
		||||
 | 
			
		||||
GLOBAL TRIN tr_par;		/* vntr job specification	*/
 | 
			
		||||
 | 
			
		||||
GLOBAL FILE
 | 
			
		||||
	*outfil,
 | 
			
		||||
	*fopen();
 | 
			
		||||
 | 
			
		||||
GLOBAL int
 | 
			
		||||
	nulladic[CMAX],		/* Defined sential constants	*/
 | 
			
		||||
	monadic[CMAX][SZ],	/* Defined connectives		*/
 | 
			
		||||
	dyadic[CMAX][SZ][SZ],	/* Ditto			*/
 | 
			
		||||
	vu[VMAX],
 | 
			
		||||
	rvu[VMAX],		/* Variables used in wffs	*/
 | 
			
		||||
	badvalue[VMAX],		/* Refuting assignment		*/
 | 
			
		||||
	kost[TMAX],		/* Matrix lookups for axioms	*/
 | 
			
		||||
	siz,			/* Highest value		*/
 | 
			
		||||
	infil,			/* File descriptor for input	*/
 | 
			
		||||
	input_bit,		/* Offset of next bit in input	*/
 | 
			
		||||
	start_time,		/* Clock reading    		*/
 | 
			
		||||
	stop_time,		/* Clock reading    		*/
 | 
			
		||||
	tot,			/* Total matrices tested	*/
 | 
			
		||||
	isoms,	isoms2,		/* Isomorphs omitted		*/
 | 
			
		||||
	begin_timer,
 | 
			
		||||
	end_timer,		/* For timing of serial version	*/
 | 
			
		||||
	Sizmax,			/* Local version of sizmax	*/
 | 
			
		||||
	Vmax,			/* Local version of VMAX	*/
 | 
			
		||||
	zero;			/* Dummy integer		*/
 | 
			
		||||
 | 
			
		||||
GLOBAL boolean
 | 
			
		||||
	xdialog,		/* Running from xmagic		*/
 | 
			
		||||
	noclear,		/* No system calls  		*/
 | 
			
		||||
	filing,			/* Output file open		*/
 | 
			
		||||
	default_fragment[LOGMAX][PCMAX];	/* Connectives	*/
 | 
			
		||||
 | 
			
		||||
GLOBAL char
 | 
			
		||||
	buffa,			/* 8 bits of input data		*/
 | 
			
		||||
	answer[SLEN],		/* For input of axioms etc	*/
 | 
			
		||||
	thisvector[V_LENGTH],	/* Current matrix stretched out	*/
 | 
			
		||||
	thatvector[V_LENGTH],	/* Last good matrix ditto	*/
 | 
			
		||||
	isolist[ISLMAX];	/* Blanks for isomorphisms	*/
 | 
			
		||||
 | 
			
		||||
GLOBAL WFF
 | 
			
		||||
	*tx;			/* Last active subformula	*/
 | 
			
		||||
 | 
			
		||||
GLOBAL ISM istak[ISOMAX];	/* Spare records for morphisms	*/
 | 
			
		||||
 | 
			
		||||
GLOBAL PRM *perm;		/* List of permutations		*/
 | 
			
		||||
 | 
			
		||||
GLOBAL int
 | 
			
		||||
	C[SZ][SZ],		/* The implication matrix	*/
 | 
			
		||||
	ord[SZ][SZ],		/* The partial order table	*/
 | 
			
		||||
	K[SZ][SZ],		/* The conjunction matrix	*/
 | 
			
		||||
	A[SZ][SZ],		/* The disjunction matrix	*/
 | 
			
		||||
	fus[SZ][SZ],		/* The fusion matrix		*/
 | 
			
		||||
	N[SZ],			/* The negation matrix		*/
 | 
			
		||||
	box[SZ],		/* The necessity matrix		*/
 | 
			
		||||
	diamond[SZ],		/* The possibility matrix	*/
 | 
			
		||||
	desig[SZ],		/* Designated values		*/
 | 
			
		||||
	maximal[SZ],		/* Maximal guys under ord	*/
 | 
			
		||||
	atom[2][CMAX],		/* 'a' and 'b' for definitions	*/
 | 
			
		||||
	impindex[SZ][SZ],	/* Info cell for C[x][y]	*/
 | 
			
		||||
	boxindex[SZ],		/* Info cell for box[x]		*/
 | 
			
		||||
	ucc0[CMAX],		/* Info cell for nulladic[x]	*/
 | 
			
		||||
	ucc1[CMAX][SZ],		/* Info cell for monadic[x][y]	*/
 | 
			
		||||
	ucc2[CMAX][SZ][SZ];	/* And dyadic[x][y][z]		*/
 | 
			
		||||
 | 
			
		||||
GLOBAL int
 | 
			
		||||
	good,		/* Matrices accepted		*/
 | 
			
		||||
	negno,		/* Negation #, this size	*/
 | 
			
		||||
	ordno,		/* Order #, this negation	*/
 | 
			
		||||
	desno,		/* Des #, this order		*/
 | 
			
		||||
	matno,		/* Matrix #, this des		*/
 | 
			
		||||
	boxno,		/* Box #, this matrix		*/
 | 
			
		||||
	matplus[CMAX],	/* Matno for user's connectives	*/
 | 
			
		||||
	matsum,		/* Matrices this des choice	*/
 | 
			
		||||
	des,		/* Least designated value	*/
 | 
			
		||||
	undes,		/* Greatest undesignated value	*/
 | 
			
		||||
	firstchange,	/* First cell changed this test	*/
 | 
			
		||||
	firstarrow,	/* First cell of -> matrix	*/
 | 
			
		||||
	firstbox,	/* First cell of ! matrix	*/
 | 
			
		||||
	got_a_fail,	/* Badguy fails in matrix	*/
 | 
			
		||||
	F_N,		/* f_n and contraposition	*/
 | 
			
		||||
	afx;		/* Affixing is in force		*/
 | 
			
		||||
 | 
			
		||||
GLOBAL unsigned
 | 
			
		||||
	greater_than[SZ],	/* {y: ord[x][y]}	*/
 | 
			
		||||
	Greater_than[SZ],	/* {y: ord[x][y],x!=y}	*/
 | 
			
		||||
	less_than[SZ],		/* {y: ord[y][x]}	*/
 | 
			
		||||
	Less_than[SZ];		/* less_than[x] \ x	*/
 | 
			
		||||
 | 
			
		||||
GLOBAL L_DEFAULT
 | 
			
		||||
	default_orders[LOGMAX];	/* Defaults for logics	*/
 | 
			
		||||
							
								
								
									
										301
									
								
								src/Mproto.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										301
									
								
								src/Mproto.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,301 @@
 | 
			
		|||
/*
 | 
			
		||||
*			Mproto.h (included in MaGIC.h)
 | 
			
		||||
*
 | 
			
		||||
*	This file contains the function prototypes for MaGIC. Note that
 | 
			
		||||
*	the prototypes for vntr.c are in the file vntr.h (also included 
 | 
			
		||||
*	in MaGIC.h).
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
	/****************************************************************
 | 
			
		||||
	*								*
 | 
			
		||||
	*			    MaGIC 2.1				*
 | 
			
		||||
	*								*
 | 
			
		||||
	*	    (C) 1993 Australian National University		*
 | 
			
		||||
	*								*
 | 
			
		||||
	* 		       All rights reserved			*
 | 
			
		||||
	*								*
 | 
			
		||||
	* The information in this software is subject to change without	*
 | 
			
		||||
	* notice and should not be construed as a commitment by the	*
 | 
			
		||||
	* Australian National University. The Australian National Uni-	*
 | 
			
		||||
	* versity makes no representations about the suitability of	*
 | 
			
		||||
	* this software for any purpose. It is supplied "as is" without	*
 | 
			
		||||
	* express or implied warranty.  If the software is modified in 	*
 | 
			
		||||
	* a manner creating derivative copyright rights, appropriate	*
 | 
			
		||||
	* legends may be placed on the derivative work in addition to	*
 | 
			
		||||
	* that set forth above.						*
 | 
			
		||||
	*								*
 | 
			
		||||
	* Permission to use, copy, modify and distribute this software	*
 | 
			
		||||
	* and its documentation for any purpose and without fee is	*
 | 
			
		||||
	* hereby granted, provided that both the above copyright notice	*
 | 
			
		||||
	* and this permission notice appear in all copies and sup-	*
 | 
			
		||||
	* porting documentation, and that the name of the Australian	*
 | 
			
		||||
	* National University not be used in advertising or publicity	*
 | 
			
		||||
	* pertaining to distribution of the software without specific,	*
 | 
			
		||||
	* written prior permission.					*
 | 
			
		||||
	*								*
 | 
			
		||||
	****************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	In file MaCIC.c
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
int main();
 | 
			
		||||
void timesup();
 | 
			
		||||
void intrupt();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	In file axioms.c
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void strings_initial();
 | 
			
		||||
void tests_initial();
 | 
			
		||||
void logics_initial();
 | 
			
		||||
void init_B();
 | 
			
		||||
void init_DW();
 | 
			
		||||
void init_TW();
 | 
			
		||||
void init_EW();
 | 
			
		||||
void init_RW();
 | 
			
		||||
void init_LIN();
 | 
			
		||||
void init_CK();
 | 
			
		||||
void init_T();
 | 
			
		||||
void init_E();
 | 
			
		||||
void init_R();
 | 
			
		||||
void init_S4();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	In file axiom_tests.c
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
boolean Exmid();
 | 
			
		||||
boolean Boolalg();
 | 
			
		||||
boolean SemiBool();
 | 
			
		||||
boolean paradox();
 | 
			
		||||
boolean f_arrow_t();
 | 
			
		||||
 | 
			
		||||
void E_assertion(unsigned info[]);
 | 
			
		||||
void contraction(unsigned info[]);
 | 
			
		||||
void Wstar(unsigned info[]);
 | 
			
		||||
void Reductio(unsigned info[]);
 | 
			
		||||
void assertion(unsigned info[]);
 | 
			
		||||
void ata(unsigned info[]);
 | 
			
		||||
void TaT(unsigned info[]);
 | 
			
		||||
void mingle(unsigned info[]);
 | 
			
		||||
void t_atomic(unsigned info[]);
 | 
			
		||||
void FF_T(unsigned info[]);
 | 
			
		||||
void PARADOX(unsigned info[]);
 | 
			
		||||
void RWX(unsigned info[]);
 | 
			
		||||
void necessity(unsigned info[]);
 | 
			
		||||
void necessitation(unsigned info[]);
 | 
			
		||||
void NKI_test(unsigned info[]);
 | 
			
		||||
void set_prefix(unsigned info[]);
 | 
			
		||||
void set_suffix(unsigned info[]);
 | 
			
		||||
void squeeze(unsigned info[], int a, int b, int c, int d);
 | 
			
		||||
 | 
			
		||||
void pretest_prefix();
 | 
			
		||||
void pretest_suffix();
 | 
			
		||||
void test_S4axiom();
 | 
			
		||||
void test_S5axiom();
 | 
			
		||||
void test_Daxiom();
 | 
			
		||||
void test_NK();
 | 
			
		||||
 | 
			
		||||
boolean test_mslat(trs T);
 | 
			
		||||
boolean test_jslat(trs T);
 | 
			
		||||
boolean Btest(TRS *T);
 | 
			
		||||
boolean B2test(TRS *T);
 | 
			
		||||
boolean Stest(TRS *T);
 | 
			
		||||
boolean Ctest(TRS *T);
 | 
			
		||||
boolean WBtest(TRS *T);
 | 
			
		||||
boolean NecImpDist(TRS *T);
 | 
			
		||||
boolean NecAdj(TRS *T);
 | 
			
		||||
boolean NecW(TRS *T);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	In file dialog.c
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
int dialog(boolean batch, char *batchfile);
 | 
			
		||||
char menu();
 | 
			
		||||
char readin(char *str);
 | 
			
		||||
void paws();
 | 
			
		||||
void job_defaults(boolean batch);
 | 
			
		||||
void set_frag( boolean set_sizmax );
 | 
			
		||||
void check_frag(int x);
 | 
			
		||||
void print_axiom(FILE *f, AXIOM x);
 | 
			
		||||
void display();
 | 
			
		||||
void disp(FILE *f);
 | 
			
		||||
void help(helpcode x);
 | 
			
		||||
void put_out(char *f_nm);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	In file getjob.c
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void add_axioms();
 | 
			
		||||
void add_one_axiom( AXIOM select );
 | 
			
		||||
void bad_guy();
 | 
			
		||||
void connective();
 | 
			
		||||
void deletion();
 | 
			
		||||
void fragment();
 | 
			
		||||
void input_direct();
 | 
			
		||||
void jump_condition();
 | 
			
		||||
void logic_choice();
 | 
			
		||||
void set_logic( LOGIC lptr );
 | 
			
		||||
void print_version();
 | 
			
		||||
int n_of_procs();
 | 
			
		||||
void order_change();
 | 
			
		||||
void user_order(symb oldsymbols[], char *string, int neworder[]);
 | 
			
		||||
void print_options();
 | 
			
		||||
boolean read_job(char *batchfile);
 | 
			
		||||
void store_job();
 | 
			
		||||
void injob(FILE *f);
 | 
			
		||||
void outjob(FILE *f);
 | 
			
		||||
void trim();
 | 
			
		||||
void nospace(char *s);
 | 
			
		||||
void delete_saxiom();
 | 
			
		||||
void delete_uaxiom();
 | 
			
		||||
void delete_connective();
 | 
			
		||||
void nodelcon(char *s, symb spec, int formula);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	In file isom.c
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void perm_initial();
 | 
			
		||||
void setperm();
 | 
			
		||||
int lower_than(int x);
 | 
			
		||||
int higher_than(int x);
 | 
			
		||||
void newperm(int *vec);
 | 
			
		||||
boolean isomorphic(ism ptr, trs T);
 | 
			
		||||
void snip(ism p);
 | 
			
		||||
void subst(ism p1, ism p2);
 | 
			
		||||
boolean isomorphic_anyhow(trs T);
 | 
			
		||||
void add_isoms(trs T);
 | 
			
		||||
boolean add_this(char mat[], ism i_tree);
 | 
			
		||||
ism tack_on(ism p, char mat[]);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	In file logic_io.c
 | 
			
		||||
*/
 | 
			
		||||
int newsiz();
 | 
			
		||||
int newneg();
 | 
			
		||||
int neword();
 | 
			
		||||
int newdes();
 | 
			
		||||
void sep(int *x);
 | 
			
		||||
int next_bit();
 | 
			
		||||
int got_siz();
 | 
			
		||||
boolean got_neg();
 | 
			
		||||
boolean got_ord();
 | 
			
		||||
boolean got_des();
 | 
			
		||||
void mat_print();
 | 
			
		||||
void newmatplus(int x, int y);
 | 
			
		||||
void siz_print(FILE *f, output_style x);
 | 
			
		||||
void neg_print(FILE *f, output_style x);
 | 
			
		||||
void ord_print(FILE *f, output_style x);
 | 
			
		||||
void des_print(FILE *f, output_style x);
 | 
			
		||||
void C_print(FILE *f, output_style x);
 | 
			
		||||
void box_print(FILE *f, output_style x);
 | 
			
		||||
void u_print0(FILE *f, output_style x, int y);
 | 
			
		||||
void u_print1(FILE *f, output_style x, int y);
 | 
			
		||||
void u_print2(FILE *f, output_style x, int y);
 | 
			
		||||
void printup(FILE *f, output_style x);
 | 
			
		||||
void pretty_size(FILE *f);
 | 
			
		||||
void pretty_negno(FILE *f);
 | 
			
		||||
void pretty_ordno(FILE *f);
 | 
			
		||||
void pretty_desno(FILE *f);
 | 
			
		||||
void pretty_matno(FILE *f);
 | 
			
		||||
void pretty_boxno(FILE *f);
 | 
			
		||||
void pretty_umat(FILE *f, int x);
 | 
			
		||||
void fail_print(FILE *f);
 | 
			
		||||
void insert_badvalues( int offset );
 | 
			
		||||
void stats_print();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	In file logic_pretest.c
 | 
			
		||||
*/
 | 
			
		||||
void new_two_ref(int a, int x, int b, int y);
 | 
			
		||||
boolean find_twos(unsigned info[], TRS *Tr);
 | 
			
		||||
void pretest_fus();
 | 
			
		||||
void affix_case(int a, int b, int c, int d);
 | 
			
		||||
void test_assertion();
 | 
			
		||||
void test_contraction();
 | 
			
		||||
void test_TW_upper_bounds();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	In file logic_set.c
 | 
			
		||||
*/
 | 
			
		||||
boolean pre_set();
 | 
			
		||||
boolean utest(int x, unsigned info[]);
 | 
			
		||||
void set_vuloc(int r, int rr);
 | 
			
		||||
boolean badcase(int x, unsigned info[]);
 | 
			
		||||
int eval(int r, unsigned z[]);
 | 
			
		||||
int anothercase(int x);
 | 
			
		||||
boolean set_poss(unsigned info[], trs T);
 | 
			
		||||
void fusion(unsigned info[]);
 | 
			
		||||
boolean permutable(int a, int b, int c, unsigned info[]);
 | 
			
		||||
boolean logic_poss(unsigned info[]);
 | 
			
		||||
void logic_axioms(boolean x);
 | 
			
		||||
void efficient_logic_set();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	In file logic_test.c
 | 
			
		||||
*/
 | 
			
		||||
boolean Good_matrix(unsigned info[], trs T);
 | 
			
		||||
void vect_into_C(unsigned info[]);
 | 
			
		||||
boolean fus_test(trs T);
 | 
			
		||||
boolean axtest(trs T);
 | 
			
		||||
void set_used(int x, trs T, boolean topper);
 | 
			
		||||
void setcon();
 | 
			
		||||
int getval(int y);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	In file mp_parse.c
 | 
			
		||||
*/
 | 
			
		||||
int parse( symb fla[] );
 | 
			
		||||
int s_parse( symb fla[] );
 | 
			
		||||
int Match( symb start[] );
 | 
			
		||||
int Finish( int subf[], symb conn[], int tot );
 | 
			
		||||
int Loc( symb mn, int lft, int rgt );
 | 
			
		||||
boolean is_var(symb x);
 | 
			
		||||
int symbol_position( int x, symb s );
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	In file setup.c
 | 
			
		||||
*/
 | 
			
		||||
void subf_set();
 | 
			
		||||
int worstcase(int x, int ntop);
 | 
			
		||||
void set_u(int arr[], int x);
 | 
			
		||||
void CLoCK(int *timer);
 | 
			
		||||
void set_up_cc();
 | 
			
		||||
void job_start();
 | 
			
		||||
void job_stop(boolean batch);
 | 
			
		||||
void set_orders(char s[]);
 | 
			
		||||
void uglydisp(FILE *f);
 | 
			
		||||
void set_up_trin();
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	In file wffs.c
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
symb newsymbol( char *string, symb symbol_list1[], symb symbol_list2[] );
 | 
			
		||||
void wff_initial();
 | 
			
		||||
boolean got_formula(int x, int y, int yy, char *s);
 | 
			
		||||
int infml(input_case x, int y, int yy);
 | 
			
		||||
boolean next_symbol( char longs[] );
 | 
			
		||||
symb this_symbol( char *string );
 | 
			
		||||
boolean seek_symbol( char longs[], symb fml[], int *k );
 | 
			
		||||
void fix_atoms(int y, int wf);
 | 
			
		||||
void outformula(int p, int q, FILE *f, varmode vm);
 | 
			
		||||
boolean is_in(symb s, int w);
 | 
			
		||||
void purge( symb badsym );
 | 
			
		||||
							
								
								
									
										187
									
								
								src/Mtypes.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										187
									
								
								src/Mtypes.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,187 @@
 | 
			
		|||
/*
 | 
			
		||||
*			Mtypes.h
 | 
			
		||||
*
 | 
			
		||||
*	This file is part of the header for MaGIC. It contains
 | 
			
		||||
*	the type definitions. The special header axioms.h has to
 | 
			
		||||
*	be included from here, as it uses the enumerated type 
 | 
			
		||||
*	boolean and defines such constants as AXMAX which are in
 | 
			
		||||
*	turn used here in the definitions of the big structures.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
	/****************************************************************
 | 
			
		||||
	*								*
 | 
			
		||||
	*			    MaGIC 2.1				*
 | 
			
		||||
	*								*
 | 
			
		||||
	*	    (C) 1993 Australian National University		*
 | 
			
		||||
	*								*
 | 
			
		||||
	* 		       All rights reserved			*
 | 
			
		||||
	*								*
 | 
			
		||||
	* The information in this software is subject to change without	*
 | 
			
		||||
	* notice and should not be construed as a commitment by the	*
 | 
			
		||||
	* Australian National University. The Australian National Uni-	*
 | 
			
		||||
	* versity makes no representations about the suitability of	*
 | 
			
		||||
	* this software for any purpose. It is supplied "as is" without	*
 | 
			
		||||
	* express or implied warranty.  If the software is modified in 	*
 | 
			
		||||
	* a manner creating derivative copyright rights, appropriate	*
 | 
			
		||||
	* legends may be placed on the derivative work in addition to	*
 | 
			
		||||
	* that set forth above.						*
 | 
			
		||||
	*								*
 | 
			
		||||
	* Permission to use, copy, modify and distribute this software	*
 | 
			
		||||
	* and its documentation for any purpose and without fee is	*
 | 
			
		||||
	* hereby granted, provided that both the above copyright notice	*
 | 
			
		||||
	* and this permission notice appear in all copies and sup-	*
 | 
			
		||||
	* porting documentation, and that the name of the Australian	*
 | 
			
		||||
	* National University not be used in advertising or publicity	*
 | 
			
		||||
	* pertaining to distribution of the software without specific,	*
 | 
			
		||||
	* written prior permission.					*
 | 
			
		||||
	*								*
 | 
			
		||||
	****************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	First the output codes.  This is just an enumeration.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
	NONE,
 | 
			
		||||
	PRETTY,
 | 
			
		||||
	UGLY,
 | 
			
		||||
	SUMMARY
 | 
			
		||||
} output_style;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	There is another enumeration of cases for formula input
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
	IN_CONC,
 | 
			
		||||
	IN_PREM,
 | 
			
		||||
	IN_BGUY,
 | 
			
		||||
	IN_DEFN
 | 
			
		||||
} input_case;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	And one for formula output
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
	VARS,
 | 
			
		||||
	VALS
 | 
			
		||||
} varmode;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Then the various help codes
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
	MEN,
 | 
			
		||||
	WFF1,
 | 
			
		||||
	WFF2,
 | 
			
		||||
	FDL,
 | 
			
		||||
	BTW,
 | 
			
		||||
	LOG,
 | 
			
		||||
	OUT,
 | 
			
		||||
	HELPMAX
 | 
			
		||||
} helpcode;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	It remains to define the structure types used.  Each 
 | 
			
		||||
*	"struct xxxtype" expression is abbreviated using typedef
 | 
			
		||||
*	to preserve sanity later on.  JOB is for communication of 
 | 
			
		||||
*	the major problem specification between the front end and 
 | 
			
		||||
*	MaGIC itself.  The others are fairly self-explanatory.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct isomorph
 | 
			
		||||
{	char	*icv;		/* Isomorphic version of info	*/
 | 
			
		||||
	struct isomorph
 | 
			
		||||
		*left,
 | 
			
		||||
		*right,
 | 
			
		||||
		*parent;	/* Links to make a binary tree	*/
 | 
			
		||||
} ISM, *ism;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct symbol_list
 | 
			
		||||
{
 | 
			
		||||
	char	s[SLEN];	/* Connective as a string	*/
 | 
			
		||||
	struct symbol_list
 | 
			
		||||
		*next, *last;	/* Links for list		*/
 | 
			
		||||
} SYMB, *symb;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct
 | 
			
		||||
{	symb	sym;		/* The main symbol		*/
 | 
			
		||||
	int	lsub,
 | 
			
		||||
		rsub,		/* Offsets of the subformulas	*/
 | 
			
		||||
		*mtx,		/* Start of the relevant matrix	*/
 | 
			
		||||
		*lv,
 | 
			
		||||
		*rv,		/* To values of subformulas	*/ 
 | 
			
		||||
		val;		/* Currently assigned value	*/
 | 
			
		||||
} WFF;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct PerMutAtion
 | 
			
		||||
{
 | 
			
		||||
	char	h[SZ];		/* Image under homomorphism	*/
 | 
			
		||||
	struct PerMutAtion
 | 
			
		||||
		*pup;		/* Pointer to the next guy up	*/
 | 
			
		||||
} PRM;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef enum {
 | 
			
		||||
	lattices,
 | 
			
		||||
	distributive_lattices,
 | 
			
		||||
	total_orders
 | 
			
		||||
} L_DEFAULT;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef enum {
 | 
			
		||||
	n_exists,
 | 
			
		||||
	lat_exists,
 | 
			
		||||
	fus_exists,
 | 
			
		||||
	nec_exists,
 | 
			
		||||
	PCMAX	
 | 
			
		||||
} XF;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
	int	adicity[CMAX],		/* Of defined connectives	*/
 | 
			
		||||
		croot[TMAX][RTMAX],	/* Roots of rule conclusions	*/
 | 
			
		||||
		proot[TMAX][RTMAX],	/* Roots of rule premises	*/
 | 
			
		||||
		defcon[CMAX],		/* Roots of defined connectives	*/
 | 
			
		||||
		failure,		/* Root of badguy		*/
 | 
			
		||||
		maxtime,		/* Maximum clock reading	*/
 | 
			
		||||
		maxmat,			/* Maximum good matrices	*/
 | 
			
		||||
		sizmax;			/* Maximum matrix size		*/
 | 
			
		||||
	output_style
 | 
			
		||||
		tty_out,
 | 
			
		||||
		fil_out;		/* Output formats		*/
 | 
			
		||||
	char	data_dir[SLEN],		/* Text name of input directory	*/
 | 
			
		||||
		outfil_name[SLEN];	/* Text name of output file	*/
 | 
			
		||||
	WFF	form[FMAX];		/* (Subformulas of) axioms etc	*/
 | 
			
		||||
 | 
			
		||||
	SYMB	symtable[SYMBOLMAX];	/* Symbol table for connectives	*/
 | 
			
		||||
	symb	symtab,			/* List of symbols used		*/
 | 
			
		||||
		symbol[3][CMAX+8],	/* Symbol table entries		*/
 | 
			
		||||
		dcs[CMAX+1];		/* Defined connectives		*/
 | 
			
		||||
	boolean	axiom[AXMAX],	/* Selected axioms (default none)	*/
 | 
			
		||||
		concut[CMAX],	/* Flags connectives with "cuts"	*/
 | 
			
		||||
		f_n, f_lat,
 | 
			
		||||
		f_t, f_T,
 | 
			
		||||
		f_F,		/* The fragment (default 1)		*/
 | 
			
		||||
		f_fus, f_nec,	/* The fragment (default 0)		*/
 | 
			
		||||
		sizmax_ismax,	/* (Boolean) Let sizmax float up	*/
 | 
			
		||||
		distrib,	/* Distributive lattice requested	*/
 | 
			
		||||
		totord;		/* Total orders requested		*/
 | 
			
		||||
	LOGIC	logic;			/* The system (default FD)	*/
 | 
			
		||||
} JOB;
 | 
			
		||||
							
								
								
									
										230
									
								
								src/RM.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										230
									
								
								src/RM.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,230 @@
 | 
			
		|||
/*			RM.c (Read_Matrices)		March 1991
 | 
			
		||||
*
 | 
			
		||||
*	This is the basic post-processor for MaGIC.
 | 
			
		||||
*
 | 
			
		||||
*	Selectmats reads in matrix representations of algebraic
 | 
			
		||||
*	models for propositional logics and performs an operation 
 | 
			
		||||
*	on each one that satisfies a condition.  It is called with 
 | 
			
		||||
*	three parameters, being a pointer to a MATRIX structure, 
 | 
			
		||||
*	the name of the user-defined selection function and the 
 | 
			
		||||
*	print mode (UGLY, PRETTY, TeX or NONE).
 | 
			
		||||
*
 | 
			
		||||
*	The selector is allowed to return TRUE (1), FALSE (0) or 
 | 
			
		||||
*	END_OF_JOB (-1).  Any other value is treated as 0.
 | 
			
		||||
*
 | 
			
		||||
*	See RM.h for a description of the data structures.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/****************************************************************
 | 
			
		||||
	*								*
 | 
			
		||||
	*			    MaGIC 2.1				*
 | 
			
		||||
	*								*
 | 
			
		||||
	*	    (C) 1993 Australian National University		*
 | 
			
		||||
	*								*
 | 
			
		||||
	* 		       All rights reserved			*
 | 
			
		||||
	*								*
 | 
			
		||||
	* The information in this software is subject to change without	*
 | 
			
		||||
	* notice and should not be construed as a commitment by the	*
 | 
			
		||||
	* Australian National University. The Australian National Uni-	*
 | 
			
		||||
	* versity makes no representations about the suitability of	*
 | 
			
		||||
	* this software for any purpose. It is supplied "as is" without	*
 | 
			
		||||
	* express or implied warranty.  If the software is modified in 	*
 | 
			
		||||
	* a manner creating derivative copyright rights, appropriate	*
 | 
			
		||||
	* legends may be placed on the derivative work in addition to	*
 | 
			
		||||
	* that set forth above.						*
 | 
			
		||||
	*								*
 | 
			
		||||
	* Permission to use, copy, modify and distribute this software	*
 | 
			
		||||
	* and its documentation for any purpose and without fee is	*
 | 
			
		||||
	* hereby granted, provided that both the above copyright notice	*
 | 
			
		||||
	* and this permission notice appear in all copies and sup-	*
 | 
			
		||||
	* porting documentation, and that the name of the Australian	*
 | 
			
		||||
	* National University not be used in advertising or publicity	*
 | 
			
		||||
	* pertaining to distribution of the software without specific,	*
 | 
			
		||||
	* written prior permission.					*
 | 
			
		||||
	*								*
 | 
			
		||||
	****************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "RM.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void selectmats(int (*selector)(), PRINTMODE printmode)
 | 
			
		||||
{
 | 
			
		||||
  int i, done;
 | 
			
		||||
  MATRIX *m;
 | 
			
		||||
 | 
			
		||||
  m = mat_initial();
 | 
			
		||||
  m->total_got = m->total_put = 0;
 | 
			
		||||
  done = 0;
 | 
			
		||||
  read_header(stdin,m);
 | 
			
		||||
  if ( newsiz(stdin,m) )
 | 
			
		||||
    do {
 | 
			
		||||
      m->total_got++;
 | 
			
		||||
      for (i=0; i<VALUEMAX; i++)
 | 
			
		||||
	m->my_values[i] = -1;
 | 
			
		||||
      *(m->my_string) = '\0';
 | 
			
		||||
      switch ((*selector)(m)) {
 | 
			
		||||
      case 1:
 | 
			
		||||
	m->total_put++;
 | 
			
		||||
	increment_ok(m);
 | 
			
		||||
	printmat(m,printmode,SELECTED,stdout);
 | 
			
		||||
	break;
 | 
			
		||||
      case -1:
 | 
			
		||||
	done = 1;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    while (!done && newcase(stdin,m));
 | 
			
		||||
  switch(printmode) {
 | 
			
		||||
  case UGLY:
 | 
			
		||||
    FORALLCON((m),i) printf(" -1");
 | 
			
		||||
    printf(" -1 -1 -1 -1 -1\n");
 | 
			
		||||
    break;
 | 
			
		||||
  case PRETTY:
 | 
			
		||||
    printf("\n\n Total read: %d\n Total written: %d\n\n",
 | 
			
		||||
	   m->total_got, m->total_put );
 | 
			
		||||
    break;
 | 
			
		||||
  case TeX:
 | 
			
		||||
    printf("\n\n\\end{document}\n");
 | 
			
		||||
    break;
 | 
			
		||||
  case NONE:
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void relatemats(int (*selector)(), char *filename, char *relname)
 | 
			
		||||
{
 | 
			
		||||
  int i, done;
 | 
			
		||||
  MATRIX *m1;
 | 
			
		||||
  FILE *f1;
 | 
			
		||||
  MATRIX *m2;
 | 
			
		||||
  FILE *f2;
 | 
			
		||||
 | 
			
		||||
  f1 = fopen(filename,"r");
 | 
			
		||||
  m1 = mat_initial();
 | 
			
		||||
  m1->total_got = m1->total_put = 0;
 | 
			
		||||
  done = 0;
 | 
			
		||||
  read_header(f1,m1);
 | 
			
		||||
  if (newsiz(f1,m1))
 | 
			
		||||
    do {
 | 
			
		||||
      m1->total_got++;
 | 
			
		||||
      for (i=0; i<VALUEMAX; i++)
 | 
			
		||||
	m1->my_values[i] = -1;
 | 
			
		||||
      m1->my_string[0] = 0;
 | 
			
		||||
      f2 = fopen(filename,"r");
 | 
			
		||||
      m2 = mat_initial();
 | 
			
		||||
      m2->total_got = m1->total_put = 0;
 | 
			
		||||
      done = 0;
 | 
			
		||||
      read_header(f2,m2);
 | 
			
		||||
      if (newsiz(f2,m2))
 | 
			
		||||
	do {
 | 
			
		||||
	  m2->total_got++;
 | 
			
		||||
	  for (i=0; i<VALUEMAX; i++)
 | 
			
		||||
	    m2->my_values[i] = -1;
 | 
			
		||||
	  *m2->my_string = 0;
 | 
			
		||||
	  switch ((*selector)(m1,m2)) {
 | 
			
		||||
	  case 1:
 | 
			
		||||
	    print_related(m1,m2,relname);
 | 
			
		||||
	    break;
 | 
			
		||||
	  case -1:
 | 
			
		||||
	    done = 1;
 | 
			
		||||
	  }
 | 
			
		||||
	}
 | 
			
		||||
	while (!done && newcase(f2,m2));
 | 
			
		||||
      fclose(f2);
 | 
			
		||||
    }
 | 
			
		||||
    while (!done && newcase(f1,m1));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	True is a dummy function which can be used to force every
 | 
			
		||||
*	matrix to be printed out just as it is read in.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
int True(MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	There are two versions of the matrix numbers.  The ones 
 | 
			
		||||
*	prefixed with "ok" record the numbers on which compute has
 | 
			
		||||
*	been performed.  Those without record the numbers read in.
 | 
			
		||||
*
 | 
			
		||||
*	Before compute happens, the "ok" numbers are incremented.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void increment_ok(MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  int first, i;
 | 
			
		||||
 | 
			
		||||
  for ( first = 0; first < m->cmax && m->okmatplus[first]; first++ ) ;
 | 
			
		||||
  for ( i = first; i < m->cmax; i++ ) m->okmatplus[i] = 1;
 | 
			
		||||
  if ( first ) m->okmatplus[first-1]++;
 | 
			
		||||
  else {
 | 
			
		||||
    if ( !m->okmatno ) {
 | 
			
		||||
      if ( !m->okdesno ) {
 | 
			
		||||
	if ( !m->okordno ) {
 | 
			
		||||
	  if ( m->fragment[NEG] )
 | 
			
		||||
	    m->oknegno++;
 | 
			
		||||
	}
 | 
			
		||||
	m->okordno++;
 | 
			
		||||
      }
 | 
			
		||||
      m->okdesno++;
 | 
			
		||||
    }
 | 
			
		||||
    m->okmatno++;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Mat_malloc allocates memory to a MATRIX pointer and does
 | 
			
		||||
*	the necessary initialisation.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
MATRIX *mat_initial()
 | 
			
		||||
{
 | 
			
		||||
  MATRIX *m;
 | 
			
		||||
 | 
			
		||||
  m = (MATRIX *) malloc(sizeof(MATRIX));
 | 
			
		||||
/*
 | 
			
		||||
*	WFF initialisation will go in here
 | 
			
		||||
*/
 | 
			
		||||
  return m;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	An abort function is provided.  This causes a clean exit 
 | 
			
		||||
*	after printing an error message (with integer insert). 
 | 
			
		||||
*
 | 
			
		||||
*	Setting the integer argument to -1 disables this option.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void Abort( char *s, int x)
 | 
			
		||||
{
 | 
			
		||||
  fprintf( stderr, "\n\n Aborting on detection of an error\n " );
 | 
			
		||||
  if ( x == -1 ) fprintf( stderr, s );
 | 
			
		||||
  else fprintf( stderr, s, x );
 | 
			
		||||
  fprintf( stderr, "\n" );
 | 
			
		||||
  exit(1);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										295
									
								
								src/RM.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										295
									
								
								src/RM.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,295 @@
 | 
			
		|||
/*			Header for Read_Matrices
 | 
			
		||||
*
 | 
			
		||||
*	Selectmats reads in matrix representations of algebraic
 | 
			
		||||
*	models for propositional logics and prints out each one
 | 
			
		||||
*	that satisfies a condition.  It is called with three
 | 
			
		||||
*	parameters, being a pointer to a MATRIX, the name of the 
 | 
			
		||||
*	user-defined selection function and the print mode 
 | 
			
		||||
*	(PRETTY, UGLY or TeX).
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/****************************************************************
 | 
			
		||||
	*								*
 | 
			
		||||
	*			    MaGIC 2.1				*
 | 
			
		||||
	*								*
 | 
			
		||||
	*	    (C) 1993 Australian National University		*
 | 
			
		||||
	*								*
 | 
			
		||||
	* 		       All rights reserved			*
 | 
			
		||||
	*								*
 | 
			
		||||
	* The information in this software is subject to change without	*
 | 
			
		||||
	* notice and should not be construed as a commitment by the	*
 | 
			
		||||
	* Australian National University. The Australian National Uni-	*
 | 
			
		||||
	* versity makes no representations about the suitability of	*
 | 
			
		||||
	* this software for any purpose. It is supplied "as is" without	*
 | 
			
		||||
	* express or implied warranty.  If the software is modified in 	*
 | 
			
		||||
	* a manner creating derivative copyright rights, appropriate	*
 | 
			
		||||
	* legends may be placed on the derivative work in addition to	*
 | 
			
		||||
	* that set forth above.						*
 | 
			
		||||
	*								*
 | 
			
		||||
	* Permission to use, copy, modify and distribute this software	*
 | 
			
		||||
	* and its documentation for any purpose and without fee is	*
 | 
			
		||||
	* hereby granted, provided that both the above copyright notice	*
 | 
			
		||||
	* and this permission notice appear in all copies and sup-	*
 | 
			
		||||
	* porting documentation, and that the name of the Australian	*
 | 
			
		||||
	* National University not be used in advertising or publicity	*
 | 
			
		||||
	* pertaining to distribution of the software without specific,	*
 | 
			
		||||
	* written prior permission.					*
 | 
			
		||||
	*								*
 | 
			
		||||
	****************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*  The setup is read into MATRIX fields as follows:
 | 
			
		||||
*
 | 
			
		||||
*    siz    the greatest-numbered value.  So the
 | 
			
		||||
*           values are the integers 0...siz.
 | 
			
		||||
*
 | 
			
		||||
*    neg    the negation table (if present).
 | 
			
		||||
*
 | 
			
		||||
*    ord    the partial order of implication.
 | 
			
		||||
*
 | 
			
		||||
*    A, K    disjunction and conjunction tables.
 | 
			
		||||
*
 | 
			
		||||
*    designated  designation and undesignation of values.
 | 
			
		||||
*
 | 
			
		||||
*    tee    the least designated value (if defined).
 | 
			
		||||
*
 | 
			
		||||
*    eff    the negation of tee (if defined).
 | 
			
		||||
*
 | 
			
		||||
*    C      the implication table.
 | 
			
		||||
*
 | 
			
		||||
*    box    the necessity table.
 | 
			
		||||
*
 | 
			
		||||
*    fus    the fusion table (if defined).
 | 
			
		||||
*
 | 
			
		||||
*    fis    the fission table (if defined).
 | 
			
		||||
*
 | 
			
		||||
*    dcs    the symbols for defined connectives.
 | 
			
		||||
*
 | 
			
		||||
*    adicity     of the defined connectives
 | 
			
		||||
*
 | 
			
		||||
*    nulladic
 | 
			
		||||
*    monadic
 | 
			
		||||
*    dyadic      matrices for the user's connectives.
 | 
			
		||||
*
 | 
			
		||||
*    fused       boolean flag: fusion is defined.
 | 
			
		||||
*
 | 
			
		||||
*    tee_exists  boolean flag: tee is defined.
 | 
			
		||||
*
 | 
			
		||||
*    negno
 | 
			
		||||
*    ordno
 | 
			
		||||
*    desno
 | 
			
		||||
*    matno       Offset numbers of the current setup.
 | 
			
		||||
*
 | 
			
		||||
*    oknegno
 | 
			
		||||
*    okordno
 | 
			
		||||
*    okdesno
 | 
			
		||||
*    okmatno     Offset numbers of the latest good setup.
 | 
			
		||||
*
 | 
			
		||||
*    fragment    connectives defined
 | 
			
		||||
*
 | 
			
		||||
*
 | 
			
		||||
*  In addition, the constant SZ is defined as the greatest 
 | 
			
		||||
*  possible number of values.  That is, siz < SZ always.
 | 
			
		||||
*
 | 
			
		||||
*  The universal quantifier FORALL is defined for use in the
 | 
			
		||||
*  host program if desired.  FORALLCON is also provided to run 
 | 
			
		||||
*  through the user-defined primitives in their change order.
 | 
			
		||||
*
 | 
			
		||||
*  The data type WFF is exactly as in MaGIC, for input and
 | 
			
		||||
*  testing of formulas.  The parser may be linked in.
 | 
			
		||||
*
 | 
			
		||||
*  The array my_values and the string my_string are provided
 | 
			
		||||
*  for communication of the results of tests etc to the 
 | 
			
		||||
*  printout routine.  They are initialised to a series of 
 | 
			
		||||
*  -1s and to the null string respectively.  These values 
 | 
			
		||||
*  should be used for the null communication.
 | 
			
		||||
*
 | 
			
		||||
*  Several other MATRIX fields are used to control the 
 | 
			
		||||
*  environment, mostly to determine printing options.
 | 
			
		||||
*
 | 
			
		||||
*    cmax          number of user-added primitives
 | 
			
		||||
*    total_got     number of matrices read in
 | 
			
		||||
*    total_put     number which have passes the test
 | 
			
		||||
*    singlematrix  treat as though the only matrix
 | 
			
		||||
*
 | 
			
		||||
*  Those are all integers.  There are a couple of defined
 | 
			
		||||
*  enumeration types, PRINTMODE and PRINTCOUNTER.  These are 
 | 
			
		||||
*  the types of the parameters printmode and printcountermode
 | 
			
		||||
*  passed to printmat.  The former of these determines whether
 | 
			
		||||
*  output is PRETTY, UGLY or TeX, while the latter determines
 | 
			
		||||
*  whether the numbering of matrices is to be incremental 
 | 
			
		||||
*  within the output only or whether the numbers remain as on
 | 
			
		||||
*  input.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
 | 
			
		||||
#define SZ 16
 | 
			
		||||
#define FMAX 256
 | 
			
		||||
#define CMAX 32
 | 
			
		||||
#define VALUEMAX 10
 | 
			
		||||
 | 
			
		||||
#define FORALL(m,x) for ( x = 0; x <= m->siz; x++ )
 | 
			
		||||
#define FOREACH(m,x) for ( x = m->siz; x >= 0; x-- )
 | 
			
		||||
#define FORALLCON(m,x) for ( x = 0; x < m->cmax; x++)
 | 
			
		||||
 | 
			
		||||
typedef enum { NONE, PRETTY, UGLY, TeX } PRINTMODE;
 | 
			
		||||
typedef enum { SELECTED, UNSELECTED } COUNTERMODE;
 | 
			
		||||
enum { NEG, TEE, TOP, BOT, FUS, LAT, BOX, FRAGMAX } ;
 | 
			
		||||
 | 
			
		||||
typedef struct well_formed_formula {
 | 
			
		||||
  char *sym;      /* The main symbol              */
 | 
			
		||||
  int lsub;
 | 
			
		||||
  int rsub;       /* Offsets of the subformulas   */
 | 
			
		||||
  int *mtx;       /* Start of the relevant matrix */
 | 
			
		||||
  int *lv;
 | 
			
		||||
  int *rv;        /* To values of subformulas     */
 | 
			
		||||
  int val;        /* Currently assigned value     */
 | 
			
		||||
} WFF;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
* Now for the big one: this is the matrix structure.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
  WFF form[FMAX];
 | 
			
		||||
  WFF *tx;
 | 
			
		||||
 | 
			
		||||
  int siz;
 | 
			
		||||
  int neg[SZ];
 | 
			
		||||
  int ord[SZ][SZ];
 | 
			
		||||
  int designated[SZ];
 | 
			
		||||
  int tee;
 | 
			
		||||
  int eff;
 | 
			
		||||
  int A[SZ][SZ];
 | 
			
		||||
  int K[SZ][SZ];
 | 
			
		||||
  int C[SZ][SZ];
 | 
			
		||||
  int fus[SZ][SZ];
 | 
			
		||||
  int fis[SZ][SZ];
 | 
			
		||||
  int box[SZ];
 | 
			
		||||
  int diamond[SZ];
 | 
			
		||||
  int adicity[CMAX];
 | 
			
		||||
  int nulladic[CMAX];
 | 
			
		||||
  int monadic[CMAX][SZ];
 | 
			
		||||
  int dyadic[CMAX][SZ][SZ];
 | 
			
		||||
  int negno;
 | 
			
		||||
  int oknegno;
 | 
			
		||||
  int ordno;
 | 
			
		||||
  int okordno;
 | 
			
		||||
  int desno; 
 | 
			
		||||
  int okdesno;
 | 
			
		||||
  int matno;
 | 
			
		||||
  int okmatno;
 | 
			
		||||
  int boxno;
 | 
			
		||||
  int okboxno;
 | 
			
		||||
  int matplus[CMAX];
 | 
			
		||||
  int okmatplus[CMAX];
 | 
			
		||||
  int fused;
 | 
			
		||||
  int tee_exists;
 | 
			
		||||
  int cmax;
 | 
			
		||||
  int total_got;
 | 
			
		||||
  int total_put;
 | 
			
		||||
  int fragment[FRAGMAX];
 | 
			
		||||
  int my_values[VALUEMAX];
 | 
			
		||||
 | 
			
		||||
  char my_string[256];
 | 
			
		||||
  char dcs[CMAX][16];
 | 
			
		||||
  char symbols[3][15];
 | 
			
		||||
} MATRIX;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
FILE *fopen();
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
* Finally, here are the function prototypes for RM.c
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void selectmats(int (*selector)(), PRINTMODE printmode);
 | 
			
		||||
void relatemats(int (*selector)(), char *filename, char *relname);
 | 
			
		||||
int True(MATRIX *m);
 | 
			
		||||
void increment_ok(MATRIX *m);
 | 
			
		||||
MATRIX* mat_initial();
 | 
			
		||||
void Abort(char *s, int x);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
* These are the prototypes for RM_input.c
 | 
			
		||||
*/
 | 
			
		||||
void read_header(FILE *f, MATRIX *m);
 | 
			
		||||
int newsiz(FILE *f, MATRIX *m);
 | 
			
		||||
int newneg(FILE *f, MATRIX *m);
 | 
			
		||||
int neword(FILE *f, MATRIX *m);
 | 
			
		||||
int newdes(FILE *f, MATRIX *m);
 | 
			
		||||
int newC(FILE *f, MATRIX *m);
 | 
			
		||||
int newbox(FILE *f, MATRIX *m);
 | 
			
		||||
int newcon(FILE *f, MATRIX *m, int x);
 | 
			
		||||
int newcase(FILE *f, MATRIX *m);
 | 
			
		||||
int gotsiz(FILE *f, MATRIX *m);
 | 
			
		||||
int gotneg(FILE *f, MATRIX *m);
 | 
			
		||||
int gotord(FILE *f, MATRIX *m);
 | 
			
		||||
int gotdes(FILE *f, MATRIX *m);
 | 
			
		||||
int gotaro(FILE *f, MATRIX *m);
 | 
			
		||||
int gotbox(FILE *f, MATRIX *m);
 | 
			
		||||
int gotcon(FILE *f, MATRIX *m, int x);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
* These are the prototypes for RM_output.c
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void displaymat(MATRIX *m, char *legend);
 | 
			
		||||
void printmat(MATRIX *m, PRINTMODE printmode,
 | 
			
		||||
	      COUNTERMODE countermode, FILE *f);
 | 
			
		||||
void write_header(MATRIX *m);
 | 
			
		||||
void pu_print(MATRIX *m, int x, FILE *f);
 | 
			
		||||
void uu_print(MATRIX *m, int x);
 | 
			
		||||
void pbox_print( MATRIX *m, FILE *f );
 | 
			
		||||
void ubox_print(MATRIX *m);
 | 
			
		||||
void pC_print(MATRIX *m, FILE *f);
 | 
			
		||||
void uC_print(MATRIX *m);
 | 
			
		||||
void pdesprint(MATRIX *m, FILE *f);
 | 
			
		||||
void udesprint(MATRIX *m);
 | 
			
		||||
void pordprint(MATRIX *m, FILE *f);
 | 
			
		||||
void uordprint(MATRIX *m);
 | 
			
		||||
void pnegprint(MATRIX *m, FILE *f);
 | 
			
		||||
void unegprint(MATRIX *m);
 | 
			
		||||
void psizprint(MATRIX *m, FILE *f);
 | 
			
		||||
void usizprint(MATRIX *m);
 | 
			
		||||
void neg_number(MATRIX *m, FILE *f);
 | 
			
		||||
void ord_number(MATRIX *m, FILE *f);
 | 
			
		||||
void des_number(MATRIX *m, FILE *f);
 | 
			
		||||
void C_number(MATRIX *m, FILE *f);
 | 
			
		||||
void box_number(MATRIX *m, FILE *f);
 | 
			
		||||
void u_number(MATRIX *m, int x, FILE *f);
 | 
			
		||||
void nullprint(MATRIX *m, char *s, int x, FILE *f);
 | 
			
		||||
void unullprint(MATRIX *m, int x);
 | 
			
		||||
void monprint(MATRIX *m, char *s, char c, int arr[], FILE *f);
 | 
			
		||||
void umonprint(MATRIX *m, int arr[]);
 | 
			
		||||
void dyprint(MATRIX *m, char *s1, char c, int arr[][SZ],
 | 
			
		||||
	     char *s2, char d, int darr[][SZ], FILE *f);
 | 
			
		||||
void udyprint(MATRIX *m, int arr[][SZ]);
 | 
			
		||||
void tex_header();
 | 
			
		||||
void tex_mystuff(MATRIX *m);
 | 
			
		||||
void texchar(char c);
 | 
			
		||||
void tex_uprint(MATRIX *m, int x);
 | 
			
		||||
void tex_boxprint(MATRIX *m);
 | 
			
		||||
void tex_Cprint(MATRIX *m);
 | 
			
		||||
void tex_desprint(MATRIX *m);
 | 
			
		||||
void tex_ordprint(MATRIX *m);
 | 
			
		||||
void tex_negprint(MATRIX *m);
 | 
			
		||||
void tex_sizprint(MATRIX *m);
 | 
			
		||||
void tex_nullprint(MATRIX *m, char *s, int x);
 | 
			
		||||
void tex_monprint(MATRIX *m, char *s, char c, int arr[]);
 | 
			
		||||
void tex_dyprint(MATRIX *m, char *s1, char c, int arr[][SZ],
 | 
			
		||||
		 char *s2, char d, int darr[][SZ]);
 | 
			
		||||
void tex_dymatprint(MATRIX *m, int offset, char *s, char c, int arr[][SZ]);
 | 
			
		||||
void print_related(MATRIX *m1, MATRIX *m2, char *relname);
 | 
			
		||||
							
								
								
									
										272
									
								
								src/RM_input.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										272
									
								
								src/RM_input.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,272 @@
 | 
			
		|||
/*			Input.c			March 1991
 | 
			
		||||
*
 | 
			
		||||
*	Functions to read matrices for MaGIC postprocessor.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/****************************************************************
 | 
			
		||||
	*								*
 | 
			
		||||
	*			    MaGIC 2.1				*
 | 
			
		||||
	*								*
 | 
			
		||||
	*	    (C) 1993 Australian National University		*
 | 
			
		||||
	*								*
 | 
			
		||||
	* 		       All rights reserved			*
 | 
			
		||||
	*								*
 | 
			
		||||
	* The information in this software is subject to change without	*
 | 
			
		||||
	* notice and should not be construed as a commitment by the	*
 | 
			
		||||
	* Australian National University. The Australian National Uni-	*
 | 
			
		||||
	* versity makes no representations about the suitability of	*
 | 
			
		||||
	* this software for any purpose. It is supplied "as is" without	*
 | 
			
		||||
	* express or implied warranty.  If the software is modified in 	*
 | 
			
		||||
	* a manner creating derivative copyright rights, appropriate	*
 | 
			
		||||
	* legends may be placed on the derivative work in addition to	*
 | 
			
		||||
	* that set forth above.						*
 | 
			
		||||
	*								*
 | 
			
		||||
	* Permission to use, copy, modify and distribute this software	*
 | 
			
		||||
	* and its documentation for any purpose and without fee is	*
 | 
			
		||||
	* hereby granted, provided that both the above copyright notice	*
 | 
			
		||||
	* and this permission notice appear in all copies and sup-	*
 | 
			
		||||
	* porting documentation, and that the name of the Australian	*
 | 
			
		||||
	* National University not be used in advertising or publicity	*
 | 
			
		||||
	* pertaining to distribution of the software without specific,	*
 | 
			
		||||
	* written prior permission.					*
 | 
			
		||||
	*								*
 | 
			
		||||
	****************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "RM.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void read_header(FILE *f, MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  int i, j = 0;
 | 
			
		||||
 | 
			
		||||
  for (i=0; i<FRAGMAX; i++)
 | 
			
		||||
    fscanf(f,"%d",m->fragment+i);
 | 
			
		||||
  fscanf(f,"%d",&(m->cmax));
 | 
			
		||||
  FORALLCON(m,i) {
 | 
			
		||||
    fscanf(f,"%d",m->adicity+i);
 | 
			
		||||
    do
 | 
			
		||||
      fscanf(f,"%c",m->dcs[i]);
 | 
			
		||||
    while (isspace(m->dcs[i][0]));
 | 
			
		||||
    do
 | 
			
		||||
      fscanf(f,"%c",m->dcs[i]+(++j));
 | 
			
		||||
    while (!isspace(m->dcs[i][j]));
 | 
			
		||||
    m->dcs[i][j] = 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int newsiz(FILE *f, MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  return(gotsiz(f,m)? (m->fragment[NEG]? newneg(f,m): neword(f,m)): 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int newneg(FILE *f, MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  return(gotneg(f,m)? neword(f,m): newsiz(f,m));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int neword(FILE *f, MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  return(gotord(f,m)? newdes(f,m):
 | 
			
		||||
	 (m->fragment[NEG]? newneg(f,m): newsiz(f,m)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int newdes(FILE *f, MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  return(gotdes(f,m)? newC(f,m): neword(f,m));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int newC(FILE *f, MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  return(gotaro(f,m)? (m->fragment[BOX]? newbox(f,m): newcon(f,m,0)):
 | 
			
		||||
	 newdes(f,m));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int newbox(FILE *f, MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  return(gotbox(f,m)? newcon(f,m,0): newC(f,m));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int newcon(FILE *f, MATRIX *m, int x)
 | 
			
		||||
{
 | 
			
		||||
  if (x >= m->cmax) return 1;
 | 
			
		||||
  return(gotcon(f,m,x)? newcon(f,m,x+1): 
 | 
			
		||||
	 (x? newcon(f,m,x-1): 
 | 
			
		||||
	  (m->fragment[BOX]? newbox(f,m): newC(f,m))) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int newcase(FILE *f, MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  if (m->cmax)
 | 
			
		||||
    return newcon(f,m,m->cmax-1);
 | 
			
		||||
  if (m->fragment[BOX] )
 | 
			
		||||
    return newbox(f,m);
 | 
			
		||||
  return newC(f,m);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int gotsiz(FILE *f, MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  fscanf(f,"%d",&(m->siz));
 | 
			
		||||
  m->negno = m->ordno = 0;
 | 
			
		||||
  m->oknegno = m->okordno = 0;
 | 
			
		||||
  return (m->siz < SZ && m->siz > 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int gotneg(FILE *f, MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  fscanf(f,"%d",m->neg);
 | 
			
		||||
  if (*(m->neg) < 0)
 | 
			
		||||
    return 0;
 | 
			
		||||
  m->negno++; m->ordno = 0;
 | 
			
		||||
  m->okordno = 0;
 | 
			
		||||
  for (i=1; i<=m->siz; i++ )
 | 
			
		||||
    fscanf(f,"%d", m->neg+i);
 | 
			
		||||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int gotord(FILE *f, MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  int i,j;
 | 
			
		||||
 | 
			
		||||
  fscanf(f,"%d",*(m->ord));
 | 
			
		||||
  if (**(m->ord) < 0)
 | 
			
		||||
    return 0;
 | 
			
		||||
  m->ordno++; m->desno = 0;
 | 
			
		||||
  m->okdesno = 0;
 | 
			
		||||
  FORALL(m,i) FORALL(m,j) if (i||j)
 | 
			
		||||
    fscanf(f,"%d",m->ord[i]+j);
 | 
			
		||||
  FORALL(m,i) FORALL(m,j) {
 | 
			
		||||
    FORALL(m,m->A[i][j])
 | 
			
		||||
      if (m->ord[i][m->A[i][j]] && m->ord[j][m->A[i][j]])
 | 
			
		||||
	break;
 | 
			
		||||
    FOREACH(m,m->K[i][j])
 | 
			
		||||
      if (m->ord[m->K[i][j]][i] && m->ord[m->K[i][j]][j])
 | 
			
		||||
	break;
 | 
			
		||||
  }
 | 
			
		||||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int gotdes(FILE *f, MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  fscanf(f,"%d",m->designated);
 | 
			
		||||
  if (*(m->designated) < 0)
 | 
			
		||||
    return 0;
 | 
			
		||||
  FORALL(m,i)
 | 
			
		||||
    if (i)
 | 
			
		||||
      fscanf(f,"%d",m->designated+i);
 | 
			
		||||
  FORALL(m,m->tee)
 | 
			
		||||
    if ( m->designated[m->tee] )
 | 
			
		||||
      break;
 | 
			
		||||
  m->tee_exists = 1;
 | 
			
		||||
  FORALL(m,i)
 | 
			
		||||
    if (m->designated[i] && !m->ord[m->tee][i])
 | 
			
		||||
      m->tee_exists = 0;
 | 
			
		||||
  m->desno++; m->matno = 0;
 | 
			
		||||
  m->okmatno = 0;
 | 
			
		||||
  m->eff = m->neg[m->tee];
 | 
			
		||||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int gotaro(FILE *f, MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  int i, j, k;
 | 
			
		||||
 | 
			
		||||
  fscanf(f,"%d",*(m->C));
 | 
			
		||||
  if (**(m->C) < 0)
 | 
			
		||||
    return 0;
 | 
			
		||||
  m->matno++;
 | 
			
		||||
  if (m->fragment[BOX]) {
 | 
			
		||||
    m->boxno = 0;
 | 
			
		||||
    m->okboxno = 0;
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    *(m->matplus) = 0;
 | 
			
		||||
    *(m->okmatplus) = 0;
 | 
			
		||||
  }
 | 
			
		||||
  FORALL(m,i) FORALL(m,j)
 | 
			
		||||
    if (i||j)
 | 
			
		||||
      fscanf(f,"%d",m->C[i]+j);
 | 
			
		||||
  m->fused = 1;
 | 
			
		||||
  FORALL(m,i) FORALL(m,j) {
 | 
			
		||||
    FORALL(m,m->fus[i][j])
 | 
			
		||||
      if (m->ord[i][m->C[j][m->fus[i][j]]])
 | 
			
		||||
	break;
 | 
			
		||||
    if (m->fus[i][j] > m->siz)
 | 
			
		||||
      m->fused = 0;
 | 
			
		||||
  }
 | 
			
		||||
  if (m->fused) {
 | 
			
		||||
    FORALL(m,i) FORALL(m,j) FORALL(m,k)
 | 
			
		||||
      if (m->ord[m->fus[i][j]][k] && !m->ord[i][m->C[j][k]])
 | 
			
		||||
	m->fused = 0;
 | 
			
		||||
    if (m->ord[i][m->C[j][k]] && !m->ord[m->fus[i][j]][k])
 | 
			
		||||
      m->fused = 0;
 | 
			
		||||
  }
 | 
			
		||||
  if (m->fragment[NEG])
 | 
			
		||||
    FORALL(m,i) FORALL(m,j)
 | 
			
		||||
      m->fis[i][j] = m->C[m->neg[i]][j];
 | 
			
		||||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int gotbox(FILE *f, MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  fscanf(f,"%d",m->box);
 | 
			
		||||
  if (*(m->box) < 0)
 | 
			
		||||
    return 0;
 | 
			
		||||
  m->boxno++;
 | 
			
		||||
  *(m->matplus) = 0;
 | 
			
		||||
  *(m->okmatplus) = 0;
 | 
			
		||||
  for (i=1; i<=m->siz; i++)
 | 
			
		||||
    fscanf(f,"%d",m->box+i);
 | 
			
		||||
  return 1;	
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int gotcon(FILE *f, MATRIX *m, int x)
 | 
			
		||||
{
 | 
			
		||||
  int i, j, k;
 | 
			
		||||
 | 
			
		||||
  fscanf(f,"%d",&k);
 | 
			
		||||
  if (k < 0)
 | 
			
		||||
    return 0;
 | 
			
		||||
  m->matplus[x]++;
 | 
			
		||||
  m->matplus[x+1] = 0;
 | 
			
		||||
  m->okmatplus[x+1] = 0;
 | 
			
		||||
  switch(m->adicity[x]) {
 | 
			
		||||
  case 0:
 | 
			
		||||
    m->nulladic[x] = k;
 | 
			
		||||
    break;
 | 
			
		||||
  case 1:
 | 
			
		||||
    m->monadic[x][0] = k;
 | 
			
		||||
    FORALL(m,i) if (i)
 | 
			
		||||
      fscanf(f,"%d",m->monadic[x]+i);
 | 
			
		||||
    break;
 | 
			
		||||
  case 2:
 | 
			
		||||
    m->dyadic[x][0][0] = k;
 | 
			
		||||
    FORALL(m,i) FORALL(m,j)
 | 
			
		||||
      if ( i||j )
 | 
			
		||||
	fscanf(f,"%d",m->dyadic[x][i]+j);
 | 
			
		||||
  }
 | 
			
		||||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										710
									
								
								src/RM_output.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										710
									
								
								src/RM_output.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,710 @@
 | 
			
		|||
/*			Output.c			March 1991
 | 
			
		||||
*
 | 
			
		||||
*	These are the functions for ugly, pretty and TeX output of
 | 
			
		||||
*	matrices.  They are called from RM.c which is used by all 
 | 
			
		||||
*	MaGIC post-processing programs.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/****************************************************************
 | 
			
		||||
	*								*
 | 
			
		||||
	*			    MaGIC 2.0				*
 | 
			
		||||
	*								*
 | 
			
		||||
	*	    (C) 1991 Australian National University		*
 | 
			
		||||
	*								*
 | 
			
		||||
	* 		       All rights reserved			*
 | 
			
		||||
	*								*
 | 
			
		||||
	* The information in this software is subject to change without	*
 | 
			
		||||
	* notice and should not be construed as a commitment by the	*
 | 
			
		||||
	* Australian National University. The Australian National Uni-	*
 | 
			
		||||
	* versity makes no representations about the suitability of	*
 | 
			
		||||
	* this software for any purpose. It is supplied "as is" without	*
 | 
			
		||||
	* express or implied warranty.  If the software is modified in 	*
 | 
			
		||||
	* a manner creating derivative copyright rights, appropriate	*
 | 
			
		||||
	* legends may be placed on the derivative work in addition to	*
 | 
			
		||||
	* that set forth above.						*
 | 
			
		||||
	*								*
 | 
			
		||||
	* Permission to use, copy, modify and distribute this software	*
 | 
			
		||||
	* and its documentation for any purpose and without fee is	*
 | 
			
		||||
	* hereby granted, provided that both the above copyright notice	*
 | 
			
		||||
	* and this permission notice appear in all copies and sup-	*
 | 
			
		||||
	* porting documentation, and that the name of the Australian	*
 | 
			
		||||
	* National University not be used in advertising or publicity	*
 | 
			
		||||
	* pertaining to distribution of the software without specific,	*
 | 
			
		||||
	* written prior permission.					*
 | 
			
		||||
	*								*
 | 
			
		||||
	****************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "RM.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int pnegno;
 | 
			
		||||
static int pordno;
 | 
			
		||||
static int pdesno;
 | 
			
		||||
static int pmatno;
 | 
			
		||||
static int pboxno;
 | 
			
		||||
static int pmatplus[CMAX];
 | 
			
		||||
static int singlematrix;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void displaymat(MATRIX *m, char *legend)
 | 
			
		||||
{
 | 
			
		||||
  FILE *f;
 | 
			
		||||
 | 
			
		||||
  f = fopen("/dev/tty","w");
 | 
			
		||||
  singlematrix = 1;
 | 
			
		||||
  system( "clear > /dev/tty" );
 | 
			
		||||
  printmat( m, PRETTY, UNSELECTED, f );
 | 
			
		||||
  fprintf( f, "\n\n %s", legend );
 | 
			
		||||
  singlematrix = 0;
 | 
			
		||||
  fclose(f);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void printmat(MATRIX *m, PRINTMODE printmode, COUNTERMODE countermode, FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  if ( countermode == SELECTED ) {
 | 
			
		||||
    pnegno = m->oknegno;
 | 
			
		||||
    pordno = m->okordno;
 | 
			
		||||
    pdesno = m->okdesno;
 | 
			
		||||
    pmatno = m->okmatno;
 | 
			
		||||
    pboxno = m->okboxno;
 | 
			
		||||
    FORALLCON(m,i)
 | 
			
		||||
      pmatplus[i] = m->okmatplus[i];
 | 
			
		||||
  }
 | 
			
		||||
  else if ( countermode == UNSELECTED ) {
 | 
			
		||||
    pnegno = m->negno;
 | 
			
		||||
    pordno = m->ordno;
 | 
			
		||||
    pdesno = m->desno;
 | 
			
		||||
    pmatno = m->matno;
 | 
			
		||||
    pboxno = m->boxno;
 | 
			
		||||
    FORALLCON(m,i)
 | 
			
		||||
      pmatplus[i] = m->matplus[i];
 | 
			
		||||
  }
 | 
			
		||||
  else Abort("Unrecognised print_counter mode: %d", countermode);
 | 
			
		||||
 | 
			
		||||
  switch (printmode) {
 | 
			
		||||
  case PRETTY:
 | 
			
		||||
    pu_print( m, m->cmax-1, f );
 | 
			
		||||
    if ( m->my_values[0] != -1 || m->my_string[0] ) {
 | 
			
		||||
      fprintf( f, "\n %s", m->my_string );
 | 
			
		||||
      for ( i = 0; m->my_values[i] != -1; i++ )
 | 
			
		||||
	fprintf( f, " %d", m->my_values[i] );
 | 
			
		||||
      fprintf( f, "\n" );
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
  case UGLY:
 | 
			
		||||
    if ( m->total_put == 1 ) write_header( m );
 | 
			
		||||
    uu_print( m, m->cmax-1 );
 | 
			
		||||
    return;
 | 
			
		||||
  case TeX:
 | 
			
		||||
    if ( m->total_put == 1 ) tex_header();
 | 
			
		||||
    tex_uprint( m, m->cmax-1 );
 | 
			
		||||
    if ( m->my_values[0] != -1 || m->my_string[0] )
 | 
			
		||||
      tex_mystuff( m );
 | 
			
		||||
    return;
 | 
			
		||||
  case NONE:
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  Abort( "Unrecognised print mode: %d", printmode );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void write_header(MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  for ( i = 0; i < FRAGMAX; i++ )
 | 
			
		||||
    printf( " %d", m->fragment[i] );
 | 
			
		||||
  printf( "\n %d", m->cmax );
 | 
			
		||||
  FORALLCON(m,i)
 | 
			
		||||
    printf( " %d %s", m->adicity[i], m->dcs[i] );
 | 
			
		||||
  printf( "\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void pu_print(MATRIX *m, int x, FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  if ( x < 0 ) {
 | 
			
		||||
    if ( m->fragment[BOX] ) pbox_print( m, f );
 | 
			
		||||
    else pC_print( m, f );
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    if ( pmatplus[x] == 1 || singlematrix )
 | 
			
		||||
      pu_print( m, x-1, f );
 | 
			
		||||
    fprintf( f, "\n\n %s table ", m->dcs[x] );
 | 
			
		||||
    u_number( m, x, f );
 | 
			
		||||
    switch( m->adicity[x] ) {
 | 
			
		||||
    case 0:
 | 
			
		||||
      nullprint( m, m->dcs[x], m->nulladic[x], f );
 | 
			
		||||
      break;
 | 
			
		||||
    case 1:
 | 
			
		||||
      monprint( m, m->dcs[x], 0, m->monadic[x], f );
 | 
			
		||||
      break;
 | 
			
		||||
    case 2:
 | 
			
		||||
      dyprint( m, m->dcs[x], 0, m->dyadic[x], "", 0, 0, f );
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void uu_print(MATRIX *m, int x)
 | 
			
		||||
{
 | 
			
		||||
  if ( x < 0 ) {
 | 
			
		||||
    if ( m->fragment[BOX] ) ubox_print( m );
 | 
			
		||||
    else uC_print( m );
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    if ( pmatplus[x] == 1 || singlematrix ) {
 | 
			
		||||
      if ( m->total_put > 1 ) printf( " -1\n" );
 | 
			
		||||
      uu_print( m, x-1 );
 | 
			
		||||
    }
 | 
			
		||||
    switch( m->adicity[x] ) {
 | 
			
		||||
    case 0: unullprint( m, m->nulladic[x] );
 | 
			
		||||
      break;
 | 
			
		||||
    case 1: umonprint( m, m->monadic[x] );
 | 
			
		||||
      break;
 | 
			
		||||
    case 2: udyprint( m, m->dyadic[x] );
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void pbox_print( MATRIX *m, FILE *f )
 | 
			
		||||
{
 | 
			
		||||
  if ( pboxno == 1 || singlematrix ) pC_print( m, f );
 | 
			
		||||
  fprintf( f, "\n\n Necessity " );
 | 
			
		||||
  box_number( m, f );
 | 
			
		||||
  monprint( m, "!", 0, m->box, f );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void ubox_print(MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  if ( pboxno == 1 || singlematrix ) {
 | 
			
		||||
    if ( m->total_put > 1 ) printf( " -1\n");
 | 
			
		||||
    uC_print( m );
 | 
			
		||||
  }
 | 
			
		||||
  umonprint( m, m->box );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void pC_print(MATRIX *m, FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  if ( pmatno == 1 || singlematrix ) pdesprint( m, f );
 | 
			
		||||
  fprintf( f, "\n\n Implication " );
 | 
			
		||||
  C_number( m, f );
 | 
			
		||||
  if ( m->fused )
 | 
			
		||||
    dyprint( m, "->", 0, m->C, "o", 0, m->fus, f );
 | 
			
		||||
  else
 | 
			
		||||
    dyprint( m, "->", 0, m->C, "", 0, 0, f );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void uC_print(MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  if ( pmatno == 1 || singlematrix ) {
 | 
			
		||||
    if ( m->total_put > 1 ) printf( " -1\n");
 | 
			
		||||
    udesprint( m );
 | 
			
		||||
  }
 | 
			
		||||
  udyprint( m, m->C );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void pdesprint(MATRIX *m, FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  if ( pdesno == 1 || singlematrix ) pordprint( m, f );
 | 
			
		||||
  fprintf( f, "\n\n\n Choice of truths " );
 | 
			
		||||
  des_number( m, f );
 | 
			
		||||
  monprint( m, "True", '-', m->designated, f );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void udesprint(MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  if ( pdesno == 1 || singlematrix ) {
 | 
			
		||||
    if ( m->total_put > 1 ) printf( " -1\n");
 | 
			
		||||
    uordprint( m );
 | 
			
		||||
  }
 | 
			
		||||
  umonprint( m, m->designated );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void pordprint(MATRIX *m, FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  if ( pordno == 1 || singlematrix ) {
 | 
			
		||||
    if ( m->fragment[NEG] ) pnegprint( m, f );
 | 
			
		||||
    else psizprint( m, f );
 | 
			
		||||
  }
 | 
			
		||||
  fprintf( f, "\n\n\n Order table " );
 | 
			
		||||
  ord_number( m, f );
 | 
			
		||||
  dyprint( m, "_\b<", '-', m->ord, "", 0, 0, f );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void uordprint(MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  if ( pordno == 1 || singlematrix ) {
 | 
			
		||||
    if ( m->total_put > 1 ) printf( " -1\n");
 | 
			
		||||
    if ( m->fragment[NEG] ) unegprint( m );
 | 
			
		||||
    else usizprint( m );
 | 
			
		||||
  }
 | 
			
		||||
  udyprint( m, m->ord );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void pnegprint(MATRIX *m, FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  if ( pnegno == 1 || singlematrix ) psizprint( m, f );
 | 
			
		||||
  fprintf( f, "\n\n\n Negation table " );
 | 
			
		||||
  neg_number( m, f );
 | 
			
		||||
  monprint( m, "~", 0, m->neg, f );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void unegprint(MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  if ( pnegno == 1 || singlematrix ) {
 | 
			
		||||
    if ( m->total_put > 1 ) printf( " -1\n");
 | 
			
		||||
    usizprint( m );
 | 
			
		||||
  }
 | 
			
		||||
  umonprint( m, m->neg );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void psizprint(MATRIX *m, FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  fprintf( f, "\n\n\n Size: %d\n", m->siz+1 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void usizprint(MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  printf( " %d\n", m->siz );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void neg_number(MATRIX *m, FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  fprintf( f, "%d.%d", m->siz+1, pnegno );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void ord_number(MATRIX *m, FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  if ( !m->fragment[NEG] ) fprintf( f, "%d", m->siz+1 );
 | 
			
		||||
  else neg_number( m, f );
 | 
			
		||||
  fprintf( f, ".%d", pordno );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void des_number(MATRIX *m, FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  ord_number( m, f );
 | 
			
		||||
  fprintf( f, ".%d", pdesno );
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void C_number(MATRIX *m, FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  des_number( m, f );
 | 
			
		||||
  fprintf( f, ".%d", pmatno );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void box_number(MATRIX *m, FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  C_number( m, f );
 | 
			
		||||
  fprintf( f, ".%d", pboxno );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void u_number(MATRIX *m, int x, FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  if ( !x ) {
 | 
			
		||||
    if ( m->fragment[BOX] ) box_number( m, f );
 | 
			
		||||
    else C_number( m, f );
 | 
			
		||||
  }
 | 
			
		||||
  else u_number( m, x-1, f );
 | 
			
		||||
  fprintf( f, ".%d", pmatplus[x] );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void nullprint(MATRIX *m, char *s, int x, FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  fprintf( f, "   %s = %d\n", s, x );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void unullprint(MATRIX *m, int x)
 | 
			
		||||
{
 | 
			
		||||
  printf( "%d\n", x );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void monprint(MATRIX *m, char *s, char c, int arr[], FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  int i, offset;
 | 
			
		||||
 | 
			
		||||
  fprintf( f, "\n\n     " );
 | 
			
		||||
  for ( offset = 0; s[offset]; offset++ ) fprintf( f, " " );
 | 
			
		||||
  if ( offset > 1 ) fprintf(f, "  ");
 | 
			
		||||
  fprintf( f, "a |" );
 | 
			
		||||
  FORALL(m,i) fprintf( f, " %x", i );
 | 
			
		||||
  fprintf( f, "\n     " );
 | 
			
		||||
  for ( i = 0; i < offset; i++ ) fprintf( f, "-" );
 | 
			
		||||
  if ( offset > 1 ) fprintf( f, "--" );
 | 
			
		||||
  fprintf( f, "--+" );
 | 
			
		||||
  FORALL(m,i) fprintf( f, "--" );
 | 
			
		||||
  fprintf( f, "\n     " );
 | 
			
		||||
  if ( offset > 1 ) fprintf( f, "%s(a) |", s );
 | 
			
		||||
  else fprintf( f, "%sa |", s );
 | 
			
		||||
  FORALL(m,i)
 | 
			
		||||
    if ( c == '-' ) fprintf( f, " %c", arr[i]? '+': '-' );
 | 
			
		||||
    else fprintf( f, " %x", arr[i] );
 | 
			
		||||
  fprintf( f, "\n" );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void umonprint(MATRIX *m, int arr[])
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  FORALL(m,i)
 | 
			
		||||
    printf( " %d", arr[i] );
 | 
			
		||||
  printf( "\n" );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void dyprint(MATRIX *m, char *s1, char c, int arr[][SZ], 
 | 
			
		||||
		char *s2, char d, int darr[][SZ], FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  int i, j, offset = 0;
 | 
			
		||||
  
 | 
			
		||||
  for ( i = 0; s1[i]; i++ )
 | 
			
		||||
    if ( s1[i] == '\b' ) offset--; else offset++;
 | 
			
		||||
  fprintf( f, "\n\n      %s |", s1 );
 | 
			
		||||
  FORALL(m,i) fprintf( f, " %x", i );
 | 
			
		||||
  if ( *s2 ) {
 | 
			
		||||
    fprintf( f, "%15s |", s2 );
 | 
			
		||||
    FORALL(m,i) fprintf( f, " %x", i );
 | 
			
		||||
  }
 | 
			
		||||
  fprintf( f, "\n     " );
 | 
			
		||||
  for ( i = 1; i < offset; i++ ) fprintf( f, "-" );
 | 
			
		||||
  fprintf( f, "---+" );
 | 
			
		||||
  FORALL(m,i) fprintf( f, "--" );
 | 
			
		||||
  if ( *s2 ) {
 | 
			
		||||
    for ( i = 14; i; i-- )
 | 
			
		||||
      fprintf( f, (i > strlen(s2)? " ": "-") ); 
 | 
			
		||||
    fprintf( f, "--+" );
 | 
			
		||||
    FORALL(m,i) fprintf( f, "--" );
 | 
			
		||||
  }
 | 
			
		||||
  FORALL(m,i) {
 | 
			
		||||
    fprintf( f, "\n      " );
 | 
			
		||||
    for ( j = 1; j < offset; j++ ) fprintf( f, " " );
 | 
			
		||||
    fprintf( f, "%x |", i );
 | 
			
		||||
    FORALL(m,j)
 | 
			
		||||
      if ( c == '-' )
 | 
			
		||||
	fprintf( f, " %c", arr[i][j]? '+': '-' );
 | 
			
		||||
      else fprintf( f, " %x", arr[i][j] );
 | 
			
		||||
    if ( *s2 ) {
 | 
			
		||||
      fprintf( f, "%15x |", i );
 | 
			
		||||
      FORALL(m,j)
 | 
			
		||||
	if ( d == '-' )
 | 
			
		||||
	  fprintf( f, " %c", darr[i][j]? '+': '-' );
 | 
			
		||||
	else fprintf( f, " %x", darr[i][j] );
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  fprintf( f, "\n" );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void udyprint(MATRIX *m, int arr[][SZ])
 | 
			
		||||
{
 | 
			
		||||
  int i, j;
 | 
			
		||||
 | 
			
		||||
  FORALL(m,i) FORALL(m,j)
 | 
			
		||||
    printf( " %d", arr[i][j] );
 | 
			
		||||
  printf( "\n" );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void tex_header()
 | 
			
		||||
{
 | 
			
		||||
  printf( "\\documentstyle{article}\n");
 | 
			
		||||
  printf( "\\oddsidemargin=15mm\n");
 | 
			
		||||
  printf( "\\evensidemargin=15mm\n");
 | 
			
		||||
  printf( "\\textwidth=160mm\n");
 | 
			
		||||
  printf( "\\topmargin=0mm\n");
 | 
			
		||||
  printf( "\\textheight=250mm\n");
 | 
			
		||||
  printf( "\\begin{document}\n\n");
 | 
			
		||||
  printf( "\\pagestyle{empty}\n");
 | 
			
		||||
  printf( "\\newcommand{\\C}{\\rightarrow}\n");
 | 
			
		||||
  printf( "\\newcommand{\\N}{\\neg}\n");
 | 
			
		||||
  printf( "\\newcommand{\\A}{\\mbox{$\\,${\\footnotesize");
 | 
			
		||||
  printf( " $\\vee$}$\\,$}}\n");
 | 
			
		||||
  printf( "\\newcommand{\\fs}{\\circ}\n");
 | 
			
		||||
  printf( "\\newcommand{\\hugeskip}{\\vspace{10mm}}\n");
 | 
			
		||||
  printf( "\\setlength{\\tabcolsep}{1.5mm}\n\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void tex_mystuff(MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  printf( "\n%s", m->my_string);
 | 
			
		||||
  for ( i = 0; m->my_values[i] != -1; i++ )
 | 
			
		||||
    printf( " \\ %d", m->my_values[i]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void texchar(char c)
 | 
			
		||||
{
 | 
			
		||||
  switch(c) {
 | 
			
		||||
  case '&':
 | 
			
		||||
  case '%':
 | 
			
		||||
  case '$':
 | 
			
		||||
  case '#':
 | 
			
		||||
  case 'v':
 | 
			
		||||
  case '^':
 | 
			
		||||
  case '_':
 | 
			
		||||
  case '{':
 | 
			
		||||
  case '}': printf( "\\%c", c ); return;
 | 
			
		||||
  case '~': printf( "$\\N$" ); return;
 | 
			
		||||
  case '>': printf( "$\\C$" ); return;
 | 
			
		||||
  case '<': printf( "$\\leq$" ); return;
 | 
			
		||||
  case 'o': printf( "$\\fs$" ); return;
 | 
			
		||||
  case '-': printf( "$-$" ); return;
 | 
			
		||||
  case '!': printf( "$\\Box$" ); return;
 | 
			
		||||
  case '?': printf( "$\\Diamond$" ); return;
 | 
			
		||||
  }
 | 
			
		||||
  putchar( c );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void texstring(char *s)
 | 
			
		||||
{
 | 
			
		||||
  do texchar( *s );
 | 
			
		||||
  while ( *s++ );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void tex_uprint(MATRIX *m, int x)
 | 
			
		||||
{
 | 
			
		||||
  if ( x < 0 ) {
 | 
			
		||||
    if ( m->fragment[BOX] ) tex_boxprint( m );
 | 
			
		||||
    else tex_Cprint( m );
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    if ( pmatplus[x] == 1 || singlematrix )
 | 
			
		||||
      tex_uprint( m, x-1 );
 | 
			
		||||
    printf(
 | 
			
		||||
	   "\n\n\\hugeskip\\noindent\\parbox[t]{160mm}{");
 | 
			
		||||
    texstring( m->dcs[x] );
 | 
			
		||||
    printf( " table " );
 | 
			
		||||
    u_number( m, x, stdout );
 | 
			
		||||
    switch( m->adicity[x] ) {
 | 
			
		||||
    case 0: 
 | 
			
		||||
      tex_nullprint( m, m->dcs[x], m->nulladic[x] );
 | 
			
		||||
      break;
 | 
			
		||||
    case 1:
 | 
			
		||||
      tex_monprint( m, m->dcs[x], ' ', m->monadic[x] );
 | 
			
		||||
      break;
 | 
			
		||||
    case 2:
 | 
			
		||||
      tex_dyprint( m, m->dcs[x], 0, m->dyadic[x], "", 0, 0 );
 | 
			
		||||
    }
 | 
			
		||||
    printf( "}" );  
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void tex_boxprint(MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  if ( pboxno == 1 || singlematrix ) tex_Cprint( m );
 | 
			
		||||
  printf( 
 | 
			
		||||
	 "\n\n\\hugeskip\\noindent\\parbox[t]{160mm}{Necessity " );
 | 
			
		||||
  box_number( m, stdout );
 | 
			
		||||
  tex_monprint( m, "!", ' ', m->box );
 | 
			
		||||
  printf( "}" );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void tex_Cprint(MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  if ( pmatno == 1 || singlematrix ) tex_desprint( m );
 | 
			
		||||
  printf( 
 | 
			
		||||
	 "\n\n\\hugeskip\\noindent\\parbox[t]{160mm}{Implication " );
 | 
			
		||||
  C_number( m, stdout );
 | 
			
		||||
  if ( m->fused )
 | 
			
		||||
    tex_dyprint( m, ">", 0, m->C, "o", 0, m->fus );
 | 
			
		||||
  else
 | 
			
		||||
    tex_dyprint( m, ">", 0, m->C, "", 0, 0 );
 | 
			
		||||
  printf( "}" );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void tex_desprint(MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  if ( pdesno == 1 || singlematrix ) tex_ordprint( m );
 | 
			
		||||
  printf("\n\n\\hugeskip\\noindent\\parbox[t]{160mm}{Choice of truths " );
 | 
			
		||||
  des_number( m, stdout );
 | 
			
		||||
  tex_monprint( m, "True", '-', m->designated );
 | 
			
		||||
  printf( "}" );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void tex_ordprint(MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  if ( pordno == 1 || singlematrix ) {
 | 
			
		||||
    if ( m->fragment[NEG] ) tex_negprint( m );
 | 
			
		||||
    else tex_sizprint( m );
 | 
			
		||||
  }
 | 
			
		||||
  printf("\n\n\\hugeskip\\noindent\\parbox[t]{160mm}{Order table " );
 | 
			
		||||
  ord_number( m, stdout );
 | 
			
		||||
  tex_dyprint( m, "<", '-', m->ord, "", 0, 0 );
 | 
			
		||||
  printf( "}" );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void tex_negprint(MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  if ( pnegno == 1 || singlematrix ) tex_sizprint( m );
 | 
			
		||||
  printf("\n\n\\hugeskip\\noindent\\parbox[t]{160mm}{Negation table " );
 | 
			
		||||
  neg_number( m, stdout );
 | 
			
		||||
  tex_monprint( m, "~", ' ', m->neg );
 | 
			
		||||
  printf( "}" );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void tex_sizprint(MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  if ( m->total_put > 1 ) printf( "\n\n\\newpage");
 | 
			
		||||
  printf( "\\noindent Size: %d", m->siz+1 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void tex_nullprint(MATRIX *m, char *s, int x)
 | 
			
		||||
{
 | 
			
		||||
  printf( " \\ ");
 | 
			
		||||
  texstring( s );
 | 
			
		||||
  printf( " = %d", x );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void tex_monprint(MATRIX *m, char *s, char c, int arr[])
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  printf("\\\\[3mm]\n\\hspace*{5mm}\\begin{tabular}{r|" );
 | 
			
		||||
  FORALL(m,i) putchar( 'c' );
 | 
			
		||||
  printf( "}\na &");
 | 
			
		||||
  FORALL(m,i) {
 | 
			
		||||
    printf( " %x ", i );
 | 
			
		||||
    if ( i < m->siz ) putchar( '&' );
 | 
			
		||||
  }
 | 
			
		||||
  printf( "\\\\\\hline\n");
 | 
			
		||||
  texstring( s );
 | 
			
		||||
  printf("(a)");
 | 
			
		||||
  printf( " & ");
 | 
			
		||||
  FORALL(m,i) {
 | 
			
		||||
    if ( c == '-' )
 | 
			
		||||
      texchar( arr[i]? '+': '-' );
 | 
			
		||||
    else printf( " %x ", arr[i] );
 | 
			
		||||
    if ( i < m->siz ) putchar( '&' );
 | 
			
		||||
    else printf( "\\\\\n");
 | 
			
		||||
  }
 | 
			
		||||
  printf( "\\end{tabular}");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void tex_dyprint(MATRIX *m, char *s1, char c, int arr[][SZ],
 | 
			
		||||
			char *s2, char d, int darr[][SZ])
 | 
			
		||||
{
 | 
			
		||||
  printf( "\\\\[3mm]\n" );
 | 
			
		||||
  tex_dymatprint( m, 5, s1, c, arr );
 | 
			
		||||
  if ( *s2 ) tex_dymatprint( m, 10, s2, d, darr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void tex_dymatprint(MATRIX *m, int offset, char *s, char c, int arr[][SZ])
 | 
			
		||||
{
 | 
			
		||||
  int i, j;
 | 
			
		||||
 | 
			
		||||
  printf( "\\hspace*{%dmm}\\begin{tabular}{r|", offset );
 | 
			
		||||
  FORALL(m,i) putchar( 'c' );
 | 
			
		||||
  printf( "}\n");
 | 
			
		||||
  texstring( s );
 | 
			
		||||
  printf( " &");
 | 
			
		||||
  FORALL(m,i) {
 | 
			
		||||
    printf( " %x ", i );
 | 
			
		||||
		if ( i < m->siz ) putchar( '&' );
 | 
			
		||||
  }
 | 
			
		||||
  printf( "\\\\\\hline\n");
 | 
			
		||||
  
 | 
			
		||||
  FORALL(m,i) {
 | 
			
		||||
    printf( "%x &", i );
 | 
			
		||||
    FORALL(m,j) {
 | 
			
		||||
      if ( c == '-' )
 | 
			
		||||
	texchar( arr[i][j]? '+': '-' );
 | 
			
		||||
      else printf( " %x ", arr[i][j] );
 | 
			
		||||
      if ( j < m->siz ) putchar( '&' );
 | 
			
		||||
      else printf( "\\\\\n");
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  printf( "\\end{tabular}");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void print_related(MATRIX *m1, MATRIX *m2, char *relname)
 | 
			
		||||
{
 | 
			
		||||
  printf("%s m%d m%d\n", relname, m1->total_got, m2->total_got);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										583
									
								
								src/axiom_tests.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										583
									
								
								src/axiom_tests.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,583 @@
 | 
			
		|||
 | 
			
		||||
#include "MaGIC.h"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	This file contains the code for testing each axiom. There are 
 | 
			
		||||
*	four types of case. First are axioms which do not depend on the
 | 
			
		||||
*	contents of the implication, or box matrices at all. These give 
 | 
			
		||||
*	rise to 0-refutations. That is, they are either true or false 
 | 
			
		||||
*	of the extensional setup. They can be tested before entry to the 
 | 
			
		||||
*	search routine. An example is the law of the excluded middle
 | 
			
		||||
*	A v ~A which depends only on the lattice, the negation operation 
 | 
			
		||||
*	and the choice of designated values.
 | 
			
		||||
*
 | 
			
		||||
*	The second group consists of axioms such as A & (A->B) -> B, 
 | 
			
		||||
*	which require one reference to the implication or box matrix.
 | 
			
		||||
*	These are tested at the stage of setting up the search space
 | 
			
		||||
*	and secured by taking out the impossible values (such as any x
 | 
			
		||||
*	for cell [A->B] such that not A&x ord B).
 | 
			
		||||
*
 | 
			
		||||
*	The third group consists of axioms which require a small number 
 | 
			
		||||
*	of matrix references. `Small' means 2 in MaGIC at present. An 
 | 
			
		||||
*	example is the S4 axiom !A -> !!A, any failure of which requires 
 | 
			
		||||
*	values x for !A and y for !x such that not x ord y.
 | 
			
		||||
*
 | 
			
		||||
*	Finally, there are a few cases in which multiple matrix entries 
 | 
			
		||||
*	are involved. These are treated by `lazy constraint generation' 
 | 
			
		||||
*	at the testing stage after candidate matrices have been found.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	GROUP 0 (0-refutations)
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
boolean f_arrow_t()		/***   f -> t   ***/
 | 
			
		||||
{
 | 
			
		||||
  return ( ord[N[des]][des] );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
boolean Exmid()			/***   a v ~a   ***/
 | 
			
		||||
{
 | 
			
		||||
  int a;
 | 
			
		||||
 | 
			
		||||
  FORALL(a)
 | 
			
		||||
    if ( !desig[A[a][N[a]]]) return false;
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
boolean Boolalg()		/***   a&~a -> b   ***/
 | 
			
		||||
{
 | 
			
		||||
  int a;
 | 
			
		||||
 | 
			
		||||
  FORALL(a)
 | 
			
		||||
    if ( A[a][N[a]] != siz ) return false;
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
boolean SemiBool()		/***   a&~a -> bv~b   ***/
 | 
			
		||||
{
 | 
			
		||||
  int a, b;
 | 
			
		||||
 | 
			
		||||
  FORALL(a) FORALL(b)
 | 
			
		||||
    if ( !ord[K[a][N[a]]][A[b][N[b]]] ) return false;
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
boolean paradox()		/***   des = T   ***/
 | 
			
		||||
{
 | 
			
		||||
  int a;
 | 
			
		||||
 | 
			
		||||
  FORALL(a) if ( !ord[a][des] ) return false;
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**********************************************************************/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	GROUP 1 (1-refutations)
 | 
			
		||||
*
 | 
			
		||||
*	The parameter here is the vector of possible-value sets.
 | 
			
		||||
*	The general form of the procedure is
 | 
			
		||||
*		for each relevant possible-value set s do
 | 
			
		||||
*			for each impossible value x of s do
 | 
			
		||||
*				remove x from s
 | 
			
		||||
*			end for
 | 
			
		||||
*		end for
 | 
			
		||||
*	The vector is indexed by impindex and boxindex. Impindex[x][y]
 | 
			
		||||
*	picks out the offset of the vector entry corresponding to the 
 | 
			
		||||
*	implication [x->y] while boxindex[x] picks out that corresponding 
 | 
			
		||||
*	to [!x]. REMOVE is a macro for taking a value out of a set.
 | 
			
		||||
*
 | 
			
		||||
*	Note that no value needs to be returned by these operations, as 
 | 
			
		||||
*	only the side effect of diminishing the possible-value sets is 
 | 
			
		||||
*	intended.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void E_assertion(unsigned info[])	/***   t->a -> a   ***/
 | 
			
		||||
{
 | 
			
		||||
  int a, b;
 | 
			
		||||
 | 
			
		||||
  FORALL(b) if ( desig[b] )
 | 
			
		||||
    FORALL(a)
 | 
			
		||||
      info[impindex[b][a]] &= less_than[a];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void contraction(unsigned info[])	/***  (a->.a->b) ->. a->b  ***/
 | 
			
		||||
{
 | 
			
		||||
  int a, b, c;
 | 
			
		||||
 | 
			
		||||
  if ( theJob->f_lat )	Wstar(info);
 | 
			
		||||
  if ( theJob->f_n )	Reductio(info);
 | 
			
		||||
 | 
			
		||||
  FORALL(a) FORALL(b) if ( !ord[a][b] )
 | 
			
		||||
    FORALL(c) if ( ord[a][c] )
 | 
			
		||||
      REMOVE(c,info[impindex[a][b]]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void Wstar(unsigned info[])	/***   a & (a->b) -> b   ***/
 | 
			
		||||
{
 | 
			
		||||
  int a, b, c;
 | 
			
		||||
 | 
			
		||||
  FORALL(a) FORALL(b) FORALL(c)
 | 
			
		||||
    if ( !ord[K[a][c]][b] )
 | 
			
		||||
      REMOVE(c,info[impindex[a][b]]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void Reductio(unsigned info[])	/***   a->~a -> ~a   ***/
 | 
			
		||||
{
 | 
			
		||||
  int a, b;
 | 
			
		||||
 | 
			
		||||
  if ( theJob->f_lat ) Exmid();
 | 
			
		||||
  FORALL(a) FORALL(b)
 | 
			
		||||
    if ( !ord[b][N[a]] )
 | 
			
		||||
      REMOVE(b,info[impindex[a][N[a]]]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void assertion(unsigned info[])	/***   0->a = T,   t->a = a   ***/
 | 
			
		||||
{
 | 
			
		||||
  int a, b;
 | 
			
		||||
 | 
			
		||||
  FORALL(a) FORALL(b) {
 | 
			
		||||
    if ( b < siz ) REMOVE(b,info[impindex[0][a]]);
 | 
			
		||||
    if ( b != a ) REMOVE(b,info[impindex[des][a]]);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void ata(unsigned info[])	/***   a ->. t->a   ***/
 | 
			
		||||
{
 | 
			
		||||
  int a;
 | 
			
		||||
 | 
			
		||||
  FORALL(a)
 | 
			
		||||
    info[impindex[des][a]] &= greater_than[a];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void TaT(unsigned info[])		/***   T ->. a->T   ***/
 | 
			
		||||
{
 | 
			
		||||
  int a, b;
 | 
			
		||||
 | 
			
		||||
  FORALL(a) if ( !ord[a][siz] ) {
 | 
			
		||||
    *info = 0;
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  FORALL(b) if ( b < siz )
 | 
			
		||||
    FORALL(a)
 | 
			
		||||
      REMOVE(b,info[impindex[a][siz]]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void mingle(unsigned info[])		/***   a ->. a->a   ***/
 | 
			
		||||
{
 | 
			
		||||
  int a;
 | 
			
		||||
 | 
			
		||||
  FORALL(a)
 | 
			
		||||
    info[impindex[a][a]] &= greater_than[a];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void t_atomic(unsigned info[])		/***   p v (p -> q)   ***/
 | 
			
		||||
{
 | 
			
		||||
  int a, b, c;
 | 
			
		||||
 | 
			
		||||
  FORALL(a) FORALL(c) if ( !desig[A[a][c]] ) 
 | 
			
		||||
    FORALL(b)
 | 
			
		||||
      REMOVE(c,info[impindex[a][b]]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void FF_T(unsigned info[])		/***   T ->. F -> F   ***/
 | 
			
		||||
{
 | 
			
		||||
  int a, b;
 | 
			
		||||
 | 
			
		||||
  FORALL(a)
 | 
			
		||||
    if ( !ord[0][a] || !ord[a][siz] ) *info = 0;
 | 
			
		||||
 | 
			
		||||
  FORALL(b) if ( b < siz )
 | 
			
		||||
    FORALL(a) 
 | 
			
		||||
      REMOVE(b,info[impindex[0][a]]);
 | 
			
		||||
 | 
			
		||||
  if ( F_N || theJob->axiom[AxB] || theJob->axiom[AxB2] )
 | 
			
		||||
    FORALL(a) FORALL(b)
 | 
			
		||||
      if ( b < siz )
 | 
			
		||||
	REMOVE(b,info[impindex[a][siz]]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void PARADOX(unsigned info[])		/***   a ->. b->a   ***/
 | 
			
		||||
{
 | 
			
		||||
  int a, b;
 | 
			
		||||
 | 
			
		||||
  if ( !paradox() ) *info = 0;
 | 
			
		||||
  FORALL(a)  FORALL(b)
 | 
			
		||||
    info[impindex[a][b]] &= greater_than[b];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void RWX(unsigned info[])		/*** If LEM, a+1 & (a+1->0) = 0 ***/
 | 
			
		||||
{
 | 
			
		||||
  int a, b;
 | 
			
		||||
 | 
			
		||||
  FORALL(a)
 | 
			
		||||
    if ( !desig[A[a][N[a]]] ) return;
 | 
			
		||||
 | 
			
		||||
  FORALL(a) if ( a )
 | 
			
		||||
    FORALL(b) if ( K[a][b] )
 | 
			
		||||
      REMOVE(b,info[impindex[a][0]]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void necessity(unsigned info[])		/* !a implies a */
 | 
			
		||||
{
 | 
			
		||||
  int a, x;
 | 
			
		||||
 | 
			
		||||
  FORALL(a)
 | 
			
		||||
    FORALL(x) if ( !ord[x][a] )
 | 
			
		||||
      REMOVE(x,info[boxindex[a]]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void necessitation(unsigned info[])	/* des(a) ==> des(!a) */
 | 
			
		||||
{
 | 
			
		||||
  int a, x;
 | 
			
		||||
 | 
			
		||||
  FORALL(a) if ( desig[a] )
 | 
			
		||||
    FORALL(x) if ( !desig[x] )
 | 
			
		||||
      REMOVE(x,info[boxindex[a]]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void NKI_test(unsigned info[])		/* des(a) ==> !b implies a */
 | 
			
		||||
{
 | 
			
		||||
  int a, b, x;
 | 
			
		||||
 | 
			
		||||
  FORALL(a) if ( desig[a] )
 | 
			
		||||
    FORALL(x) if ( !ord[x][a] )
 | 
			
		||||
      FORALL(b)
 | 
			
		||||
	REMOVE(x,info[boxindex[b]]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	This affixing check takes considerable time, but pays.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void set_prefix(unsigned info[])
 | 
			
		||||
{
 | 
			
		||||
  int i, j, k;
 | 
			
		||||
 | 
			
		||||
  FORALL(i)  FORALL(j)
 | 
			
		||||
    for ( k = j+1; k <=siz; k++ )
 | 
			
		||||
      if ( ord[j][k] && !( F_N && j < N[k] ))
 | 
			
		||||
	if ( !(Greater_than[j] & Less_than[k]) )
 | 
			
		||||
	  squeeze( info, i, j, i, k );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void set_suffix(unsigned info[])
 | 
			
		||||
{
 | 
			
		||||
  int i, j, k;
 | 
			
		||||
 | 
			
		||||
  FORALL(i)  FORALL(j)
 | 
			
		||||
    for ( k = 0; k < i; k++ )
 | 
			
		||||
      if ( ord[k][i] && !( F_N && i < N[k] ))
 | 
			
		||||
	if ( !(Greater_than[k] & Less_than[i]) )
 | 
			
		||||
	  squeeze( info, i, j, k, j );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Squeeze, a subroutine of the above, squeezes out of the
 | 
			
		||||
*	search space any values which are incompatible with this
 | 
			
		||||
*	particular case of affixing: ord[ a->b ][ c->d ].
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void squeeze(unsigned info[], int a, int b, int c, int d)
 | 
			
		||||
{ 
 | 
			
		||||
  int i;
 | 
			
		||||
  int k, m;
 | 
			
		||||
 | 
			
		||||
  k = impindex[a][b]; m = impindex[c][d];
 | 
			
		||||
 | 
			
		||||
  FORALL(i) {
 | 
			
		||||
    if ( IN(i,info[k]) ) {
 | 
			
		||||
      if ( !(greater_than[i] & info[m]) )
 | 
			
		||||
	REMOVE(i,info[impindex[a][b]]);
 | 
			
		||||
    }
 | 
			
		||||
    if ( IN(i,info[m]) ) {
 | 
			
		||||
      if ( !(less_than[i] & info[k]) )
 | 
			
		||||
	REMOVE(i,info[impindex[c][d]]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**********************************************************************/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	GROUP 2 (2-refutations)
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void pretest_prefix()
 | 
			
		||||
{
 | 
			
		||||
  int i, j, k;
 | 
			
		||||
 | 
			
		||||
  FORALL(i) FORALL(j) if ( !( F_N && i < N[j] ))
 | 
			
		||||
    for ( k = siz; k > j; k-- ) if ( ord[j][k] )
 | 
			
		||||
      if ( !(Greater_than[j] & Less_than[k]) )
 | 
			
		||||
	affix_case( i, j, i, k );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void pretest_suffix()
 | 
			
		||||
{
 | 
			
		||||
  int i, j, k;
 | 
			
		||||
 | 
			
		||||
  FORALL(i) FORALL(j) if ( !( F_N && i < N[j] ))
 | 
			
		||||
    for ( k = 0; k < i; k++ ) if ( ord[k][i] )
 | 
			
		||||
      if ( !(Greater_than[k] & Less_than[i]) )
 | 
			
		||||
	affix_case( i, j, k, j );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void test_S4axiom()
 | 
			
		||||
{
 | 
			
		||||
  int a, x, y;
 | 
			
		||||
 | 
			
		||||
  FORALL(x)
 | 
			
		||||
    FORALL(y) if ( !ord[x][y] )
 | 
			
		||||
      FORALL(a)
 | 
			
		||||
	new_two_ref( boxindex[a], x, boxindex[x], y );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void test_S5axiom()
 | 
			
		||||
{
 | 
			
		||||
  int a, x, y;
 | 
			
		||||
 | 
			
		||||
  FORALL(a)
 | 
			
		||||
    FORALL(x) if ( !ord[a][x] )
 | 
			
		||||
      FORALL(y)
 | 
			
		||||
	new_two_ref( boxindex[N[a]], y, boxindex[N[y]], x );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void test_Daxiom()
 | 
			
		||||
{
 | 
			
		||||
  int a, x, y;
 | 
			
		||||
 | 
			
		||||
  FORALL(x)
 | 
			
		||||
    FORALL(y) if ( !ord[x][N[y]] )
 | 
			
		||||
      FORALL(a)
 | 
			
		||||
	new_two_ref( boxindex[a], x, boxindex[N[a]], y );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void test_NK()
 | 
			
		||||
{
 | 
			
		||||
  int a, b, x, y;
 | 
			
		||||
 | 
			
		||||
  FORALL(a)
 | 
			
		||||
    FORALL(x) if ( !ord[a][x] )
 | 
			
		||||
      FORALL(b)
 | 
			
		||||
	FORALL(y)
 | 
			
		||||
	new_two_ref( boxindex[b], y, impindex[y][a], x );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**********************************************************************/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	GROUP 3 (many-refutations)
 | 
			
		||||
*
 | 
			
		||||
*	The general form of the axiom test is
 | 
			
		||||
*		for each assignment of values to the variables
 | 
			
		||||
*			if the axiom fails
 | 
			
		||||
*				call Ref with each cell used
 | 
			
		||||
*				return false
 | 
			
		||||
*			endif
 | 
			
		||||
*		endfor
 | 
			
		||||
*		return true
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
boolean test_mslat(trs T)
 | 
			
		||||
{
 | 
			
		||||
  int a, b, c;
 | 
			
		||||
 | 
			
		||||
  FORaLL(b)
 | 
			
		||||
    for ( c = siz-1; c > b; c-- )
 | 
			
		||||
      if ( !ord[b][c] )
 | 
			
		||||
	FORaLL(a) 
 | 
			
		||||
	  if ( K[C[a][b]][C[a][c]] != C[a][K[b][c]] ) {
 | 
			
		||||
	    Ref( impindex[a][b], T );
 | 
			
		||||
	    Ref( impindex[a][c], T );
 | 
			
		||||
	    Ref( impindex[a][K[b][c]], T );
 | 
			
		||||
	    return false;
 | 
			
		||||
	  }
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
boolean test_jslat(trs T)
 | 
			
		||||
{
 | 
			
		||||
  int a, b, c;
 | 
			
		||||
 | 
			
		||||
  FORaLL(a)
 | 
			
		||||
    for ( b = siz-1; b > a; b-- )
 | 
			
		||||
      if ( !ord[a][b] )
 | 
			
		||||
	FORaLL(c) 
 | 
			
		||||
	  if ( K[C[a][c]][C[b][c]] != C[A[a][b]][c] ) {
 | 
			
		||||
	    Ref( impindex[a][c], T );
 | 
			
		||||
	    Ref( impindex[b][c], T );
 | 
			
		||||
	    Ref( impindex[A[a][b]][c], T );
 | 
			
		||||
	    return false;
 | 
			
		||||
	  }
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
boolean Btest(trs T)
 | 
			
		||||
{
 | 
			
		||||
  int a, b, c;
 | 
			
		||||
 | 
			
		||||
  FORaLL(a) FORaLL(b) FORaLL(c)
 | 
			
		||||
    if ( !ord[C[a][b]] [C[C[c][a]][C[c][b]]] ) {
 | 
			
		||||
      Ref(impindex[a][b], T);
 | 
			
		||||
      Ref(impindex[c][a], T);
 | 
			
		||||
      Ref(impindex[c][b], T);
 | 
			
		||||
      Ref(impindex[C[c][a]][C[c][b]], T);
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**********************************/
 | 
			
		||||
 | 
			
		||||
boolean B2test(trs T)
 | 
			
		||||
{
 | 
			
		||||
  int a, b, c;
 | 
			
		||||
 | 
			
		||||
  FORaLL(a) FORaLL(b) FORaLL(c)
 | 
			
		||||
    if ( !ord[C[a][b]] [C[C[b][c]][C[a][c]]] ) {
 | 
			
		||||
      Ref(impindex[a][b], T);
 | 
			
		||||
      Ref(impindex[b][c], T);
 | 
			
		||||
      Ref(impindex[a][c], T);
 | 
			
		||||
      Ref(impindex[C[b][c]][C[a][c]], T);
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**********************************/
 | 
			
		||||
 | 
			
		||||
boolean Stest(trs T)
 | 
			
		||||
{
 | 
			
		||||
  int a, b, c;
 | 
			
		||||
 | 
			
		||||
  FORaLL(a) FORaLL(b) FORaLL(c)
 | 
			
		||||
    if ( !ord[C[a][C[b][c]]] [C[C[a][b]][C[a][c]]] ) {
 | 
			
		||||
      Ref(impindex[a][b], T);
 | 
			
		||||
      Ref(impindex[b][c], T);
 | 
			
		||||
      Ref(impindex[a][c], T);
 | 
			
		||||
      Ref(impindex[a][C[b][c]], T);
 | 
			
		||||
      Ref(impindex[C[a][b]][C[a][c]], T);
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*********************************/
 | 
			
		||||
 | 
			
		||||
boolean Ctest(trs T)
 | 
			
		||||
{
 | 
			
		||||
  int a, b, c;
 | 
			
		||||
 | 
			
		||||
  FORaLL(a) FORaLL(c) if ( a < c )
 | 
			
		||||
    FORaLL(b)
 | 
			
		||||
      if ( C[c][C[a][b]] != C[a][C[c][b]] ) {
 | 
			
		||||
	Ref(impindex[a][b], T);
 | 
			
		||||
	Ref(impindex[c][b], T);
 | 
			
		||||
	Ref(impindex[a][C[c][b]], T);
 | 
			
		||||
	Ref(impindex[c][C[a][b]], T);
 | 
			
		||||
	return false;
 | 
			
		||||
      }
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*********************************/
 | 
			
		||||
 | 
			
		||||
boolean WBtest(trs T)
 | 
			
		||||
{
 | 
			
		||||
  int a, b, c;
 | 
			
		||||
 | 
			
		||||
  FORaLL(a) FORaLL(b) FORaLL(c)
 | 
			
		||||
    if ( !ord[K[C[a][b]][C[b][c]]] [C[a][c]] ) {
 | 
			
		||||
      Ref(impindex[a][b], T);
 | 
			
		||||
      Ref(impindex[b][c], T);
 | 
			
		||||
      Ref(impindex[a][c], T);
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*********************************/
 | 
			
		||||
 | 
			
		||||
boolean NecImpDist(trs T)
 | 
			
		||||
{
 | 
			
		||||
  int a, b;
 | 
			
		||||
 | 
			
		||||
  FORaLL(a) FORaLL(b)
 | 
			
		||||
    if ( !ord[box[C[a][b]]] [C[box[a]][box[b]]] ) {
 | 
			
		||||
      Ref(impindex[a][b], T);
 | 
			
		||||
      Ref(impindex[box[a]][box[b]], T);
 | 
			
		||||
      Ref(boxindex[a], T);
 | 
			
		||||
      Ref(boxindex[b], T);
 | 
			
		||||
      Ref(boxindex[C[a][b]], T);
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*********************************/
 | 
			
		||||
 | 
			
		||||
boolean NecAdj(trs T)
 | 
			
		||||
{
 | 
			
		||||
  int a, b;
 | 
			
		||||
 | 
			
		||||
  FORaLL(a) FORaLL(b)
 | 
			
		||||
    if ( !ord[K[box[a]][box[b]]] [box[K[a][b]]] ) {
 | 
			
		||||
      Ref(boxindex[a], T);
 | 
			
		||||
      Ref(boxindex[b], T);
 | 
			
		||||
      Ref(boxindex[K[a][b]], T);
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*********************************/
 | 
			
		||||
 | 
			
		||||
boolean NecW(trs T)
 | 
			
		||||
{
 | 
			
		||||
  int a, b;
 | 
			
		||||
 | 
			
		||||
  FORaLL(a) FORaLL(b)
 | 
			
		||||
    if ( !ord[C[box[a]][C[box[a]][b]]] [C[box[a]][b]] ) {
 | 
			
		||||
      Ref(boxindex[a], T);
 | 
			
		||||
      Ref(impindex[box[a]][b], T);
 | 
			
		||||
      Ref(impindex[box[a]][C[box[a]][b]], T);
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*********************************/
 | 
			
		||||
							
								
								
									
										368
									
								
								src/axioms.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										368
									
								
								src/axioms.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,368 @@
 | 
			
		|||
/*
 | 
			
		||||
*			axioms.c
 | 
			
		||||
*
 | 
			
		||||
*	This file contains the code specific to the pre-defined 
 | 
			
		||||
*	axioms and logics. To add or remove an axiom, or to add,
 | 
			
		||||
*	remove or alter the definition of a logic, various changes 
 | 
			
		||||
*	must be made in this file and in axioms.h, as described in
 | 
			
		||||
*	the documentation.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "MaGIC.h"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Strings_initial simply sets the strings containing the names
 | 
			
		||||
*	of known logics and the surface forms of known axioms
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void strings_initial()
 | 
			
		||||
{
 | 
			
		||||
	strcpy(logic_name[Null_logic], "");
 | 
			
		||||
	strcpy(logic_name[FD], "FD");
 | 
			
		||||
	strcpy(logic_name[B], "B");
 | 
			
		||||
	strcpy(logic_name[DW], "DW");
 | 
			
		||||
	strcpy(logic_name[TW], "TW");
 | 
			
		||||
	strcpy(logic_name[EW], "EW");
 | 
			
		||||
	strcpy(logic_name[RW], "C");
 | 
			
		||||
	strcpy(logic_name[LIN], "LIN");
 | 
			
		||||
	strcpy(logic_name[T], "T");
 | 
			
		||||
	strcpy(logic_name[E], "E");
 | 
			
		||||
	strcpy(logic_name[R], "R");
 | 
			
		||||
	strcpy(logic_name[CK], "CK");
 | 
			
		||||
	strcpy(logic_name[S4], "S4");
 | 
			
		||||
 | 
			
		||||
	strcpy(ax_string[RulPref], "p -> q / (r -> p) -> (r -> q)");
 | 
			
		||||
	strcpy(ax_string[RulSuff], "p -> q / (q -> r) -> (p -> r)");
 | 
			
		||||
	strcpy(ax_string[AxKcomp], "((p -> q) & (p -> r)) -> (p -> (q & r))");
 | 
			
		||||
	strcpy(ax_string[AxAcomp], "((p -> r) & (q -> r)) -> ((p v q) -> r)");
 | 
			
		||||
	strcpy(ax_string[AxX], "p v ~p");
 | 
			
		||||
	strcpy(ax_string[AxBA], "(p & ~p) -> q");
 | 
			
		||||
	strcpy(ax_string[AxSBA], "(p & ~p) -> (q v ~q)");
 | 
			
		||||
	strcpy(ax_string[AxW2], "(p & (p -> q)) -> q");
 | 
			
		||||
	strcpy(ax_string[AxK], "p -> (q -> p)");
 | 
			
		||||
	strcpy(ax_string[AxK2], "p / q -> p");
 | 
			
		||||
	strcpy(ax_string[AxM], "p -> (p -> p)");
 | 
			
		||||
	strcpy(ax_string[AxRED], "(p -> ~p) -> ~p");
 | 
			
		||||
	strcpy(ax_string[RulC3], "p / (p -> q) -> q");
 | 
			
		||||
	strcpy(ax_string[AxCt], "p -> (t -> p)");
 | 
			
		||||
	strcpy(ax_string[Axat], "p v (p -> q)");
 | 
			
		||||
	strcpy(ax_string[AxTF], "T -> (F -> F)");
 | 
			
		||||
	strcpy(ax_string[AxC2], "p -> ((p -> q) -> q)");
 | 
			
		||||
	strcpy(ax_string[AxFN], "(p -> ~q) -> (q -> ~p)");
 | 
			
		||||
	strcpy(ax_string[AxW], "(p -> (p -> q)) -> (p -> q)");
 | 
			
		||||
	strcpy(ax_string[AxB], "(q -> r) -> ((p -> q) -> (p -> r))");
 | 
			
		||||
	strcpy(ax_string[AxB2], "(p -> q) -> ((q -> r) -> (p -> r))");
 | 
			
		||||
	strcpy(ax_string[AxS], "(p -> (q -> r)) -> ((p -> q) -> (p -> r))");
 | 
			
		||||
	strcpy(ax_string[AxC], "(p -> (q -> r)) -> (q -> (p -> r))");
 | 
			
		||||
	strcpy(ax_string[AxWB], "((p -> q) & (q -> r)) -> (p -> r)");
 | 
			
		||||
	strcpy(ax_string[RulNec], "p / !p");
 | 
			
		||||
	strcpy(ax_string[AxNec], "!p -> p");
 | 
			
		||||
	strcpy(ax_string[Ax4], "!p -> !!p");
 | 
			
		||||
	strcpy(ax_string[AxNID], "!(p -> q) -> (!p -> !q)");
 | 
			
		||||
	strcpy(ax_string[AxNand], "(!p & !q) -> !(p & q)");
 | 
			
		||||
	strcpy(ax_string[AxNW], "(!p -> (!p -> q)) -> (!p -> q)");
 | 
			
		||||
	strcpy(ax_string[AxNK], "p -> (!q -> p)");
 | 
			
		||||
	strcpy(ax_string[AxNKI], "p / !q -> p");
 | 
			
		||||
	strcpy(ax_string[Ax5], "p -> !?p");
 | 
			
		||||
	strcpy(ax_string[AxD], "!p -> ?p");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Tests_initial sets the list of axiom test functions.
 | 
			
		||||
*	The zero_tests are executed when the extensional
 | 
			
		||||
*	setup has been read, before any call to transref.
 | 
			
		||||
*	The one_tests are executed when impossible values are 
 | 
			
		||||
*	being removed from the search space inside transref.
 | 
			
		||||
*	The two_tests are called by transref to pre-process 
 | 
			
		||||
*	two-refutations in order to avoid having to generate 
 | 
			
		||||
*	before testing them. The many_tests are the default 
 | 
			
		||||
*	test routines called when the candidate matrix has 
 | 
			
		||||
*	been generated. All tests are null by default
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void tests_initial()
 | 
			
		||||
{
 | 
			
		||||
	AXIOM a;
 | 
			
		||||
 | 
			
		||||
	for ( a = AxNull; a < AXMAX; a++ ) {
 | 
			
		||||
	  TL[a].zero_test = TL[a].many_test = 0;
 | 
			
		||||
	  TL[a].one_test = TL[a].two_test = TL[a].three_test = 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	TL[AxX].zero_test = Exmid;
 | 
			
		||||
	TL[AxBA].zero_test = Boolalg;
 | 
			
		||||
	TL[AxSBA].zero_test = SemiBool;
 | 
			
		||||
	TL[AxK2].zero_test = paradox;
 | 
			
		||||
 | 
			
		||||
	TL[RulPref].one_test = set_prefix;
 | 
			
		||||
	TL[RulSuff].one_test = set_suffix;
 | 
			
		||||
	TL[AxW2].one_test = Wstar;
 | 
			
		||||
	TL[AxK].one_test = PARADOX;
 | 
			
		||||
	TL[AxM].one_test = mingle;
 | 
			
		||||
	TL[AxRED].one_test = Reductio;
 | 
			
		||||
	TL[RulC3].one_test = E_assertion;
 | 
			
		||||
	TL[AxCt].one_test = ata;
 | 
			
		||||
	TL[Axat].one_test = t_atomic;
 | 
			
		||||
	TL[AxTF].one_test = FF_T;
 | 
			
		||||
	TL[RulNec].one_test = necessitation;
 | 
			
		||||
	TL[AxNec].one_test = necessity;
 | 
			
		||||
	TL[AxNKI].one_test = NKI_test;
 | 
			
		||||
 | 
			
		||||
	TL[RulPref].two_test = pretest_prefix;
 | 
			
		||||
	TL[RulSuff].two_test = pretest_suffix;
 | 
			
		||||
	TL[Ax4].two_test = test_S4axiom;
 | 
			
		||||
	TL[Ax5].two_test = test_S5axiom;
 | 
			
		||||
	TL[AxD].two_test = test_Daxiom;
 | 
			
		||||
	TL[AxC2].two_test = test_assertion;
 | 
			
		||||
	TL[AxW].two_test = test_contraction;
 | 
			
		||||
	TL[AxNK].two_test = test_NK;
 | 
			
		||||
 | 
			
		||||
	TL[AxKcomp].many_test = test_mslat;
 | 
			
		||||
	TL[AxAcomp].many_test = test_jslat;
 | 
			
		||||
	TL[AxNID].many_test = NecImpDist;
 | 
			
		||||
	TL[AxNand].many_test = NecAdj;
 | 
			
		||||
	TL[AxB].many_test = Btest;
 | 
			
		||||
	TL[AxB2].many_test = B2test;
 | 
			
		||||
	TL[AxS].many_test = Stest;
 | 
			
		||||
	TL[AxC].many_test = Ctest;
 | 
			
		||||
	TL[AxWB].many_test = WBtest;
 | 
			
		||||
	TL[AxNW].many_test = NecW;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Logics_initial sets the arrays showing which axioms are valid in
 | 
			
		||||
*	which logics. Note that each logic has its own subroutine, except 
 | 
			
		||||
*	for the base logics FD and B, which have no proper axioms.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void logics_initial()
 | 
			
		||||
{
 | 
			
		||||
	LOGIC l;
 | 
			
		||||
	AXIOM a;
 | 
			
		||||
 | 
			
		||||
	for ( l = Null_logic; l < LOGMAX; l++ ) {
 | 
			
		||||
		for ( a = AxNull; a < AXMAX; a++ )
 | 
			
		||||
		valid[l][a] = false;
 | 
			
		||||
		default_orders[l] = distributive_lattices;
 | 
			
		||||
		default_fragment[l][n_exists] = true;
 | 
			
		||||
		default_fragment[l][lat_exists] = true;
 | 
			
		||||
		default_fragment[l][fus_exists] = false;
 | 
			
		||||
		default_fragment[l][nec_exists] = false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	init_B();
 | 
			
		||||
	init_DW();
 | 
			
		||||
	init_TW();
 | 
			
		||||
	init_EW();
 | 
			
		||||
	init_RW();
 | 
			
		||||
	init_LIN();
 | 
			
		||||
	init_CK();
 | 
			
		||||
	init_T();
 | 
			
		||||
	init_E();
 | 
			
		||||
	init_R();
 | 
			
		||||
	init_S4();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void init_B()
 | 
			
		||||
{
 | 
			
		||||
	valid[B][RulPref] = true;
 | 
			
		||||
	valid[B][RulSuff] = true;
 | 
			
		||||
	valid[B][AxKcomp] = true;
 | 
			
		||||
	valid[B][AxAcomp] = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void init_DW()
 | 
			
		||||
{
 | 
			
		||||
	valid[DW][AxFN] = true;
 | 
			
		||||
	valid[DW][RulPref] = true;
 | 
			
		||||
	valid[DW][RulSuff] = true;
 | 
			
		||||
	valid[DW][AxKcomp] = true;
 | 
			
		||||
	valid[DW][AxAcomp] = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void init_TW()
 | 
			
		||||
{
 | 
			
		||||
	valid[TW][AxFN] = true;
 | 
			
		||||
	valid[TW][AxB] = true;
 | 
			
		||||
	valid[TW][AxB2] = true;
 | 
			
		||||
	valid[TW][RulPref] = true;
 | 
			
		||||
	valid[TW][RulSuff] = true;
 | 
			
		||||
	valid[TW][AxKcomp] = true;
 | 
			
		||||
	valid[TW][AxAcomp] = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void init_EW()
 | 
			
		||||
{
 | 
			
		||||
	valid[EW][AxFN] = true;
 | 
			
		||||
	valid[EW][AxB] = true;
 | 
			
		||||
	valid[EW][AxB2] = true;
 | 
			
		||||
	valid[EW][RulC3] = true;
 | 
			
		||||
	valid[EW][RulPref] = true;
 | 
			
		||||
	valid[EW][RulSuff] = true;
 | 
			
		||||
	valid[EW][AxKcomp] = true;
 | 
			
		||||
	valid[EW][AxAcomp] = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void init_RW()
 | 
			
		||||
{
 | 
			
		||||
	valid[RW][AxFN] = true;
 | 
			
		||||
	valid[RW][AxB] = true;
 | 
			
		||||
	valid[RW][AxB2] = true;
 | 
			
		||||
	valid[RW][RulC3] = true;
 | 
			
		||||
	valid[RW][AxCt] = true;
 | 
			
		||||
	valid[RW][AxTF] = true;
 | 
			
		||||
	valid[RW][AxC2] = true;
 | 
			
		||||
	valid[RW][AxC] = true;
 | 
			
		||||
	valid[RW][RulPref] = true;
 | 
			
		||||
	valid[RW][RulSuff] = true;
 | 
			
		||||
	valid[RW][AxKcomp] = true;
 | 
			
		||||
	valid[RW][AxAcomp] = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void init_LIN()
 | 
			
		||||
{
 | 
			
		||||
	valid[LIN][AxFN] = true;
 | 
			
		||||
	valid[LIN][AxB] = true;
 | 
			
		||||
	valid[LIN][AxB2] = true;
 | 
			
		||||
	valid[LIN][RulC3] = true;
 | 
			
		||||
	valid[LIN][AxCt] = true;
 | 
			
		||||
	valid[LIN][AxTF] = true;
 | 
			
		||||
	valid[LIN][AxC2] = true;
 | 
			
		||||
	valid[LIN][AxC] = true;
 | 
			
		||||
	valid[LIN][RulPref] = true;
 | 
			
		||||
	valid[LIN][RulSuff] = true;
 | 
			
		||||
	valid[LIN][AxKcomp] = true;
 | 
			
		||||
	valid[LIN][AxAcomp] = true;
 | 
			
		||||
	valid[LIN][RulNec] = true;
 | 
			
		||||
	valid[LIN][AxNec] = true;
 | 
			
		||||
	valid[LIN][Ax4] = true;
 | 
			
		||||
	valid[LIN][AxD] = true;
 | 
			
		||||
	valid[LIN][AxNID] = true;
 | 
			
		||||
	valid[LIN][AxNW] = true;
 | 
			
		||||
	valid[LIN][AxNK] = true;
 | 
			
		||||
	valid[LIN][AxNKI] = true;
 | 
			
		||||
 | 
			
		||||
	default_orders[LIN] = lattices;
 | 
			
		||||
	default_fragment[LIN][nec_exists] = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void init_T()
 | 
			
		||||
{
 | 
			
		||||
	valid[T][AxFN] = true;
 | 
			
		||||
	valid[T][AxB] = true;
 | 
			
		||||
	valid[T][AxB2] = true;
 | 
			
		||||
	valid[T][AxS] = true;
 | 
			
		||||
	valid[T][AxX] = true;
 | 
			
		||||
	valid[T][AxW] = true;
 | 
			
		||||
	valid[T][AxW2] = true;
 | 
			
		||||
	valid[T][AxWB] = true;
 | 
			
		||||
	valid[T][AxRED] = true;
 | 
			
		||||
	valid[T][RulPref] = true;
 | 
			
		||||
	valid[T][RulSuff] = true;
 | 
			
		||||
	valid[T][AxKcomp] = true;
 | 
			
		||||
	valid[T][AxAcomp] = true;
 | 
			
		||||
	valid[T][AxNW] = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void init_E()
 | 
			
		||||
{
 | 
			
		||||
	valid[E][AxFN] = true;
 | 
			
		||||
	valid[E][AxB] = true;
 | 
			
		||||
	valid[E][AxB2] = true;
 | 
			
		||||
	valid[T][AxS] = true;
 | 
			
		||||
	valid[E][RulC3] = true;
 | 
			
		||||
	valid[E][AxX] = true;
 | 
			
		||||
	valid[E][AxW] = true;
 | 
			
		||||
	valid[E][AxW2] = true;
 | 
			
		||||
	valid[E][AxWB] = true;
 | 
			
		||||
	valid[E][AxRED] = true;
 | 
			
		||||
	valid[E][RulPref] = true;
 | 
			
		||||
	valid[E][RulSuff] = true;
 | 
			
		||||
	valid[E][AxKcomp] = true;
 | 
			
		||||
	valid[E][AxAcomp] = true;
 | 
			
		||||
	valid[E][AxNW] = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void init_R()
 | 
			
		||||
{
 | 
			
		||||
	valid[R][AxFN] = true;
 | 
			
		||||
	valid[R][AxB] = true;
 | 
			
		||||
	valid[R][AxB2] = true;
 | 
			
		||||
	valid[T][AxS] = true;
 | 
			
		||||
	valid[R][RulC3] = true;
 | 
			
		||||
	valid[R][AxCt] = true;
 | 
			
		||||
	valid[R][AxTF] = true;
 | 
			
		||||
	valid[R][AxC2] = true;
 | 
			
		||||
	valid[R][AxC] = true;
 | 
			
		||||
	valid[R][AxX] = true;
 | 
			
		||||
	valid[R][AxW] = true;
 | 
			
		||||
	valid[R][AxW2] = true;
 | 
			
		||||
	valid[R][AxWB] = true;
 | 
			
		||||
	valid[R][AxRED] = true;
 | 
			
		||||
	valid[R][RulPref] = true;
 | 
			
		||||
	valid[R][RulSuff] = true;
 | 
			
		||||
	valid[R][AxKcomp] = true;
 | 
			
		||||
	valid[R][AxAcomp] = true;
 | 
			
		||||
	valid[R][AxNW] = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void init_CK()
 | 
			
		||||
{
 | 
			
		||||
	valid[CK][AxFN] = true;
 | 
			
		||||
	valid[CK][AxB] = true;
 | 
			
		||||
	valid[CK][AxB2] = true;
 | 
			
		||||
	valid[CK][RulC3] = true;
 | 
			
		||||
	valid[CK][AxCt] = true;
 | 
			
		||||
	valid[CK][AxTF] = true;
 | 
			
		||||
	valid[CK][AxC2] = true;
 | 
			
		||||
	valid[CK][AxC] = true;
 | 
			
		||||
	valid[CK][AxK] = true;
 | 
			
		||||
	valid[CK][AxK2] = true;
 | 
			
		||||
	valid[CK][AxM] = true;
 | 
			
		||||
	valid[CK][RulPref] = true;
 | 
			
		||||
	valid[CK][RulSuff] = true;
 | 
			
		||||
	valid[CK][AxKcomp] = true;
 | 
			
		||||
	valid[CK][AxAcomp] = true;
 | 
			
		||||
	valid[CK][AxNKI] = true;
 | 
			
		||||
	valid[CK][AxNK] = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void init_S4()
 | 
			
		||||
{
 | 
			
		||||
	valid[S4][AxFN] = true;
 | 
			
		||||
	valid[S4][AxB] = true;
 | 
			
		||||
	valid[S4][AxB2] = true;
 | 
			
		||||
	valid[T][AxS] = true;
 | 
			
		||||
	valid[S4][RulC3] = true;
 | 
			
		||||
	valid[S4][AxX] = true;
 | 
			
		||||
	valid[S4][AxW] = true;
 | 
			
		||||
	valid[S4][AxW2] = true;
 | 
			
		||||
	valid[S4][AxWB] = true;
 | 
			
		||||
	valid[S4][AxRED] = true;
 | 
			
		||||
	valid[S4][AxBA] = true;
 | 
			
		||||
	valid[S4][AxSBA] = true;
 | 
			
		||||
	valid[S4][AxK2] = true;
 | 
			
		||||
	valid[S4][AxM] = true;
 | 
			
		||||
	valid[S4][RulPref] = true;
 | 
			
		||||
	valid[S4][RulSuff] = true;
 | 
			
		||||
	valid[S4][AxKcomp] = true;
 | 
			
		||||
	valid[S4][AxAcomp] = true;
 | 
			
		||||
	valid[CK][AxNKI] = true;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										125
									
								
								src/axioms.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								src/axioms.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,125 @@
 | 
			
		|||
/*
 | 
			
		||||
*				axioms.h		May 1993
 | 
			
		||||
*
 | 
			
		||||
*/ 
 | 
			
		||||
 | 
			
		||||
	/****************************************************************
 | 
			
		||||
	*								*
 | 
			
		||||
	*			    MaGIC 2.1				*
 | 
			
		||||
	*								*
 | 
			
		||||
	*	    (C) 1993 Australian National University		*
 | 
			
		||||
	*								*
 | 
			
		||||
	* 		       All rights reserved			*
 | 
			
		||||
	*								*
 | 
			
		||||
	* The information in this software is subject to change without	*
 | 
			
		||||
	* notice and should not be construed as a commitment by the	*
 | 
			
		||||
	* Australian National University. The Australian National Uni-	*
 | 
			
		||||
	* versity makes no representations about the suitability of	*
 | 
			
		||||
	* this software for any purpose. It is supplied "as is" without	*
 | 
			
		||||
	* express or implied warranty.  If the software is modified in 	*
 | 
			
		||||
	* a manner creating derivative copyright rights, appropriate	*
 | 
			
		||||
	* legends may be placed on the derivative work in addition to	*
 | 
			
		||||
	* that set forth above.						*
 | 
			
		||||
	*								*
 | 
			
		||||
	* Permission to use, copy, modify and distribute this software	*
 | 
			
		||||
	* and its documentation for any purpose and without fee is	*
 | 
			
		||||
	* hereby granted, provided that both the above copyright notice	*
 | 
			
		||||
	* and this permission notice appear in all copies and sup-	*
 | 
			
		||||
	* porting documentation, and that the name of the Australian	*
 | 
			
		||||
	* National University not be used in advertising or publicity	*
 | 
			
		||||
	* pertaining to distribution of the software without specific,	*
 | 
			
		||||
	* written prior permission.					*
 | 
			
		||||
	*								*
 | 
			
		||||
	****************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	First define the logics and axioms
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
typedef enum {
 | 
			
		||||
	Null_logic,
 | 
			
		||||
	FD,
 | 
			
		||||
	B,
 | 
			
		||||
	DW,
 | 
			
		||||
	TW,
 | 
			
		||||
	EW,
 | 
			
		||||
	RW,
 | 
			
		||||
	LIN,
 | 
			
		||||
	T,
 | 
			
		||||
	E,
 | 
			
		||||
	R,
 | 
			
		||||
	CK,
 | 
			
		||||
	S4,
 | 
			
		||||
	LOGMAX
 | 
			
		||||
} LOGIC;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef enum {
 | 
			
		||||
	AxNull,
 | 
			
		||||
	RulPref,
 | 
			
		||||
	RulSuff,
 | 
			
		||||
	AxKcomp,
 | 
			
		||||
	AxAcomp,
 | 
			
		||||
	AxX,
 | 
			
		||||
	AxBA,
 | 
			
		||||
	AxSBA,
 | 
			
		||||
	AxW2,
 | 
			
		||||
	AxK,
 | 
			
		||||
	AxK2,
 | 
			
		||||
	AxM,
 | 
			
		||||
	AxRED,
 | 
			
		||||
	RulC3,
 | 
			
		||||
	AxCt,
 | 
			
		||||
	Axat,
 | 
			
		||||
	AxTF,
 | 
			
		||||
	AxB,
 | 
			
		||||
	AxB2,
 | 
			
		||||
	AxS,
 | 
			
		||||
	AxC2,
 | 
			
		||||
	AxW,
 | 
			
		||||
	AxC,
 | 
			
		||||
	AxWB,
 | 
			
		||||
	AxFN,
 | 
			
		||||
	RulNec,
 | 
			
		||||
	AxNec,
 | 
			
		||||
	AxD,
 | 
			
		||||
	Ax4,
 | 
			
		||||
	Ax5,
 | 
			
		||||
	AxNID,
 | 
			
		||||
	AxNand,
 | 
			
		||||
	AxNW,
 | 
			
		||||
	AxNK,
 | 
			
		||||
	AxNKI,
 | 
			
		||||
	AXMAX
 | 
			
		||||
} AXIOM;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	There now follow the maximum sizes for the various
 | 
			
		||||
*	logics and fragments.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
	boolean (*zero_test)();
 | 
			
		||||
	void (*one_test)();
 | 
			
		||||
	void (*two_test)();
 | 
			
		||||
	void (*three_test)();
 | 
			
		||||
	boolean (*many_test)();
 | 
			
		||||
} testlist;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GLOBAL char
 | 
			
		||||
	logic_name[LOGMAX][8],	/* Text names of known logics	*/
 | 
			
		||||
	ax_string[AXMAX][64];	/* Text forms of known axioms	*/
 | 
			
		||||
 | 
			
		||||
GLOBAL boolean
 | 
			
		||||
	taxiom[AXMAX],		/* Tested axioms		*/
 | 
			
		||||
	valid[LOGMAX][AXMAX];	/* Axioms valid in each logic	*/
 | 
			
		||||
 | 
			
		||||
GLOBAL testlist
 | 
			
		||||
	TL[AXMAX];		/* Test functions for axioms	*/
 | 
			
		||||
							
								
								
									
										568
									
								
								src/dialog.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										568
									
								
								src/dialog.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,568 @@
 | 
			
		|||
/*
 | 
			
		||||
*			dialog.c		V2.1 (May 1993)
 | 
			
		||||
*
 | 
			
		||||
*	The main interactive part of MaGIC.c.  This module contains 
 | 
			
		||||
*	some of the procedures to be executed in response to menu 
 | 
			
		||||
*	selections, most of the others being in getjob.c.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/****************************************************************
 | 
			
		||||
	*								*
 | 
			
		||||
	*			    MaGIC 2.1				*
 | 
			
		||||
	*								*
 | 
			
		||||
	*	    (C) 1993 Australian National University		*
 | 
			
		||||
	*								*
 | 
			
		||||
	* 		       All rights reserved			*
 | 
			
		||||
	*								*
 | 
			
		||||
	* The information in this software is subject to change without	*
 | 
			
		||||
	* notice and should not be construed as a commitment by the	*
 | 
			
		||||
	* Australian National University. The Australian National Uni-	*
 | 
			
		||||
	* versity makes no representations about the suitability of	*
 | 
			
		||||
	* this software for any purpose. It is supplied "as is" without	*
 | 
			
		||||
	* express or implied warranty.  If the software is modified in 	*
 | 
			
		||||
	* a manner creating derivative copyright rights, appropriate	*
 | 
			
		||||
	* legends may be placed on the derivative work in addition to	*
 | 
			
		||||
	* that set forth above.						*
 | 
			
		||||
	*								*
 | 
			
		||||
	* Permission to use, copy, modify and distribute this software	*
 | 
			
		||||
	* and its documentation for any purpose and without fee is	*
 | 
			
		||||
	* hereby granted, provided that both the above copyright notice	*
 | 
			
		||||
	* and this permission notice appear in all copies and sup-	*
 | 
			
		||||
	* porting documentation, and that the name of the Australian	*
 | 
			
		||||
	* National University not be used in advertising or publicity	*
 | 
			
		||||
	* pertaining to distribution of the software without specific,	*
 | 
			
		||||
	* written prior permission.					*
 | 
			
		||||
	*								*
 | 
			
		||||
	****************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "MaGIC.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
/*
 | 
			
		||||
*	The dialog function gets the job specifications from the
 | 
			
		||||
*	user, setting up theJob accordingly.  It returns 1 if 
 | 
			
		||||
*	option 'g' is selected from the menu, 0 if 'e' or 'q' is 
 | 
			
		||||
*	selected and n > 1 to change (in the parallel case) to n 
 | 
			
		||||
*	processes.
 | 
			
		||||
*/
 | 
			
		||||
 
 | 
			
		||||
int dialog(boolean batch, char *batchfile)
 | 
			
		||||
{
 | 
			
		||||
  if ( batch ) return read_job( batchfile );
 | 
			
		||||
 | 
			
		||||
  for(;;) switch( menu() ) {
 | 
			
		||||
  case 'a': add_axioms();		break;
 | 
			
		||||
  case 'b': bad_guy();		break;
 | 
			
		||||
  case 'c': connective();		break;
 | 
			
		||||
  case 'd': deletion();		break;
 | 
			
		||||
  case 'e':
 | 
			
		||||
  case 'q':		return 0;
 | 
			
		||||
  case 'f': fragment();		break;
 | 
			
		||||
  case 'g':		return 1;
 | 
			
		||||
  case 'h': help(0); paws();	break;
 | 
			
		||||
  case 'i': input_direct();	break;
 | 
			
		||||
  case 'j': jump_condition();	break;
 | 
			
		||||
  case 'k': job_defaults(batch);	break;
 | 
			
		||||
  case 'l': logic_choice();	break;
 | 
			
		||||
  case 'm': print_version();	break;
 | 
			
		||||
  case 'n':
 | 
			
		||||
  case '#':		return n_of_procs();
 | 
			
		||||
  case 'o': order_change();	break;
 | 
			
		||||
  case 'p': print_options();	break;
 | 
			
		||||
  case 'r': read_job( 0 );	break;
 | 
			
		||||
  case 's': store_job();	
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Menu first ensures that the fragment is consistent with the
 | 
			
		||||
*	selected logic, axioms and badguy.  Then it displays the 
 | 
			
		||||
*	currently selected job and the menu.  Finally it takes the
 | 
			
		||||
*	next user choice of menu selection and returns the character
 | 
			
		||||
*	code for the next action.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
char menu()
 | 
			
		||||
{
 | 
			
		||||
  char readin();
 | 
			
		||||
 | 
			
		||||
  set_frag( true );
 | 
			
		||||
  if ( xdialog ) {
 | 
			
		||||
    printf("J\n");
 | 
			
		||||
    outjob( stdout );
 | 
			
		||||
  }
 | 
			
		||||
  else display();
 | 
			
		||||
  return readin("abcdefghijklmnopqrst#");
 | 
			
		||||
}
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Readin returns the first character from stdin which matches 
 | 
			
		||||
*	one in its parameter, converting to lower case as required.
 | 
			
		||||
*	It then discards all characters up to and including the next 
 | 
			
		||||
*	line feed.  It is used mainly to get menu selections.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
char readin(char *str)
 | 
			
		||||
{
 | 
			
		||||
  char ch;
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  fflush(stdout);
 | 
			
		||||
  for(;;) {
 | 
			
		||||
    fgets(answer,SLEN,stdin);
 | 
			
		||||
    ch = 0;
 | 
			
		||||
    for ( i = 0; answer[i]; i++ ) {
 | 
			
		||||
      if ( isupper(ch = answer[i]) ) ch = tolower(ch);
 | 
			
		||||
      if ( strchr(str,ch) ) return ch;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	"Pause".
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void paws()
 | 
			
		||||
{
 | 
			
		||||
  if ( xdialog ) fflush(stdout);
 | 
			
		||||
  else {
 | 
			
		||||
    printf("\n\n Now type RETURN to continue.........");
 | 
			
		||||
    READLN;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Job_defaults is the initialisation procedure.  It gets the
 | 
			
		||||
*	initial choice of system and sets theJob to its defaults.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void job_defaults( boolean batch )
 | 
			
		||||
{
 | 
			
		||||
  int	i, j;
 | 
			
		||||
 | 
			
		||||
  zero = 0;
 | 
			
		||||
 | 
			
		||||
  for ( i = 0; i < SYMBOLMAX; i++ ) {
 | 
			
		||||
    strcpy( theJob->symtable[i].s, "" );
 | 
			
		||||
    theJob->symtable[i].last = theJob->symtable[i].next = 0;
 | 
			
		||||
  }
 | 
			
		||||
  for ( i = 0; i < 3; i++ )
 | 
			
		||||
    for ( j = 0; j < CMAX+8; j++ )
 | 
			
		||||
      theJob->symbol[i][j] = 0;
 | 
			
		||||
  theJob->symtab = 0;
 | 
			
		||||
 | 
			
		||||
  newsymbol( "(", 0, 0 );
 | 
			
		||||
  newsymbol( ")", 0, 0 );
 | 
			
		||||
  newsymbol( ".", 0, 0 );
 | 
			
		||||
  newsymbol( "a", 0, 0 );
 | 
			
		||||
  newsymbol( "b", 0, 0 );
 | 
			
		||||
  newsymbol( "t", theJob->symbol[0], 0 );
 | 
			
		||||
  newsymbol( "f", theJob->symbol[0], 0 );
 | 
			
		||||
  newsymbol( "T", theJob->symbol[0], 0 );
 | 
			
		||||
  newsymbol( "F", theJob->symbol[0], 0 );
 | 
			
		||||
  newsymbol( "~", theJob->symbol[1], 0 );
 | 
			
		||||
  newsymbol( "!", theJob->symbol[1], 0 );
 | 
			
		||||
  newsymbol( "?", theJob->symbol[1], 0 );
 | 
			
		||||
  newsymbol( "o", theJob->symbol[2], 0 );
 | 
			
		||||
  newsymbol( "&", theJob->symbol[2], 0 );
 | 
			
		||||
  newsymbol( "v", theJob->symbol[2], 0 );
 | 
			
		||||
  newsymbol( "->", theJob->symbol[2], 0 );
 | 
			
		||||
 | 
			
		||||
  strcpy( theJob->data_dir, DATA_DIR );
 | 
			
		||||
 | 
			
		||||
  for ( i = 0; i <= CMAX; i++ ) {
 | 
			
		||||
    theJob->dcs[i] = 0;
 | 
			
		||||
    if ( i < CMAX ) {
 | 
			
		||||
      theJob->defcon[i] = 0;
 | 
			
		||||
      theJob->concut[i] = false;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  for ( i = 0; i < TMAX; i++ )
 | 
			
		||||
    for ( j = 0; j < RTMAX; j++ )
 | 
			
		||||
      theJob->croot[i][j] = theJob->proot[i][j] = 0;
 | 
			
		||||
  theJob->failure = 0;
 | 
			
		||||
 | 
			
		||||
  for ( i = 1; i < AXMAX; i++ )
 | 
			
		||||
    theJob->axiom[i] = 0;
 | 
			
		||||
 | 
			
		||||
  theJob->tty_out = PRETTY;
 | 
			
		||||
  theJob->fil_out = NONE;  
 | 
			
		||||
  theJob->outfil_name[0] = '\0';
 | 
			
		||||
 | 
			
		||||
  theJob->maxmat = 0;
 | 
			
		||||
  theJob->maxtime = 0;
 | 
			
		||||
 | 
			
		||||
  Sizmax = theJob->sizmax = SZ;
 | 
			
		||||
  theJob->sizmax_ismax = true;
 | 
			
		||||
 | 
			
		||||
  wff_initial();
 | 
			
		||||
 | 
			
		||||
  if ( !batch ) {
 | 
			
		||||
    if ( !noclear ) {
 | 
			
		||||
#ifdef __CYGWIN__
 | 
			
		||||
      puts("\033[2J");
 | 
			
		||||
#else
 | 
			
		||||
      system("clear");
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
    theJob->logic = FD;
 | 
			
		||||
    if ( !xdialog ) {
 | 
			
		||||
      printf("\n This is MaGIC %s, finding matrices for", VERSION);
 | 
			
		||||
      printf(" your favourite logic.\n");
 | 
			
		||||
      printf(" Matrices come in all sizes up to %dx%d.\n",
 | 
			
		||||
	     SZ,SZ);
 | 
			
		||||
      logic_choice();
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Set_frag makes the selected fragment include all the used
 | 
			
		||||
*	connectives and sets Sizmax accordingly.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void set_frag( boolean set_sizmax )
 | 
			
		||||
{
 | 
			
		||||
  int i, j;
 | 
			
		||||
 | 
			
		||||
  for ( i = 0; i < AXMAX; i++ ) if ( theJob->axiom[i] ) {
 | 
			
		||||
    if ( strchr(ax_string[i],'~') || strchr(ax_string[i],'f')
 | 
			
		||||
	 || strchr(ax_string[i],'?') )
 | 
			
		||||
      theJob->f_n = 1;
 | 
			
		||||
    if ( strchr(ax_string[i],'t') || strchr(ax_string[i],'f') ) 
 | 
			
		||||
      theJob->f_t = 1;
 | 
			
		||||
    if ( strchr(ax_string[i],'&') || strchr(ax_string[i],'v') )
 | 
			
		||||
      theJob->f_lat = 1;
 | 
			
		||||
    if ( strchr(ax_string[i],'!') || strchr(ax_string[i],'?') )
 | 
			
		||||
      theJob->f_nec = 1;
 | 
			
		||||
    if ( i == AxK || i == AxK2 || i == AxTF )
 | 
			
		||||
      theJob->f_T = theJob->f_t = 1;
 | 
			
		||||
  }
 | 
			
		||||
  if ( theJob->f_n && valid[theJob->logic][AxC] )
 | 
			
		||||
    theJob->f_fus = 1;
 | 
			
		||||
 | 
			
		||||
  for ( i = 0; theJob->croot[i][0]; i++ ) {
 | 
			
		||||
    for ( j = 0; theJob->croot[i][j]; j++ )
 | 
			
		||||
      if ( theJob->croot[i][j] != ABSURD )
 | 
			
		||||
	check_frag(theJob->croot[i][j]);
 | 
			
		||||
    for ( j = 0; theJob->proot[i][j]; j++ )
 | 
			
		||||
      if ( theJob->proot[i][j] != TRIVIAL )
 | 
			
		||||
	check_frag(theJob->proot[i][j]);
 | 
			
		||||
  }
 | 
			
		||||
  if ( theJob->failure )
 | 
			
		||||
    check_frag(theJob->failure);
 | 
			
		||||
  for ( i = 0; theJob->dcs[i]; i++ )
 | 
			
		||||
    if ( theJob->defcon[i] != PRIMITIVE ) 
 | 
			
		||||
      check_frag(theJob->defcon[i]);
 | 
			
		||||
 | 
			
		||||
  if ( theJob->totord )
 | 
			
		||||
    theJob->f_lat = 1;
 | 
			
		||||
  if ( theJob->f_lat )
 | 
			
		||||
    theJob->f_t = theJob->f_T = theJob->f_F = 1;
 | 
			
		||||
  if (( theJob->f_F || theJob->f_T ) && theJob->f_n ) 
 | 
			
		||||
    theJob->f_F = theJob->f_T = 1;
 | 
			
		||||
 | 
			
		||||
  F_N =
 | 
			
		||||
    ((theJob->f_n && valid[theJob->logic][AxFN])
 | 
			
		||||
     || theJob->axiom[AxFN]);
 | 
			
		||||
  afx =
 | 
			
		||||
    ((valid[theJob->logic][RulPref] && valid[theJob->logic][RulSuff])
 | 
			
		||||
     || (theJob->axiom[RulPref] && theJob->axiom[RulSuff]));
 | 
			
		||||
 | 
			
		||||
  if ( set_sizmax ) {
 | 
			
		||||
    if ( !(theJob->f_lat || theJob->f_n) )
 | 
			
		||||
      Sizmax = theJob->f_t?  S_pot: S_pO;
 | 
			
		||||
    else if ( !theJob->f_lat )
 | 
			
		||||
      Sizmax = theJob->f_t?  S_pont: S_poN;
 | 
			
		||||
    else if ( !theJob->distrib )
 | 
			
		||||
      Sizmax = theJob->f_n? S_ln: S_lat;
 | 
			
		||||
    else if ( !theJob->totord )
 | 
			
		||||
      Sizmax = ((theJob->f_n && theJob->logic==S4)
 | 
			
		||||
		|| theJob->axiom[AxBA])? S_ba:
 | 
			
		||||
      (theJob->f_n? S_dln: S_dlat);
 | 
			
		||||
    else	Sizmax = theJob->f_n? S_Ton: S_to;
 | 
			
		||||
 | 
			
		||||
    if ( theJob->sizmax > Sizmax || theJob->sizmax_ismax ) 
 | 
			
		||||
      theJob->sizmax = Sizmax;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	This function adds to the fragment any connectives which
 | 
			
		||||
*	occur in the given formula.  It attends to the main 
 | 
			
		||||
*	connective only, calling itself recursively to deal with
 | 
			
		||||
*	the subformulae.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void check_frag(int x)
 | 
			
		||||
{
 | 
			
		||||
  if (!x) return;
 | 
			
		||||
  if (!theJob->form[x].sym->s[1]) {
 | 
			
		||||
    switch(theJob->form[x].sym->s[0]) {
 | 
			
		||||
    case '~': theJob->f_n = 1; break;
 | 
			
		||||
    case 'f': theJob->f_n = 1;
 | 
			
		||||
    case 't': theJob->f_t = 1; break;
 | 
			
		||||
    case 'T': theJob->f_T = 1; break;
 | 
			
		||||
    case 'F': theJob->f_F = 1; break;
 | 
			
		||||
    case 'o': theJob->f_fus = 1; break;
 | 
			
		||||
    case '?': theJob->f_n = 1;
 | 
			
		||||
    case '!': theJob->f_nec = 1; break;
 | 
			
		||||
    case '&':
 | 
			
		||||
    case 'v': theJob->f_lat = 1;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  check_frag(theJob->form[x].lsub);
 | 
			
		||||
  check_frag(theJob->form[x].rsub);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Print_axiom just writes out axiom #x on stream f.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void print_axiom(FILE *f, AXIOM x)
 | 
			
		||||
{
 | 
			
		||||
  fprintf(f, "%s", ax_string[x]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Display shows the current choices and the menu.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void display()
 | 
			
		||||
{
 | 
			
		||||
  if ( !noclear ) {
 | 
			
		||||
#ifdef __CYGWIN__
 | 
			
		||||
    puts("\033[2J");
 | 
			
		||||
#else
 | 
			
		||||
    system("clear");
 | 
			
		||||
#endif
 | 
			
		||||
  }
 | 
			
		||||
  disp(stdout);
 | 
			
		||||
  printf("    A)xiom    B)adguy      C)onnective   D)elete\n");
 | 
			
		||||
  printf("    E)xit     F)ragment    G)enerate     H)elp\n"); 
 | 
			
		||||
  printf("    I)O       J)ump        K)ill         L)ogic\n");
 | 
			
		||||
  printf("    M)aGIC    N)o. Procs   O)rder        P)rint Opts\n");
 | 
			
		||||
  printf("    Q)uit     R)ead        S)tore                       ");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Disp is the function to print an account of the current
 | 
			
		||||
*	contents of theJob.  It is to have verbose and terse modes.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void disp(FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  AXIOM ax;
 | 
			
		||||
  int i, j;
 | 
			
		||||
  boolean b;
 | 
			
		||||
 | 
			
		||||
#ifdef PARALLEL
 | 
			
		||||
  fprintf(f, "\n Parallel MaGIC running %d out of %d processes\n", 
 | 
			
		||||
	  gm->nprocs, PARALLEL);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  if ( theJob->totord && default_orders[theJob->logic] != total_orders )
 | 
			
		||||
    fprintf(f, "\n Logic:%8cT%s", ' ', logic_name[theJob->logic]);
 | 
			
		||||
  else if ( theJob->distrib &&
 | 
			
		||||
	    default_orders[theJob->logic] != distributive_lattices )
 | 
			
		||||
    fprintf(f, "\n Logic:%8cD%s", ' ', logic_name[theJob->logic]);
 | 
			
		||||
  else if ( !theJob->distrib &&
 | 
			
		||||
	    default_orders[theJob->logic] != lattices )
 | 
			
		||||
    fprintf(f, "\n Logic:%8cL%s", ' ', logic_name[theJob->logic]);
 | 
			
		||||
  else fprintf(f, "\n Logic:%8c%s", ' ', logic_name[theJob->logic]);
 | 
			
		||||
 | 
			
		||||
  b = false;
 | 
			
		||||
  for ( ax = AxNull+1; ax < AXMAX; ax++ ) if ( theJob->axiom[ax] ) {
 | 
			
		||||
    if ( !b ) {
 | 
			
		||||
      b = true;
 | 
			
		||||
      fprintf(f, "\n\n Plus:         ");
 | 
			
		||||
    }
 | 
			
		||||
    else fprintf(f, "\n               ");
 | 
			
		||||
    print_axiom(f,ax);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  for ( i = 0; theJob->croot[i][0]; i++ ) {
 | 
			
		||||
    if ( i ) fprintf(f,   "\n               "); 
 | 
			
		||||
    else     fprintf(f, "\n\n Extra:        ");
 | 
			
		||||
    for ( j = 0; theJob->proot[i][j]; j++ ) {
 | 
			
		||||
      if ( j ) fprintf(f, ", ");
 | 
			
		||||
      if ( theJob->proot[i][j] != TRIVIAL )
 | 
			
		||||
	outfml(theJob->proot[i][j],
 | 
			
		||||
	       theJob->proot[i][j],f);
 | 
			
		||||
    }
 | 
			
		||||
    if ( theJob->proot[i][0] != TRIVIAL ) fprintf(f, "  /  ");
 | 
			
		||||
    for ( j = 0; theJob->croot[i][j]; j++ ) {
 | 
			
		||||
      if ( j ) fprintf(f, ", ");
 | 
			
		||||
      if ( theJob->croot[i][j] != ABSURD )
 | 
			
		||||
	outfml(theJob->croot[i][j],
 | 
			
		||||
	       theJob->croot[i][j],f);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fprintf(f, "\n\n Fragment:     ->");
 | 
			
		||||
  if ( theJob->f_lat ) fprintf(f, ", &, v");
 | 
			
		||||
  if ( theJob->f_n ) fprintf(f, ", ~");
 | 
			
		||||
  if ( theJob->f_fus ) fprintf(f, ", o");
 | 
			
		||||
  if ( theJob->f_nec ) {
 | 
			
		||||
    fprintf(f, ", !");
 | 
			
		||||
    if ( theJob->f_n ) fprintf(f, ", ?");
 | 
			
		||||
  }
 | 
			
		||||
  if ( theJob->f_t ) {
 | 
			
		||||
    fprintf(f, ", t"); 
 | 
			
		||||
    if ( theJob->f_n ) fprintf(f, ", f");
 | 
			
		||||
  }
 | 
			
		||||
  if ( theJob->f_T ) fprintf(f, ", T");
 | 
			
		||||
  if ( theJob->f_F ) fprintf(f, ", F");
 | 
			
		||||
 | 
			
		||||
  for ( i = 0; theJob->defcon[i]; i++ ) {
 | 
			
		||||
    if ( i ) fprintf(f,   "\n             ");
 | 
			
		||||
    else if ( !theJob->defcon[1] ) fprintf(f, "\n\n Definition: ");
 | 
			
		||||
    else     fprintf(f, "\n\n Definitions:");
 | 
			
		||||
    if ( !theJob->adicity[i] ) 
 | 
			
		||||
      fprintf(f, "  %s        ", theJob->dcs[i]->s);
 | 
			
		||||
    else if ( theJob->adicity[i] == 1 ) {
 | 
			
		||||
      if ( theJob->dcs[i]->s[1] )
 | 
			
		||||
	fprintf(f, "  %s a       ", theJob->dcs[i]->s);
 | 
			
		||||
      else fprintf(f, "  %sa       ", theJob->dcs[i]->s);
 | 
			
		||||
    }
 | 
			
		||||
    else	fprintf(f, "  a %s b    ", theJob->dcs[i]->s);
 | 
			
		||||
    if ( theJob->defcon[i] == PRIMITIVE ) {
 | 
			
		||||
      fprintf(f, "Primitive");
 | 
			
		||||
      if ( theJob->concut[i] ) fprintf(f, "  (cut)");
 | 
			
		||||
    }
 | 
			
		||||
    else outfml(theJob->defcon[i], theJob->defcon[i],f);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( theJob->failure ) {
 | 
			
		||||
    fprintf(f, "\n\n Fail:         ");
 | 
			
		||||
    outfml(theJob->failure, theJob->failure, f);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  fprintf(f, "\n\n TTY output:   %s\n File output:  %s",
 | 
			
		||||
	  (theJob->tty_out==NONE? "none": 
 | 
			
		||||
	   (theJob->tty_out==UGLY? "ugly": 
 | 
			
		||||
	    (theJob->tty_out==PRETTY? "pretty": "summary"))), 
 | 
			
		||||
	  (theJob->fil_out==NONE? "none": 
 | 
			
		||||
	   (theJob->fil_out==UGLY? "ugly": 
 | 
			
		||||
	    (theJob->fil_out==PRETTY? "pretty": "summary"))));
 | 
			
		||||
  if ( theJob->fil_out ) 
 | 
			
		||||
    fprintf(f,"\n Output file:  \"%s\"", theJob->outfil_name);
 | 
			
		||||
 | 
			
		||||
  fprintf(f, "\n\n Search concludes ");
 | 
			
		||||
  if (theJob->maxtime)
 | 
			
		||||
    fprintf(f, "after %d seconds\n or ", theJob->maxtime);
 | 
			
		||||
  if (theJob->maxmat)
 | 
			
		||||
    fprintf(f, "when %d matri%s found\n or ", 
 | 
			
		||||
	    theJob->maxmat, (theJob->maxmat==1? "x": "ces"));
 | 
			
		||||
  fprintf(f, "when size %d finished.\n\n\n", theJob->sizmax);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	The Help facility is extremely primitive.  It simply transfers
 | 
			
		||||
*	the contents of a short file to stdout.  The parameter codes
 | 
			
		||||
*	the place in the program from which the Help call was made.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void help(helpcode x)
 | 
			
		||||
{ 
 | 
			
		||||
  switch( x ) {
 | 
			
		||||
  case MEN:
 | 
			
		||||
    put_out("MEN");
 | 
			
		||||
    break;
 | 
			
		||||
  case WFF1: 
 | 
			
		||||
  case WFF2:
 | 
			
		||||
    put_out("WFF");
 | 
			
		||||
    break;
 | 
			
		||||
  case FDL:
 | 
			
		||||
    put_out("FDL");
 | 
			
		||||
    break;
 | 
			
		||||
  case BTW:
 | 
			
		||||
    put_out("BTW");
 | 
			
		||||
    break;
 | 
			
		||||
  case LOG:
 | 
			
		||||
    put_out("LOG");
 | 
			
		||||
    break;
 | 
			
		||||
  case OUT:
 | 
			
		||||
    put_out("OUT");
 | 
			
		||||
    break;
 | 
			
		||||
  case HELPMAX:
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	This is essentially a macro for Help (above).
 | 
			
		||||
*	It prepends the data directory name, appends ".show" 
 | 
			
		||||
*	and does the file transfer.
 | 
			
		||||
*
 | 
			
		||||
*	If we are in terse mode, nothing happens because the
 | 
			
		||||
*	front end xmagic has its own Help routine.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void put_out(char *f_nm)
 | 
			
		||||
{
 | 
			
		||||
  FILE *f1;
 | 
			
		||||
  char s[100];
 | 
			
		||||
 | 
			
		||||
  if ( !noclear ) {
 | 
			
		||||
#ifdef __CYGWIN__
 | 
			
		||||
    puts( "\033[2J" );
 | 
			
		||||
    strcpy(s,DATA_DIR);
 | 
			
		||||
    strcat(s,f_nm);
 | 
			
		||||
    strcat(s,".show");
 | 
			
		||||
    if ( (f1 = fopen(s,"r")) == NULL ) {
 | 
			
		||||
      printf("Cannot open %s.",s);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      while (fgets(s,80,f1) != NULL) {
 | 
			
		||||
        printf("%s",s);
 | 
			
		||||
      }
 | 
			
		||||
      fclose(f1);
 | 
			
		||||
    }
 | 
			
		||||
#else
 | 
			
		||||
    sprintf(s,"clear; more %s%s.show", DATA_DIR, f_nm);
 | 
			
		||||
    system( s );
 | 
			
		||||
#endif
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										11
									
								
								src/embedded.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/embedded.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
#include "RM.h"
 | 
			
		||||
#include "hmi.h"
 | 
			
		||||
 | 
			
		||||
int main(int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
  if (argc != 2)
 | 
			
		||||
    Abort("synopsis: embedding <file of algebras>",-1);
 | 
			
		||||
  relatemats(embedding, argv[1], "subalgebra");
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1298
									
								
								src/getjob.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1298
									
								
								src/getjob.c
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										329
									
								
								src/hmi.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										329
									
								
								src/hmi.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,329 @@
 | 
			
		|||
#include "RM.h"
 | 
			
		||||
#include "hmi.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Is there a homomorphic image of m1 in m2?
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
int homo(MATRIX *m1, MATRIX *m2)
 | 
			
		||||
{
 | 
			
		||||
  int h[SZ];
 | 
			
		||||
  int x,y;
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * First check that the fragments agree
 | 
			
		||||
   */
 | 
			
		||||
  for (x=NEG; x<FRAGMAX; x++)
 | 
			
		||||
    if (m1->fragment[x] != m2->fragment[x])
 | 
			
		||||
      return 0;
 | 
			
		||||
  FORALLCON(m1,x);
 | 
			
		||||
  FORALLCON(m2,y);
 | 
			
		||||
  if (x != y )
 | 
			
		||||
    return 0;
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * Now initialise to "undefined" and ask for a solution
 | 
			
		||||
   */
 | 
			
		||||
  for (x=0; x<SZ; x++)
 | 
			
		||||
    h[x] = -1;
 | 
			
		||||
  return homomorphism(m1,m2,h);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Recursively generate a homomorphism if there is one
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
int homomorphism(MATRIX *m1, MATRIX *m2, int h[])
 | 
			
		||||
{
 | 
			
		||||
  int x,y;
 | 
			
		||||
  int localh[SZ];
 | 
			
		||||
 | 
			
		||||
  copy_h(m1,h,localh);
 | 
			
		||||
  FORALL(m1,x)
 | 
			
		||||
    if (h[x] < 0) {
 | 
			
		||||
      FORALL(m2,y) {
 | 
			
		||||
	copy_h(m1,h,localh);
 | 
			
		||||
	localh[x] = y;
 | 
			
		||||
	if (propagated(m1,m2,localh) &&
 | 
			
		||||
	    homomorphism(m1,m2,localh)) {
 | 
			
		||||
	  copy_h(m1,localh,h);
 | 
			
		||||
	  return 1;
 | 
			
		||||
	}
 | 
			
		||||
      }
 | 
			
		||||
      return 0;
 | 
			
		||||
    }
 | 
			
		||||
  copy_h(m1,localh,h);
 | 
			
		||||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Is there a non-trivial homomorphic image of m1 in m2?
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
int nt_homo(MATRIX *m1, MATRIX *m2)
 | 
			
		||||
{
 | 
			
		||||
  int h[SZ];
 | 
			
		||||
  int x,y;
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * First check that the fragments agree
 | 
			
		||||
   */
 | 
			
		||||
  for (x=NEG; x<FRAGMAX; x++)
 | 
			
		||||
    if (m1->fragment[x] != m2->fragment[x])
 | 
			
		||||
      return 0;
 | 
			
		||||
  FORALLCON(m1,x);
 | 
			
		||||
  FORALLCON(m2,y);
 | 
			
		||||
  if (x != y )
 | 
			
		||||
    return 0;
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * Now initialise to "undefined" and ask for a solution
 | 
			
		||||
   */
 | 
			
		||||
  for (x=0; x<SZ; x++)
 | 
			
		||||
    h[x] = -1;
 | 
			
		||||
  return nt_homomorphism(m1,m2,h);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Recursively generate a non-trivial homomorphism if there is one
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
int nt_homomorphism(MATRIX *m1, MATRIX *m2, int h[])
 | 
			
		||||
{
 | 
			
		||||
  int x,y;
 | 
			
		||||
  int localh[SZ];
 | 
			
		||||
 | 
			
		||||
  copy_h(m1,h,localh);
 | 
			
		||||
  FORALL(m1,x)
 | 
			
		||||
    if (h[x] < 0) {
 | 
			
		||||
      FORALL(m2,y) {
 | 
			
		||||
	copy_h(m1,h,localh);
 | 
			
		||||
	localh[x] = y;
 | 
			
		||||
	if (propagated(m1,m2,localh) &&
 | 
			
		||||
	    nt_homomorphism(m1,m2,localh)) {
 | 
			
		||||
	  copy_h(m1,localh,h);
 | 
			
		||||
	  return 1;
 | 
			
		||||
	}
 | 
			
		||||
      }
 | 
			
		||||
      return 0;
 | 
			
		||||
    }
 | 
			
		||||
  FORALL(m1,x)
 | 
			
		||||
    FORALL(m1,y)
 | 
			
		||||
    if (x < y && localh[x] != localh[y]) {
 | 
			
		||||
      copy_h(m1,localh,h);
 | 
			
		||||
      return 1;
 | 
			
		||||
    }
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Is m1 [isomorphic to] a subalgebra of m2?
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
int embedding(MATRIX *m1, MATRIX *m2)
 | 
			
		||||
{
 | 
			
		||||
  int h[SZ];
 | 
			
		||||
  int x,y;
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * First check that the fragments agree and the sizes are OK
 | 
			
		||||
   */
 | 
			
		||||
  for (x=NEG; x<FRAGMAX; x++)
 | 
			
		||||
    if (m1->fragment[x] != m2->fragment[x])
 | 
			
		||||
      return 0;
 | 
			
		||||
  FORALLCON(m1,x);
 | 
			
		||||
  FORALLCON(m2,y);
 | 
			
		||||
  if (x != y )
 | 
			
		||||
    return 0;
 | 
			
		||||
  if (m1->siz > m2->siz)
 | 
			
		||||
    return 0;
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * Now initialise to "undefined" and ask for a solution
 | 
			
		||||
   */
 | 
			
		||||
  for (x=0; x<SZ; x++)
 | 
			
		||||
    h[x] = -1;
 | 
			
		||||
  return injected_into(m1,m2,h);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Recursively generate an injective homomorphism if there is one
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
int injected_into(MATRIX *m1, MATRIX *m2, int h[])
 | 
			
		||||
{
 | 
			
		||||
  int x,y;
 | 
			
		||||
  int localh[SZ];
 | 
			
		||||
 | 
			
		||||
  copy_h(m1,h,localh);
 | 
			
		||||
  FORALL(m1,x)
 | 
			
		||||
    if (h[x] < 0) {
 | 
			
		||||
      FORALL(m2,y) {
 | 
			
		||||
	copy_h(m1,h,localh);
 | 
			
		||||
	localh[x] = y;
 | 
			
		||||
	if (propagated(m1,m2,localh) &&
 | 
			
		||||
	    injected_into(m1,m2,localh)) {
 | 
			
		||||
	  copy_h(m1,localh,h);
 | 
			
		||||
	  return 1;
 | 
			
		||||
	}
 | 
			
		||||
      }
 | 
			
		||||
      return 0;
 | 
			
		||||
    }
 | 
			
		||||
  FORALL(m1,x) FORALL(m1,y)
 | 
			
		||||
    if (x < y && localh[x] == localh[y])
 | 
			
		||||
      return 0;
 | 
			
		||||
  copy_h(m1,localh,h);
 | 
			
		||||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Is there a (surjective) homomorphism from m1 onto m2?
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
int epimorphic_image(MATRIX *m1, MATRIX *m2)
 | 
			
		||||
{
 | 
			
		||||
  int h[SZ];
 | 
			
		||||
  int x,y;
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * First check that the fragments agree and the sizes are OK
 | 
			
		||||
   */
 | 
			
		||||
  for (x=NEG; x<FRAGMAX; x++)
 | 
			
		||||
    if (m1->fragment[x] != m2->fragment[x])
 | 
			
		||||
      return 0;
 | 
			
		||||
  FORALLCON(m1,x);
 | 
			
		||||
  FORALLCON(m2,y);
 | 
			
		||||
  if (x != y )
 | 
			
		||||
    return 0;
 | 
			
		||||
  if (m1->siz < m2->siz)
 | 
			
		||||
    return 0;
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * Now initialise to "undefined" and ask for a solution
 | 
			
		||||
   */
 | 
			
		||||
  for (x=0; x<SZ; x++)
 | 
			
		||||
    h[x] = -1;
 | 
			
		||||
  return mapped_onto(m1,m2,h);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Recursively generate a surjective homomorphism if there is one
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
int mapped_onto(MATRIX *m1, MATRIX *m2, int h[])
 | 
			
		||||
{
 | 
			
		||||
  int x,y;
 | 
			
		||||
  int invh[SZ];
 | 
			
		||||
  int localh[SZ];
 | 
			
		||||
 | 
			
		||||
  copy_h(m1,h,localh);
 | 
			
		||||
  FORALL(m1,x)
 | 
			
		||||
    if (h[x] < 0) {
 | 
			
		||||
      FORALL(m2,y) {
 | 
			
		||||
	copy_h(m1,h,localh);
 | 
			
		||||
	localh[x] = y;
 | 
			
		||||
	if (propagated(m1,m2,localh) &&
 | 
			
		||||
	    mapped_onto(m1,m2,localh)) {
 | 
			
		||||
	  copy_h(m1,localh,h);
 | 
			
		||||
	  return 1;
 | 
			
		||||
	}
 | 
			
		||||
      }
 | 
			
		||||
      return 0;
 | 
			
		||||
    }
 | 
			
		||||
  FORALL(m2,y)
 | 
			
		||||
    invh[y] = -1;
 | 
			
		||||
  FORALL(m1,x)
 | 
			
		||||
    invh[localh[x]] = x;
 | 
			
		||||
  FORALL(m2,y)
 | 
			
		||||
    if (invh[y] < 0)
 | 
			
		||||
      return 0;
 | 
			
		||||
 | 
			
		||||
  copy_h(m1,localh,h);
 | 
			
		||||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void copy_h(MATRIX *m, int source[], int dest[])
 | 
			
		||||
{
 | 
			
		||||
  int x;
 | 
			
		||||
 | 
			
		||||
  FORALL(m,x)
 | 
			
		||||
    dest[x] = source[x];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int propagated(MATRIX *m1, MATRIX *m2, int h[])
 | 
			
		||||
{
 | 
			
		||||
  int localh[SZ];
 | 
			
		||||
  int x;
 | 
			
		||||
 | 
			
		||||
  for (x=0; x<SZ; x++)
 | 
			
		||||
    localh[x] = h[x];
 | 
			
		||||
  if (m1->fragment[NEG] &&
 | 
			
		||||
      !monprop(m1,m1->neg,m2->neg,localh))
 | 
			
		||||
    return 0;
 | 
			
		||||
  if (m1->fragment[BOX] &&
 | 
			
		||||
      !monprop(m1,m1->box,m2->box,localh))
 | 
			
		||||
    return 0;
 | 
			
		||||
  FORALLCON(m1,x)
 | 
			
		||||
    if (m1->adicity[x] == 1 &&
 | 
			
		||||
	!monprop(m1,m1->monadic[x],m2->monadic[x],localh))
 | 
			
		||||
      return 0;
 | 
			
		||||
  if (!dyprop(m1,m1->C,m2->C,localh))
 | 
			
		||||
    return 0;
 | 
			
		||||
  if (m1->fragment[FUS] &&
 | 
			
		||||
      !dyprop(m1,m1->fus,m2->fus,localh))
 | 
			
		||||
    return 0;
 | 
			
		||||
  if (m1->fragment[LAT]) {
 | 
			
		||||
    if (!dyprop(m1,m1->K,m2->K,localh))
 | 
			
		||||
      return 0;
 | 
			
		||||
    if (!dyprop(m1,m1->A,m2->A,localh))
 | 
			
		||||
      return 0;
 | 
			
		||||
  }
 | 
			
		||||
  FORALLCON(m1,x)
 | 
			
		||||
    if (m1->adicity[x] == 2 &&
 | 
			
		||||
	!dyprop(m1,m1->dyadic[x],m2->dyadic[x],localh))
 | 
			
		||||
      return 0;
 | 
			
		||||
  FORALL(m1,x)
 | 
			
		||||
    h[x] = localh[x];
 | 
			
		||||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int monprop(MATRIX *m1, int a[], int b[], int lh[])
 | 
			
		||||
{
 | 
			
		||||
  int x;
 | 
			
		||||
 | 
			
		||||
  FORALL(m1,x)
 | 
			
		||||
    if (lh[x] >= 0 && lh[a[x]] != b[lh[x]]) {
 | 
			
		||||
      if (lh[a[x]] < 0)
 | 
			
		||||
	lh[a[x]] = b[lh[x]];
 | 
			
		||||
      else
 | 
			
		||||
	return 0;
 | 
			
		||||
    }
 | 
			
		||||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int dyprop(MATRIX *m1, int a[][SZ], int b[][SZ], int lh[])
 | 
			
		||||
{
 | 
			
		||||
  int x,y;
 | 
			
		||||
 | 
			
		||||
  FORALL(m1,x)
 | 
			
		||||
    if (lh[x] >= 0)
 | 
			
		||||
      FORALL(m1,y)
 | 
			
		||||
	if (lh[y] >= 0 && lh[a[x][y]] != b[lh[x]][lh[y]]) {
 | 
			
		||||
	  if (lh[a[x][x]] < 0)
 | 
			
		||||
	    lh[a[x][y]] = b[lh[x]][lh[y]];
 | 
			
		||||
	  else return 0;
 | 
			
		||||
	}
 | 
			
		||||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								src/hmi.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/hmi.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,17 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Function prototypes for homomorphism testers
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
int homo(MATRIX *m1, MATRIX *m2);
 | 
			
		||||
int homomorphism(MATRIX *m1, MATRIX *m2, int h[]);
 | 
			
		||||
int nt_homo(MATRIX *m1, MATRIX *m2);
 | 
			
		||||
int nt_homomorphism(MATRIX *m1, MATRIX *m2, int h[]);
 | 
			
		||||
int embedding(MATRIX *m1, MATRIX *m2);
 | 
			
		||||
int injected_into(MATRIX *m1, MATRIX *m2, int h[]);
 | 
			
		||||
int epimorphic_image(MATRIX *m1, MATRIX *m2);
 | 
			
		||||
int mapped_onto(MATRIX *m1, MATRIX *m2, int h[]);
 | 
			
		||||
void copy_h(MATRIX *m, int source[], int dest[]);
 | 
			
		||||
int propagated(MATRIX *m1, MATRIX *m2, int h[]);
 | 
			
		||||
int monprop(MATRIX *m1, int a[], int b[], int lh[]);
 | 
			
		||||
int dyprop(MATRIX *m1, int a[][SZ], int b[][SZ], int lh[]);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										11
									
								
								src/homomorphic.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/homomorphic.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
#include "RM.h"
 | 
			
		||||
#include "hmi.h"
 | 
			
		||||
 | 
			
		||||
int main(int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
  if (argc != 2)
 | 
			
		||||
    Abort("synopsis: homomorphic <file of algebras>",-1);
 | 
			
		||||
  relatemats(homo, argv[1], "Homomorphism");
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										9
									
								
								src/image.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/image.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,9 @@
 | 
			
		|||
#include "RM.h"
 | 
			
		||||
#include "hmi.h"
 | 
			
		||||
 | 
			
		||||
main(int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
  if (argc != 2)
 | 
			
		||||
    Abort("synopsis: embedding <file of algebras>",-1);
 | 
			
		||||
  relatemats(epimorphic_image, argv[1], "MapsOnto");
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										528
									
								
								src/isom.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										528
									
								
								src/isom.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,528 @@
 | 
			
		|||
/*
 | 
			
		||||
*			isom.c		V2.1 (May 1993)
 | 
			
		||||
*
 | 
			
		||||
*	This contains all the procedures pertaining to the
 | 
			
		||||
*	elimination of isomorphic copies from the output of
 | 
			
		||||
*	matrix-generating programs such as MaGIC.c.
 | 
			
		||||
*
 | 
			
		||||
*	It is assumed that the external variables siz, neg[], 
 | 
			
		||||
*	ord[][], des, C[][] and box[] are available and that 
 | 
			
		||||
*	this module is called, presumably by the accept() 
 | 
			
		||||
*	function, every time a new matrix is found.  If there 
 | 
			
		||||
*	are any isomorphic copies, the integer isoms is 
 | 
			
		||||
*	incremented.
 | 
			
		||||
*	 
 | 
			
		||||
*	There are two parts to all this.  First come some
 | 
			
		||||
*	procedures to find the acceptable permutations on the
 | 
			
		||||
*	current siz, neg[], ord[][] and des.  Then there are
 | 
			
		||||
*	the routines to be executed on discovery of a new 
 | 
			
		||||
*	matrix.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/****************************************************************
 | 
			
		||||
	*								*
 | 
			
		||||
	*			    MaGIC 2.1				*
 | 
			
		||||
	*								*
 | 
			
		||||
	*	    (C) 1993 Australian National University		*
 | 
			
		||||
	*								*
 | 
			
		||||
	* 		       All rights reserved			*
 | 
			
		||||
	*								*
 | 
			
		||||
	* The information in this software is subject to change without	*
 | 
			
		||||
	* notice and should not be construed as a commitment by the	*
 | 
			
		||||
	* Australian National University. The Australian National Uni-	*
 | 
			
		||||
	* versity makes no representations about the suitability of	*
 | 
			
		||||
	* this software for any purpose. It is supplied "as is" without	*
 | 
			
		||||
	* express or implied warranty.  If the software is modified in 	*
 | 
			
		||||
	* a manner creating derivative copyright rights, appropriate	*
 | 
			
		||||
	* legends may be placed on the derivative work in addition to	*
 | 
			
		||||
	* that set forth above.						*
 | 
			
		||||
	*								*
 | 
			
		||||
	* Permission to use, copy, modify and distribute this software	*
 | 
			
		||||
	* and its documentation for any purpose and without fee is	*
 | 
			
		||||
	* hereby granted, provided that both the above copyright notice	*
 | 
			
		||||
	* and this permission notice appear in all copies and sup-	*
 | 
			
		||||
	* porting documentation, and that the name of the Australian	*
 | 
			
		||||
	* National University not be used in advertising or publicity	*
 | 
			
		||||
	* pertaining to distribution of the software without specific,	*
 | 
			
		||||
	* written prior permission.					*
 | 
			
		||||
	*								*
 | 
			
		||||
	****************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "MaGIC.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define firstopen (tr_par.vlength - tr_par.vlength)
 | 
			
		||||
 | 
			
		||||
static boolean
 | 
			
		||||
	manyisoms;		/* Not all isoms have been stacked	*/
 | 
			
		||||
 | 
			
		||||
static ism
 | 
			
		||||
	nextisom;		/* First free isom in the list		*/
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
	lastisovect;		/* Last unfree segment of isolist	*/
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
	isoused;		/* Number of isoms used this case	*/
 | 
			
		||||
 | 
			
		||||
static char
 | 
			
		||||
	shvector[V_LENGTH];	/* The variable part of thisvector	*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	This initialisation function just sets up perm.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void perm_initial()
 | 
			
		||||
{
 | 
			
		||||
  perm = (PRM*) malloc(sizeof(PRM));
 | 
			
		||||
  perm->h[0] = -1;
 | 
			
		||||
  perm->pup = 0;
 | 
			
		||||
  isoused = ISOMAX;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Setperm finds the automorphisms which do not disturb 
 | 
			
		||||
*	ord, N or des.  The bulk of it is a crude test-and-change.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void setperm()
 | 
			
		||||
{
 | 
			
		||||
  int i, j;
 | 
			
		||||
  int p_poss[SZ][SZ],
 | 
			
		||||
    p_used[SZ],
 | 
			
		||||
    sh[SZ],
 | 
			
		||||
    single[SZ];
 | 
			
		||||
  PRM *prmptr;
 | 
			
		||||
 | 
			
		||||
  for (i=0; i<isoused; i++) {
 | 
			
		||||
    istak[i].icv = (i? 0: isolist);
 | 
			
		||||
    istak[i].left = istak[i].right = 0;
 | 
			
		||||
    if ( !i || i == ISOMAX-1 ) istak[i].parent = 0;
 | 
			
		||||
    else istak[i].parent = istak+i+1;
 | 
			
		||||
  }
 | 
			
		||||
  isoused = 1;
 | 
			
		||||
  nextisom = istak+1;
 | 
			
		||||
  for ( i = 0; i < V_LENGTH; i++ ) thisvector[i] = -1;
 | 
			
		||||
  manyisoms = false;
 | 
			
		||||
  lastisovect = 0;
 | 
			
		||||
  istak[0].icv[0] = SZ;
 | 
			
		||||
 | 
			
		||||
  for ( prmptr = perm; prmptr->h[0] >= 0; prmptr = prmptr->pup )
 | 
			
		||||
    prmptr->h[0] = -1;
 | 
			
		||||
 | 
			
		||||
  FORALL(i) FORALL(j) {
 | 
			
		||||
    p_poss[i][j] = (lower_than(i)==lower_than(j)) &&
 | 
			
		||||
      (higher_than(i)==higher_than(j));
 | 
			
		||||
    if ( theJob->f_n && 
 | 
			
		||||
	 (( N[i]==i && N[j]!=j ) || ( N[j]==j && N[i]!=i )))
 | 
			
		||||
      p_poss[i][j] = 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  FORALL(i) {
 | 
			
		||||
    if ( theJob->f_t ) {
 | 
			
		||||
      if ( i != des ) 
 | 
			
		||||
	p_poss[des][i] = p_poss[i][des] = 0;
 | 
			
		||||
      if ( theJob->f_n && i != N[des] ) 
 | 
			
		||||
	p_poss[N[des]][i] = p_poss[i][N[des]] = 0;
 | 
			
		||||
    }
 | 
			
		||||
    else if ( desig[i] ) 
 | 
			
		||||
      FORALL(j) if ( !desig[j] ) 
 | 
			
		||||
	p_poss[i][j] = p_poss[j][i] = 0;
 | 
			
		||||
    p_used[i] = 1;  sh[i] = i;
 | 
			
		||||
    single[i] = 1;
 | 
			
		||||
    FORALL(j)
 | 
			
		||||
      if ( i != j && p_poss[i][j] )
 | 
			
		||||
	single[i] = 0;
 | 
			
		||||
  }
 | 
			
		||||
  goto CHANGE;	/* !!! */
 | 
			
		||||
 | 
			
		||||
PTEST:	FORALL(i) FORALL(j)
 | 
			
		||||
	  if ( ord[i][j] != ord[sh[i]][sh[j]] )
 | 
			
		||||
	    goto CHANGE;
 | 
			
		||||
  newperm(sh);
 | 
			
		||||
 | 
			
		||||
CHANGE:	FORALL(i)
 | 
			
		||||
	  if ( !(( theJob->f_n && i < N[i] ) || single[i] )) {
 | 
			
		||||
	    p_used[sh[i]] = 0;
 | 
			
		||||
	    if ( theJob->f_n )
 | 
			
		||||
	      p_used[sh[N[i]]] = 0;
 | 
			
		||||
	    for ( j = sh[i]-1; j >= 0; j-- )
 | 
			
		||||
	      if ( p_poss[i][j] && !p_used[j] ) {
 | 
			
		||||
		sh[i] = j;
 | 
			
		||||
		if ( theJob->f_n )
 | 
			
		||||
		  sh[N[i]] = N[j];
 | 
			
		||||
		p_used[j] = 1;
 | 
			
		||||
		if ( theJob->f_n )
 | 
			
		||||
		  p_used[N[j]] = 1;
 | 
			
		||||
		for (i--; i >= 0 && !(theJob->f_n && i < N[i]); i--) 
 | 
			
		||||
		  if ( !single[i] ) {
 | 
			
		||||
		    for (j = siz; j; j-- )
 | 
			
		||||
		      if ( p_poss[i][j] && !p_used[j] ) {
 | 
			
		||||
			sh[i] = j;
 | 
			
		||||
			if ( theJob->f_n )
 | 
			
		||||
			  sh[N[i]] = N[j];
 | 
			
		||||
			p_used[j] = 1;
 | 
			
		||||
			if ( theJob->f_n)
 | 
			
		||||
			  p_used[N[j]] = 1;
 | 
			
		||||
			break;
 | 
			
		||||
		      }
 | 
			
		||||
		  }
 | 
			
		||||
		goto PTEST;
 | 
			
		||||
	      }
 | 
			
		||||
	  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	How many elements are below x?
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
int lower_than(int x)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
  int j = 0;
 | 
			
		||||
 | 
			
		||||
  for ( i=0; i < x; i++ ) j += ord[i][x];
 | 
			
		||||
  return j;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Similarly, how many are above?
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
int higher_than(int x)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
  int j = 0;
 | 
			
		||||
 | 
			
		||||
  for ( i = siz; i > x; i-- ) j += ord[x][i];
 | 
			
		||||
  return j;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Add a permutation to the perm list.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void newperm(int *vec)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
  PRM *p;
 | 
			
		||||
 | 
			
		||||
  for ( p = perm; p->pup && p->h[0] >= 0; p = p->pup) ;
 | 
			
		||||
  if ( !p->pup ) {
 | 
			
		||||
    p->pup = (PRM*) malloc(sizeof(PRM));
 | 
			
		||||
    p->pup->pup = 0;
 | 
			
		||||
    p->pup->h[0] = -1;
 | 
			
		||||
  }
 | 
			
		||||
  FORALL(i) p->h[i] = *(vec+i);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	That completes the first half, concerned with generating 
 | 
			
		||||
*	the list of allowable permutations.  Now, assuming that 
 | 
			
		||||
*	list given, deal with isomorphisms between good matrices.
 | 
			
		||||
*
 | 
			
		||||
*	Isomorphic usually returns 1 if the matrix was already in the 
 | 
			
		||||
*	isomorphism tree below ptr, snipping it out as it does so
 | 
			
		||||
*	(since it is not going to be generated twice).  If not, 
 | 
			
		||||
*	all the isomorphic copies which lie within the search space
 | 
			
		||||
*	are generated and added to the tree.
 | 
			
		||||
*
 | 
			
		||||
*	If the flag "manyisoms" is set, indicating that some isomorphic
 | 
			
		||||
*	copies of earlier things have not been recorded because of lack
 | 
			
		||||
*	of space, then the copies of the current matrix, instead of 
 | 
			
		||||
*	being added directly to the tree, are compared with the current 
 | 
			
		||||
*	matrix to see whether one of them preceeds it.  If the current 
 | 
			
		||||
*	matrix is the first in its isomorphism class, its copies are 
 | 
			
		||||
*	inserted in the tree.  If not, the temporary store is emptied 
 | 
			
		||||
*	and 1 returned.
 | 
			
		||||
*
 | 
			
		||||
*	The flag "manyisoms" is raised if the number of stored copies
 | 
			
		||||
*	gets to equal ISOMAX, and lowered at the start of each search.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
boolean isomorphic(ism ptr, trs T)
 | 
			
		||||
{
 | 
			
		||||
  int i, j;
 | 
			
		||||
  boolean do_add = false;
 | 
			
		||||
 | 
			
		||||
  if ( !tr_par.vlength ) return false;
 | 
			
		||||
  j = 0;
 | 
			
		||||
  for ( i = 0; i < tr_par.vlength; i++ )
 | 
			
		||||
    if ( T->coinorder[i] >= firstopen )
 | 
			
		||||
      shvector[j++] = thisvector[i];
 | 
			
		||||
 | 
			
		||||
  for ( i = 0; i < tr_par.vlength; i++ ) {
 | 
			
		||||
    if ( shvector[i] < ptr->icv[i] ) {
 | 
			
		||||
      if ( ptr->left ) 
 | 
			
		||||
	return isomorphic(ptr->left,T);
 | 
			
		||||
      do_add = true;
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
    if ( shvector[i] > ptr->icv[i] ) {
 | 
			
		||||
      if ( ptr->right ) 
 | 
			
		||||
	return isomorphic(ptr->right,T);
 | 
			
		||||
      do_add = true;
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if ( do_add ) {
 | 
			
		||||
    if ( isomorphic_anyhow(T) ) {
 | 
			
		||||
      isoms2++;
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
    add_isoms( T );
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
  snip(ptr);
 | 
			
		||||
  isoms++;
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Snip removes a node from the isom tree.
 | 
			
		||||
*	The action is slightly different if the node is the root.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void snip(ism p)
 | 
			
		||||
{
 | 
			
		||||
  ism q;
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  if ( p == istak ) {
 | 
			
		||||
    if ( !p->left && !p->right ) {
 | 
			
		||||
      *(p->icv) = SZ;
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      if ( p->right ) 
 | 
			
		||||
	for ( q = p->right; q->left; q = q->left ) ;
 | 
			
		||||
      else	for ( q = p->left; q->right; q = q->right ) ;
 | 
			
		||||
      for ( i = 0; i < tr_par.vlength; i++ )
 | 
			
		||||
	p->icv[i] = q->icv[i];
 | 
			
		||||
      snip(q);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    if ( !p->left )
 | 
			
		||||
      subst(p,p->right);
 | 
			
		||||
    else if ( !p->right )
 | 
			
		||||
      subst(p,p->left);
 | 
			
		||||
    else {
 | 
			
		||||
      for ( q = p->right; q->left; q = q->left ) ;
 | 
			
		||||
      for ( i = 0; i < tr_par.vlength; i++ )
 | 
			
		||||
	p->icv[i] = q->icv[i];
 | 
			
		||||
      subst(q,q->right);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	A subroutine of the above, this moves p2 into the place
 | 
			
		||||
*	of p1, marking p1 as defunct so that it can be re-used.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void subst(ism p1, ism p2)
 | 
			
		||||
{
 | 
			
		||||
  if ( p2 )
 | 
			
		||||
    p2->parent = p1->parent;
 | 
			
		||||
  if ( p1->parent->left == p1 )
 | 
			
		||||
    p1->parent->left = p2;
 | 
			
		||||
  else	p1->parent->right = p2;
 | 
			
		||||
  *(p1->icv) = SZ;
 | 
			
		||||
  p1->parent = nextisom;
 | 
			
		||||
  nextisom = p1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Isomorphic_anyhow if manyisoms and this is not the first
 | 
			
		||||
*	in its isomorphism class.  This function and add_isoms are
 | 
			
		||||
*	very similar and should probably be amalgamated at some stage.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
boolean isomorphic_anyhow(trs T)
 | 
			
		||||
{
 | 
			
		||||
  int i, j, k;
 | 
			
		||||
  char ac[V_LENGTH];
 | 
			
		||||
  PRM *aptr;
 | 
			
		||||
 | 
			
		||||
  if ( !manyisoms ) return false;
 | 
			
		||||
  for ( aptr = perm; aptr->h[0] >= 0; aptr = aptr->pup ) {
 | 
			
		||||
    FORALL(i) FORALL(j) 
 | 
			
		||||
      ac[impindex[(int)aptr->h[i]][(int)aptr->h[j]]] = aptr->h[C[i][j]];
 | 
			
		||||
    FORALL(i)
 | 
			
		||||
      ac[boxindex[(int)aptr->h[i]]] = aptr->h[box[i]];
 | 
			
		||||
    for ( i = 0; theJob->dcs[i]; i++ )
 | 
			
		||||
      if ( theJob->defcon[i] == PRIMITIVE )
 | 
			
		||||
	switch ( theJob->adicity[i] ) {
 | 
			
		||||
	case 0:
 | 
			
		||||
	  ac[ucc0[i]] = aptr->h[nulladic[i]];
 | 
			
		||||
	  break;
 | 
			
		||||
	case 1:
 | 
			
		||||
	  FORALL(j)
 | 
			
		||||
	    ac[ucc1[i][(int)aptr->h[j]]] =
 | 
			
		||||
	    aptr->h[monadic[i][j]];
 | 
			
		||||
	  break;
 | 
			
		||||
	case 2:
 | 
			
		||||
	  FORALL(j) FORALL(k)
 | 
			
		||||
	    ac[ucc2[i][(int)aptr->h[j]][(int)aptr->h[k]]] =
 | 
			
		||||
	    aptr->h[dyadic[i][j][k]];
 | 
			
		||||
	}
 | 
			
		||||
    for ( i = firstopen; i < tr_par.vlength; i++ )
 | 
			
		||||
      if ( thisvector[T->inorder[i]] != ac[T->inorder[i]] ) {
 | 
			
		||||
	if ( thisvector[T->inorder[i]] > ac[T->inorder[i]] )
 | 
			
		||||
	  return true;
 | 
			
		||||
	break;
 | 
			
		||||
      }
 | 
			
		||||
  }
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Add_isoms, called from isomorphic, generates all the non-
 | 
			
		||||
*	trivial automorphic copies of the matrix got by applying 
 | 
			
		||||
*	allowable permutations and puts them into the "isom" tree.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void add_isoms(trs T)
 | 
			
		||||
{
 | 
			
		||||
  int i, j, k, same;
 | 
			
		||||
  char ac[V_LENGTH], shac[V_LENGTH];
 | 
			
		||||
  PRM *aptr;
 | 
			
		||||
 | 
			
		||||
  for ( aptr = perm;
 | 
			
		||||
	aptr->h[0] >= 0 && nextisom && 
 | 
			
		||||
	  lastisovect < ISLMAX - tr_par.vlength;
 | 
			
		||||
	aptr = aptr->pup ) {
 | 
			
		||||
    FORALL(i) FORALL(j) 
 | 
			
		||||
      ac[impindex[(int)aptr->h[i]][(int)aptr->h[j]]] = aptr->h[C[i][j]];
 | 
			
		||||
    if ( theJob->f_nec )
 | 
			
		||||
      FORALL(i)
 | 
			
		||||
	ac[boxindex[(int)aptr->h[i]]] = aptr->h[box[i]];
 | 
			
		||||
    for ( i = 0; theJob->dcs[i]; i++ )
 | 
			
		||||
      if ( theJob->defcon[i] == PRIMITIVE )
 | 
			
		||||
	switch ( theJob->adicity[i] ) {
 | 
			
		||||
	case 0:	ac[ucc0[i]] = aptr->h[nulladic[i]];
 | 
			
		||||
	  break;
 | 
			
		||||
	case 1:
 | 
			
		||||
	  FORALL(j)
 | 
			
		||||
	    ac[ucc1[i][(int)aptr->h[j]]] =
 | 
			
		||||
	    aptr->h[monadic[i][j]];
 | 
			
		||||
	  break;
 | 
			
		||||
	case 2:
 | 
			
		||||
	  FORALL(j) FORALL(k)
 | 
			
		||||
	    ac[ucc2[i][(int)aptr->h[j]][(int)aptr->h[k]]] =
 | 
			
		||||
	    aptr->h[dyadic[i][j][k]];
 | 
			
		||||
	}
 | 
			
		||||
    same = true;
 | 
			
		||||
    j = 0;
 | 
			
		||||
    for ( i = 0; i < tr_par.vlength; i++ ) 
 | 
			
		||||
      if ( T->coinorder[i] >= firstopen ) {
 | 
			
		||||
	shac[j] = ac[i];
 | 
			
		||||
	if ( shac[j] != shvector[j] ) same = false;
 | 
			
		||||
	j++;
 | 
			
		||||
      }
 | 
			
		||||
    if ( !same ) {
 | 
			
		||||
      if ( *((*(istak)).icv) != SZ ) {
 | 
			
		||||
	add_this(shac,istak);
 | 
			
		||||
	if ( !nextisom || lastisovect >= ISLMAX - tr_par.vlength )
 | 
			
		||||
	  manyisoms = true;
 | 
			
		||||
      }
 | 
			
		||||
      else
 | 
			
		||||
	for ( i = 0; i < tr_par.vlength; i++ )
 | 
			
		||||
	  (*(istak)).icv[i] = shac[i];
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	If the matrix mat is not in the i_tree, put it in and return true.
 | 
			
		||||
*	If it is there already, return false.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
boolean add_this(char mat[], ism i_tree)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  for ( i = 0; i < tr_par.vlength; i++ )
 | 
			
		||||
    if ( mat[i] < i_tree->icv[i] ) {
 | 
			
		||||
      if ( i_tree->left )
 | 
			
		||||
	return add_this(mat,i_tree->left);
 | 
			
		||||
      i_tree->left = tack_on(i_tree,mat);
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
    else if ( mat[i] > i_tree->icv[i] ) {
 | 
			
		||||
      if ( i_tree->right )
 | 
			
		||||
	return add_this(mat,i_tree->right);
 | 
			
		||||
      i_tree->right = tack_on(i_tree,mat);
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Extend the isom tree with a new entry.  Its parent is
 | 
			
		||||
*	p and its matrix is mat.
 | 
			
		||||
*	If there is no free ism in the stack, crash gracefully.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
ism tack_on(ism p, char mat[])
 | 
			
		||||
{
 | 
			
		||||
  ism pi;
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  pi = nextisom;
 | 
			
		||||
  if ( !pi ) skipout("Isomorphism stack overflow",SKIP);
 | 
			
		||||
  if ( pi >= istak+isoused ) isoused++;
 | 
			
		||||
  nextisom = pi->parent;
 | 
			
		||||
  pi->left = pi->right = 0;
 | 
			
		||||
  pi->parent = p;
 | 
			
		||||
  lastisovect += tr_par.vlength;
 | 
			
		||||
  pi->icv = isolist+lastisovect;
 | 
			
		||||
  for ( i = 0; i < tr_par.vlength; i++ )
 | 
			
		||||
    pi->icv[i] = mat[i];
 | 
			
		||||
  return pi;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										835
									
								
								src/logic_io.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										835
									
								
								src/logic_io.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,835 @@
 | 
			
		|||
/*
 | 
			
		||||
*			logic_io.c		V2.1 (May 1993)
 | 
			
		||||
*
 | 
			
		||||
*	This file contains the routines for reading in setups
 | 
			
		||||
*	and for making the appropriate initialisations.  It 
 | 
			
		||||
*	also contains the procedures for printing any matrices
 | 
			
		||||
*	found.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/****************************************************************
 | 
			
		||||
	*								*
 | 
			
		||||
	*			    MaGIC 2.1				*
 | 
			
		||||
	*								*
 | 
			
		||||
	*	    (C) 1992 Australian National University		*
 | 
			
		||||
	*								*
 | 
			
		||||
	* 		       All rights reserved			*
 | 
			
		||||
	*								*
 | 
			
		||||
	* The information in this software is subject to change without	*
 | 
			
		||||
	* notice and should not be construed as a commitment by the	*
 | 
			
		||||
	* Australian National University. The Australian National Uni-	*
 | 
			
		||||
	* versity makes no representations about the suitability of	*
 | 
			
		||||
	* this software for any purpose. It is supplied "as is" without	*
 | 
			
		||||
	* express or implied warranty.  If the software is modified in 	*
 | 
			
		||||
	* a manner creating derivative copyright rights, appropriate	*
 | 
			
		||||
	* legends may be placed on the derivative work in addition to	*
 | 
			
		||||
	* that set forth above.						*
 | 
			
		||||
	*								*
 | 
			
		||||
	* Permission to use, copy, modify and distribute this software	*
 | 
			
		||||
	* and its documentation for any purpose and without fee is	*
 | 
			
		||||
	* hereby granted, provided that both the above copyright notice	*
 | 
			
		||||
	* and this permission notice appear in all copies and sup-	*
 | 
			
		||||
	* porting documentation, and that the name of the Australian	*
 | 
			
		||||
	* National University not be used in advertising or publicity	*
 | 
			
		||||
	* pertaining to distribution of the software without specific,	*
 | 
			
		||||
	* written prior permission.					*
 | 
			
		||||
	*								*
 | 
			
		||||
	****************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "MaGIC.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	First the semi-trivial function cluster to control the loop
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
int newsiz()
 | 
			
		||||
{
 | 
			
		||||
  N[0] = 0;
 | 
			
		||||
  return( got_siz()? (theJob->f_n? newneg(): neword()): 0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int newneg()
 | 
			
		||||
{
 | 
			
		||||
  return( got_neg()? neword(): newsiz() );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int neword()
 | 
			
		||||
{
 | 
			
		||||
  return( got_ord()? newdes(): (theJob->f_n? newneg(): newsiz()) );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int newdes()
 | 
			
		||||
{
 | 
			
		||||
  return( got_des()? 1: neword() );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Sep is a subroutine to print the separator "-1" if the
 | 
			
		||||
*	chosen format is UGLY.  The parameter is the counter for
 | 
			
		||||
*	the appropriate level.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void sep(int *x)
 | 
			
		||||
{
 | 
			
		||||
  if ( *x ) {
 | 
			
		||||
    if ( theJob->tty_out==UGLY ) printf(" -1\n");
 | 
			
		||||
    if ( theJob->fil_out==UGLY ) fprintf(outfil, " -1\n");
 | 
			
		||||
    *x = 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Next_bit returns 1 or 0 depending on the next bit in the
 | 
			
		||||
*	input file. This is to allow very compressed data to be used.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
int next_bit()
 | 
			
		||||
{
 | 
			
		||||
  if ( input_bit == 8 ) {
 | 
			
		||||
    if ( read(infil,&buffa,1) < 1 ) return 0;
 | 
			
		||||
    input_bit = 0;
 | 
			
		||||
  }
 | 
			
		||||
  if ( buffa & ((char)1 << input_bit++) ) return 1;
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Return the new size, or 0 if there isn't one.
 | 
			
		||||
*	The values of T and F are incidentally set at this stage.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
int got_siz()
 | 
			
		||||
{ 
 | 
			
		||||
  if ( theJob->f_n )
 | 
			
		||||
    sep( &negno );
 | 
			
		||||
  else	sep( &ordno );
 | 
			
		||||
  if ( next_bit() ) siz++; else siz = 0;
 | 
			
		||||
  if ( tr_par.done || siz>=theJob->sizmax ) siz = 0;
 | 
			
		||||
  if ( theJob->f_T ) theJob->form[VMAX+2].val = siz;
 | 
			
		||||
  if ( theJob->f_F ) theJob->form[VMAX+3].val = 0;
 | 
			
		||||
  return siz;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Set the next negation table.
 | 
			
		||||
*	Return 1 if successful, 0 if not.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
boolean got_neg()
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  sep(&ordno);
 | 
			
		||||
  if ( tr_par.done || !next_bit() ) return false;
 | 
			
		||||
  if ( N[0] ) {
 | 
			
		||||
    FORaLL(i)
 | 
			
		||||
      if ( N[i] > i ) break;
 | 
			
		||||
    N[N[i]] = N[i];
 | 
			
		||||
    N[i] = i;
 | 
			
		||||
  }
 | 
			
		||||
  else FORALL(i) N[i] = siz-i;
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Read the next order table.
 | 
			
		||||
*	Return 1 if successful, 0 if not.
 | 
			
		||||
*	At this stage, decide which elements are maximal, define
 | 
			
		||||
*	lattice meet and join if they exist, and set up cc, the
 | 
			
		||||
*	index to the communication vector of transref.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
boolean got_ord()
 | 
			
		||||
{
 | 
			
		||||
  int i, j, k;
 | 
			
		||||
 | 
			
		||||
  sep( &desno ); 
 | 
			
		||||
  if ( tr_par.done || !next_bit() ) return false;
 | 
			
		||||
 | 
			
		||||
  FORALL(i)  FORALL(j)
 | 
			
		||||
    if ( i < j ) ord[i][j] = next_bit();
 | 
			
		||||
    else ord[i][j] = (i == j);
 | 
			
		||||
 | 
			
		||||
  FORALL(i) {
 | 
			
		||||
    maximal[i] = 1;
 | 
			
		||||
    for ( j = i+1; j <=siz; j++ ) maximal[i] *= !ord[i][j];
 | 
			
		||||
  }
 | 
			
		||||
  if ( theJob->f_lat ) {
 | 
			
		||||
    FORALL(i) {
 | 
			
		||||
      for ( j = i; j <= siz; j++ ) {
 | 
			
		||||
	for (k = j; !(ord[i][k] && ord[j][k]); k++) ;
 | 
			
		||||
	A[i][j] = A[j][i] = k;
 | 
			
		||||
	for (k = i; !(ord[k][i] && ord[k][j]); k--) ;
 | 
			
		||||
	K[i][j] = K[j][i] = k;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  set_up_cc();
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Read the next choice of designated values, or of least
 | 
			
		||||
*	designated value if t is defined.
 | 
			
		||||
*	Return 1 on success, 0 on failure.
 | 
			
		||||
*
 | 
			
		||||
*	The set of designated (true) values can be calculated
 | 
			
		||||
*	here, and the values of t and f filled in.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
boolean got_des()
 | 
			
		||||
{ 
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  if ( matsum ) {
 | 
			
		||||
    if ( theJob->tty_out == SUMMARY ) {
 | 
			
		||||
      printf("     %d matri%s", 
 | 
			
		||||
	     matsum, (matsum>1? "ces": "x"));
 | 
			
		||||
      fflush(stdout);
 | 
			
		||||
    }
 | 
			
		||||
    if ( theJob->fil_out == SUMMARY ) 
 | 
			
		||||
      fprintf(outfil, "     %d matri%s",
 | 
			
		||||
	      matsum, (matsum>1? "ces": "x"));
 | 
			
		||||
    matsum = 0;
 | 
			
		||||
  }
 | 
			
		||||
  sep( &matno );
 | 
			
		||||
 | 
			
		||||
  if ( tr_par.done || !next_bit() ) return false;
 | 
			
		||||
  FORALL(i) desig[i] = next_bit();
 | 
			
		||||
 | 
			
		||||
  for ( des = 0; !desig[des]; des++ ) ;
 | 
			
		||||
  for ( undes = siz; desig[undes]; undes-- ) ;
 | 
			
		||||
  if ( theJob->f_t ) {
 | 
			
		||||
    theJob->form[VMAX].val = des;
 | 
			
		||||
    if ( theJob->f_n ) theJob->form[VMAX+1].val = N[des];
 | 
			
		||||
  }
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
======================================================================
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*  That's the end of the input routines.  Now for the output ones.
 | 
			
		||||
*
 | 
			
		||||
*  Mat_print is called from the tester with each good matrix.
 | 
			
		||||
*/
 | 
			
		||||
  
 | 
			
		||||
void mat_print()
 | 
			
		||||
{
 | 
			
		||||
  int i, j;
 | 
			
		||||
  boolean b;
 | 
			
		||||
 | 
			
		||||
  firstchange = -1;
 | 
			
		||||
  for ( i = 0; i < tr_par.vlength; i++ ) {
 | 
			
		||||
    if ( thisvector[i] != thatvector[i] ) firstchange = i;
 | 
			
		||||
    thatvector[i] = thisvector[i];
 | 
			
		||||
  }
 | 
			
		||||
  if ( !matno ) firstchange = tr_par.vlength;
 | 
			
		||||
  if ( firstchange < 0 ) skipout("Same matrix found twice",SKIP);
 | 
			
		||||
 | 
			
		||||
  j = -1;
 | 
			
		||||
  for ( i = 0; theJob->dcs[i]; i++ );
 | 
			
		||||
  for (--i; i >= 0; i--)
 | 
			
		||||
    if ( theJob->defcon[i] == PRIMITIVE ) {
 | 
			
		||||
      switch( theJob->adicity[i] ) {
 | 
			
		||||
      case 0:
 | 
			
		||||
	newmatplus( j, ucc0[i] );
 | 
			
		||||
	break;
 | 
			
		||||
      case 1:
 | 
			
		||||
	newmatplus( j, ucc1[i][0] );
 | 
			
		||||
	break;
 | 
			
		||||
      case 2:
 | 
			
		||||
	newmatplus( j, ucc2[i][0][0] );
 | 
			
		||||
      }
 | 
			
		||||
      j = i;
 | 
			
		||||
    }
 | 
			
		||||
  if ( theJob->f_nec ) {
 | 
			
		||||
    newmatplus( j, firstbox );
 | 
			
		||||
    if ( firstchange >= firstarrow ) sep(&boxno);
 | 
			
		||||
  }
 | 
			
		||||
  else newmatplus( j, firstarrow );
 | 
			
		||||
 | 
			
		||||
  b = true;
 | 
			
		||||
  for ( i = 0;  theJob->dcs[i]; i++ );
 | 
			
		||||
  for ( --i;  i>=0; i-- )
 | 
			
		||||
    if ( theJob->defcon[i] == PRIMITIVE )
 | 
			
		||||
      if ( matplus[i]++ ) {
 | 
			
		||||
	b = false;
 | 
			
		||||
	break;
 | 
			
		||||
      }
 | 
			
		||||
  if ( b && theJob->f_nec )
 | 
			
		||||
    if ( boxno++ ) b = false;
 | 
			
		||||
  if ( b )
 | 
			
		||||
    if ( !matno++ )
 | 
			
		||||
      if ( !desno++ )
 | 
			
		||||
	if ( !ordno++ )
 | 
			
		||||
	  if ( theJob->f_n )
 | 
			
		||||
	    negno++;
 | 
			
		||||
 | 
			
		||||
  good++;
 | 
			
		||||
  matsum++;
 | 
			
		||||
  if ( theJob->tty_out ) printup(stdout,theJob->tty_out);
 | 
			
		||||
  if ( theJob->fil_out ) printup(outfil,theJob->fil_out);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Essentially a macro for the above:
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void newmatplus(int x, int y)
 | 
			
		||||
{
 | 
			
		||||
  if ( firstchange >= y && x >= 0 ) sep(matplus+x);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Printing the new size is part of printing the new negation
 | 
			
		||||
*	table or, if negation is not defined, the new order table.
 | 
			
		||||
*	The parameter x is the output mode, and f the destination.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void siz_print(FILE *f, output_style x)
 | 
			
		||||
{
 | 
			
		||||
  switch(x) {
 | 
			
		||||
  case UGLY:
 | 
			
		||||
    fprintf(f, " %d\n", siz);
 | 
			
		||||
    break;
 | 
			
		||||
  case PRETTY:
 | 
			
		||||
    fprintf(f, "\n\n\n\n Size: %d\n", siz+1);
 | 
			
		||||
    break;
 | 
			
		||||
  case SUMMARY:
 | 
			
		||||
    fprintf(f, "\n\n\n Size: %d", siz+1);
 | 
			
		||||
  case NONE:
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Printing the new negation table is part of printing the new 
 | 
			
		||||
*	order table.
 | 
			
		||||
*	The parameter x is the output mode, and f the destination.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void neg_print(FILE *f, output_style x)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  if ( negno == 1 ) siz_print(f,x);
 | 
			
		||||
  switch(x) {
 | 
			
		||||
  case UGLY:
 | 
			
		||||
    FORALL(i) fprintf(f, " %d", N[i]);
 | 
			
		||||
    fprintf(f, "\n");
 | 
			
		||||
    break;
 | 
			
		||||
  case PRETTY:
 | 
			
		||||
    fprintf(f, "\n\n Negation table ");
 | 
			
		||||
    pretty_negno(f);
 | 
			
		||||
    fprintf(f, "\n\n         a |");
 | 
			
		||||
    FORALL(i) fprintf(f, " %x", i);
 | 
			
		||||
    fprintf(f, "\n        ---+");
 | 
			
		||||
    FORALL(i) fprintf(f, "--");  
 | 
			
		||||
    fprintf(f, "\n        ~a |");
 | 
			
		||||
    FORALL(i) fprintf(f, " %x", N[i]);
 | 
			
		||||
    fprintf(f, "\n");
 | 
			
		||||
    break;
 | 
			
		||||
  case SUMMARY:
 | 
			
		||||
    fprintf(f, "\n\n    Negation ");
 | 
			
		||||
    pretty_negno(f);
 | 
			
		||||
  case NONE:
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Printing the new order table is part of printing the new 
 | 
			
		||||
*	choice of designated values.
 | 
			
		||||
*	The parameter x is the output mode, and f the destination.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void ord_print(FILE *f, output_style x)
 | 
			
		||||
{
 | 
			
		||||
  int i, j;
 | 
			
		||||
 | 
			
		||||
  if ( ordno == 1 ) {
 | 
			
		||||
    if ( theJob->f_n ) neg_print(f,x);
 | 
			
		||||
    else siz_print(f,x);
 | 
			
		||||
  }
 | 
			
		||||
  switch(x) {
 | 
			
		||||
  case NONE:
 | 
			
		||||
    break;
 | 
			
		||||
  case UGLY:
 | 
			
		||||
    FORALL(i) FORALL(j) 
 | 
			
		||||
      fprintf(f, " %d", ord[i][j]); 
 | 
			
		||||
    fprintf(f, "\n");
 | 
			
		||||
    break;
 | 
			
		||||
  case PRETTY:
 | 
			
		||||
    fprintf(f, "\n\n Order ");
 | 
			
		||||
    pretty_ordno(f);
 | 
			
		||||
    fprintf(f, "\n\n         < |");
 | 
			
		||||
    FORALL(i) fprintf(f, " %x", i);
 | 
			
		||||
    fprintf(f, "\n         --+");
 | 
			
		||||
    FORALL(i) fprintf(f, "--");
 | 
			
		||||
    FORALL(i)
 | 
			
		||||
      {	fprintf(f, "\n%10x |", i);
 | 
			
		||||
      FORALL(j) 
 | 
			
		||||
	fprintf(f, " %c", (ord[i][j]? '+': '-'));
 | 
			
		||||
      }
 | 
			
		||||
    fprintf(f, "\n");
 | 
			
		||||
    break;
 | 
			
		||||
  case SUMMARY:
 | 
			
		||||
    fprintf(f, "\n\n       Order ");
 | 
			
		||||
    pretty_ordno(f);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Printing the new choice of designated values is part of 
 | 
			
		||||
*	printing the new implication matrix.
 | 
			
		||||
*	The parameter x is the output mode, and f the destination.
 | 
			
		||||
*
 | 
			
		||||
*	If t is defined only it is printed.  Otherwise the true
 | 
			
		||||
*	values are listed.  In ugly format, the boolean vector 
 | 
			
		||||
*	true (1 if value is designated, 0 if not) is printed.
 | 
			
		||||
*	Note that this convention for ugly output is different 
 | 
			
		||||
*	from that of MaGIC version 1.1 and causes incompatibility
 | 
			
		||||
*	with post-processing software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void des_print(FILE *f, output_style x)
 | 
			
		||||
{ 
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  if ( desno == 1 ) ord_print(f,x);
 | 
			
		||||
  switch(x) {
 | 
			
		||||
  case NONE:
 | 
			
		||||
    break;
 | 
			
		||||
  case UGLY:
 | 
			
		||||
    FORALL(i) fprintf(f, " %d", desig[i]); 
 | 
			
		||||
    fprintf(f, "\n" );
 | 
			
		||||
    break;
 | 
			
		||||
  case PRETTY:
 | 
			
		||||
    if ( theJob->f_t ) {
 | 
			
		||||
      fprintf(f, "\n\n Choice ");
 | 
			
		||||
      pretty_desno(f);
 | 
			
		||||
      fprintf(f, " of t:  %x\n", des);
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
      fprintf(f, "\n\n Choice ");
 | 
			
		||||
      pretty_desno(f);
 | 
			
		||||
      fprintf(f, " of truths:  ");
 | 
			
		||||
      FORALL(des) if ( desig[des] )
 | 
			
		||||
	fprintf(f, " %x", des);
 | 
			
		||||
      fprintf(f, "\n");
 | 
			
		||||
    }
 | 
			
		||||
    break;
 | 
			
		||||
  case SUMMARY:
 | 
			
		||||
    if ( theJob->f_t )
 | 
			
		||||
      fprintf(f, "\n\n          t = %x", des);
 | 
			
		||||
    else {
 | 
			
		||||
      fprintf(f, "\n\n          truth =");
 | 
			
		||||
      FORALL(des) if ( desig[des] )
 | 
			
		||||
	fprintf(f, " %x", des);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Printing the new implication matrix is part of printing
 | 
			
		||||
*	the new algebra.
 | 
			
		||||
*	The parameter x is the output mode, and f the destination.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void C_print(FILE *f, output_style x)
 | 
			
		||||
{
 | 
			
		||||
  int i, j;
 | 
			
		||||
 | 
			
		||||
  if ( matno == 1 ) des_print(f,x);
 | 
			
		||||
  switch(x) {
 | 
			
		||||
  case SUMMARY:
 | 
			
		||||
  case NONE:
 | 
			
		||||
    return;
 | 
			
		||||
  case UGLY:
 | 
			
		||||
    FORALL(i) FORALL(j) fprintf(f, " %d", C[i][j]);
 | 
			
		||||
    break;
 | 
			
		||||
  case PRETTY:
 | 
			
		||||
    fprintf(f, "\n\n Implication matrix ");
 | 
			
		||||
    pretty_matno(f);
 | 
			
		||||
 | 
			
		||||
    fprintf(f, "\n\n        -> |");
 | 
			
		||||
    FORALL(i) fprintf(f, " %x", i);
 | 
			
		||||
    fprintf(f, "\n        ---+");
 | 
			
		||||
    FORALL(i) fprintf(f, "--");
 | 
			
		||||
    FORALL(i) {
 | 
			
		||||
      fprintf(f, "\n%10x |", i);
 | 
			
		||||
      FORALL(j) fprintf(f, " %x", C[i][j]);
 | 
			
		||||
    }
 | 
			
		||||
    fprintf(f, "\n");
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Printing a new ! table may be part of printup.
 | 
			
		||||
*	The parameter x is the output mode, and f the destination.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void box_print(FILE *f, output_style x)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  switch(x) {
 | 
			
		||||
  case UGLY:
 | 
			
		||||
    FORALL(i) fprintf(f, " %d", box[i]);
 | 
			
		||||
    fprintf(f, "\n");
 | 
			
		||||
    break;
 | 
			
		||||
  case PRETTY:
 | 
			
		||||
    fprintf(f, "\n ! matrix ");
 | 
			
		||||
    pretty_boxno( f );
 | 
			
		||||
    fprintf(f, "\n\n         a |");
 | 
			
		||||
    FORALL(i) fprintf(f, " %x", i);
 | 
			
		||||
    fprintf(f, "\n        ---+");
 | 
			
		||||
    FORALL(i) fprintf(f, "--");  
 | 
			
		||||
    fprintf(f, "\n        !a |");
 | 
			
		||||
    FORALL(i) fprintf(f, " %x", box[i]);
 | 
			
		||||
    if ( theJob->f_n ) {
 | 
			
		||||
      fprintf(f, "\n        ?a |");
 | 
			
		||||
      FORALL(i) fprintf(f, " %x", diamond[i]);
 | 
			
		||||
    }
 | 
			
		||||
    fprintf(f, "\n");
 | 
			
		||||
    break;
 | 
			
		||||
  case SUMMARY:
 | 
			
		||||
  case NONE:
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Printing a nulladic user connective may be part of printup.
 | 
			
		||||
*	The parameter x is the output mode, and f the destination.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void u_print0(FILE *f, output_style x, int y)
 | 
			
		||||
{ 
 | 
			
		||||
  switch(x) {
 | 
			
		||||
  case UGLY:
 | 
			
		||||
    fprintf(f, " %d\n", nulladic[y]);
 | 
			
		||||
    break;
 | 
			
		||||
  case PRETTY:
 | 
			
		||||
    fprintf(f, "\n Choice ");
 | 
			
		||||
    pretty_umat( f, y );
 | 
			
		||||
    fprintf(f, " of %s:  %x\n", 
 | 
			
		||||
	    theJob->dcs[y]->s, nulladic[y]);
 | 
			
		||||
    break;
 | 
			
		||||
  case SUMMARY:
 | 
			
		||||
  case NONE:
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Printing a monadic user connective may be part of printup.
 | 
			
		||||
*	The parameter x is the output mode, and f the destination.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void u_print1(FILE *f, output_style x, int y)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  switch(x) {
 | 
			
		||||
  case UGLY:
 | 
			
		||||
    FORALL(i) fprintf(f, " %d", monadic[y][i]);
 | 
			
		||||
    fprintf(f, "\n");
 | 
			
		||||
    break;
 | 
			
		||||
  case PRETTY:
 | 
			
		||||
    fprintf(f, "\n %s matrix ", theJob->dcs[y]->s);
 | 
			
		||||
    pretty_umat( f, y );
 | 
			
		||||
    fprintf(f, "\n\n          ");
 | 
			
		||||
    for ( i = 0; i < strlen(theJob->dcs[y]->s); i++ )
 | 
			
		||||
      printf(" ");
 | 
			
		||||
    fprintf(f, "a |");
 | 
			
		||||
    FORALL(i) fprintf(f, " %x", i);
 | 
			
		||||
    fprintf(f, "\n        ----");
 | 
			
		||||
    for ( i = 0; i < strlen(theJob->dcs[y]->s); i++ )
 | 
			
		||||
      printf("-");
 | 
			
		||||
    fprintf(f, "+");
 | 
			
		||||
    FORALL(i) fprintf(f, "--");  
 | 
			
		||||
    fprintf(f, "\n        %s(a) |", theJob->dcs[y]->s);
 | 
			
		||||
    FORALL(i) fprintf(f, " %x", monadic[y][i]);
 | 
			
		||||
    fprintf(f, "\n");
 | 
			
		||||
    break;
 | 
			
		||||
  case SUMMARY:
 | 
			
		||||
  case NONE:
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
			
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Printing a dyadic user connective may be part of printup.
 | 
			
		||||
*	The parameter x is the output mode, and f the destination.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void u_print2(FILE *f, output_style x, int y)
 | 
			
		||||
{
 | 
			
		||||
  int i, j, k;
 | 
			
		||||
 | 
			
		||||
  switch(x) {
 | 
			
		||||
  case NONE:
 | 
			
		||||
  case SUMMARY:
 | 
			
		||||
    return;
 | 
			
		||||
  case UGLY:
 | 
			
		||||
    FORALL(i) FORALL(j)
 | 
			
		||||
      fprintf(f, " %d", dyadic[y][i][j]);
 | 
			
		||||
    break;
 | 
			
		||||
  case PRETTY:
 | 
			
		||||
    fprintf(f, "\n %s matrix ", theJob->dcs[y]->s);
 | 
			
		||||
    pretty_umat( f, y );
 | 
			
		||||
    fprintf(f, "\n\n                   %s |", 
 | 
			
		||||
	    theJob->dcs[y]->s);
 | 
			
		||||
    FORALL(i) fprintf(f, " %x", i);
 | 
			
		||||
    fprintf(f, "\n                  --");
 | 
			
		||||
    for ( i = 0; i < strlen(theJob->dcs[y]->s); i++ )
 | 
			
		||||
      printf("-");
 | 
			
		||||
    fprintf(f, "+");
 | 
			
		||||
    FORALL(i) fprintf(f, "--");
 | 
			
		||||
    FORALL(i) {
 | 
			
		||||
      fprintf(f, "\n");
 | 
			
		||||
      for ( k = 0; k < strlen(theJob->dcs[y]->s); k++ )
 | 
			
		||||
	printf(" ");
 | 
			
		||||
      fprintf(f, "%19x |", i);
 | 
			
		||||
      FORALL(j)
 | 
			
		||||
	fprintf(f, " %x", dyadic[y][i][j]);
 | 
			
		||||
    }
 | 
			
		||||
    fprintf(f, "\n");
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	This is the printup routine called with every good matrix.
 | 
			
		||||
*	The parameter x is the output mode, and f the destination.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void printup(FILE *f, output_style x)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  if ( firstchange >= firstarrow ) C_print(f,x);
 | 
			
		||||
  if ( theJob->f_nec && firstchange >= firstbox ) box_print(f,x);
 | 
			
		||||
  for ( i = 0; theJob->dcs[i]; i++ )
 | 
			
		||||
    if ( theJob->defcon[i] == PRIMITIVE )
 | 
			
		||||
      switch( theJob->adicity[i] ) {
 | 
			
		||||
      case 0:
 | 
			
		||||
	if ( firstchange >= ucc0[i] )
 | 
			
		||||
	u_print0(f,x,i);
 | 
			
		||||
      break;
 | 
			
		||||
      case 1:
 | 
			
		||||
	if (firstchange >= ucc1[i][0] )
 | 
			
		||||
	u_print1(f,x,i);
 | 
			
		||||
	break;
 | 
			
		||||
      case 2:
 | 
			
		||||
	if (firstchange >= ucc2[i][0][0] )
 | 
			
		||||
	  u_print2(f,x,i);
 | 
			
		||||
      }
 | 
			
		||||
  if ( x == PRETTY ) {
 | 
			
		||||
    if ( theJob->failure ) fail_print(f);
 | 
			
		||||
    fprintf(f, "\n");
 | 
			
		||||
    fflush(f);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	This is the series of functions for pretty-printing the
 | 
			
		||||
*	matrix numbers.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void pretty_size(FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  fprintf( f, "%d", siz+1 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void pretty_negno(FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  pretty_size(f);
 | 
			
		||||
  fprintf( f, ".%d", negno );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void pretty_ordno(FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  if ( theJob->f_n )
 | 
			
		||||
    pretty_negno(f);
 | 
			
		||||
  else	pretty_size(f);
 | 
			
		||||
  fprintf( f, ".%d", ordno );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void pretty_desno(FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  pretty_ordno(f);
 | 
			
		||||
  fprintf( f, ".%d", desno );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void pretty_matno(FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  pretty_desno(f);
 | 
			
		||||
  fprintf( f, ".%d", matno );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void pretty_boxno(FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  pretty_matno(f);
 | 
			
		||||
  if ( theJob->f_nec ) fprintf( f, ".%d", boxno );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * DOES NOT LOOK RIGHT AT ALL
 | 
			
		||||
 *
 | 
			
		||||
void pretty_umat(FILE *f, int x)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  for ( i = x-1; i >= 0; i-- )
 | 
			
		||||
    if ( theJob->defcon[i] == PRIMITIVE ) {
 | 
			
		||||
      pretty_umat( f, i );
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
  if ( i < 0 ) pretty_matno(f);
 | 
			
		||||
  fprintf( f, ".%d", matplus[x] );
 | 
			
		||||
}
 | 
			
		||||
 *
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void pretty_umat(FILE *f, int x)
 | 
			
		||||
{
 | 
			
		||||
  if ( x < 0 ) pretty_boxno(f);
 | 
			
		||||
  else {
 | 
			
		||||
    pretty_umat(f,x-1);
 | 
			
		||||
    if ( theJob->defcon[x] == PRIMITIVE )
 | 
			
		||||
      fprintf( f, ".%d", matplus[x] );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	The assignment of values failing the bad guy is appended to 
 | 
			
		||||
*	each structure recorded in pretty format.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void fail_print(FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  insert_badvalues( theJob->failure );
 | 
			
		||||
  fprintf(f,"\n Failure: ");
 | 
			
		||||
  outformula( theJob->failure, theJob->failure, f, VALS );
 | 
			
		||||
  fprintf(f,"\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void insert_badvalues( int offset )
 | 
			
		||||
{
 | 
			
		||||
  if ( !offset ) return;
 | 
			
		||||
  insert_badvalues( theJob->form[offset].lsub );
 | 
			
		||||
  insert_badvalues( theJob->form[offset].rsub );
 | 
			
		||||
  if ( offset <= Vmax ) theJob->form[offset].val = badvalue[offset];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	At the end of a job some runtime statistics are sent to
 | 
			
		||||
*	stdout.  Note that this is not done in batch mode.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void stats_print()
 | 
			
		||||
{
 | 
			
		||||
  int tim;
 | 
			
		||||
 | 
			
		||||
  CLoCK(&tim);
 | 
			
		||||
  printf("\n\n\n\n\n Matrices generated by MaGIC:  ");
 | 
			
		||||
  fflush(stdout);
 | 
			
		||||
  system("date");
 | 
			
		||||
  printf("\n\n Good ones found:   %d\n", good);
 | 
			
		||||
  printf(" Bad ones tested:   %d\n", tot-(good+isoms+isoms2));
 | 
			
		||||
  printf(" Isomorphs omitted: %d", isoms);
 | 
			
		||||
  if ( isoms2 ) printf(" + %d", isoms2);
 | 
			
		||||
#ifdef HASTIMES
 | 
			
		||||
  end_timer = time_buffer.tms_utime;
 | 
			
		||||
  printf("\n Time (cpu):        %1.2f seconds",
 | 
			
		||||
	 (end_timer - begin_timer)/(1.0*CLK_TCK));
 | 
			
		||||
#endif
 | 
			
		||||
  printf("\n Time (wall clock): %1.2f seconds\n\n\n", 
 | 
			
		||||
	 (tim - start_time)/(TICK*1.0));
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										184
									
								
								src/logic_pretest.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										184
									
								
								src/logic_pretest.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,184 @@
 | 
			
		|||
/*
 | 
			
		||||
*			logic_pretest.c		V2.1 (May 1993)
 | 
			
		||||
*
 | 
			
		||||
*	Most 2-refutations can be found before the search for matrices
 | 
			
		||||
*	starts.  The function find_twos does this.  As in the cases of
 | 
			
		||||
*	the test and setup routines, this process is very case-ridden.
 | 
			
		||||
*
 | 
			
		||||
*	When a 2-refutation is found, it is reported to transref by
 | 
			
		||||
*	means of the call new_two_ref.  Transref takes care of all the
 | 
			
		||||
*	processing, including making sure it is not a repeat of one 
 | 
			
		||||
*	already reported or subsumed by a 1-refutation.
 | 
			
		||||
*
 | 
			
		||||
*	As for set_poss, the parameter info is the vector of sets of
 | 
			
		||||
*	possible values.  It must not be changed by anything in this
 | 
			
		||||
*	file, as is is needed (and sometimes updated) by transref.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/****************************************************************
 | 
			
		||||
	*								*
 | 
			
		||||
	*			    MaGIC 2.1				*
 | 
			
		||||
	*								*
 | 
			
		||||
	*	    (C) 1993 Australian National University		*
 | 
			
		||||
	*								*
 | 
			
		||||
	* 		       All rights reserved			*
 | 
			
		||||
	*								*
 | 
			
		||||
	* The information in this software is subject to change without	*
 | 
			
		||||
	* notice and should not be construed as a commitment by the	*
 | 
			
		||||
	* Australian National University. The Australian National Uni-	*
 | 
			
		||||
	* versity makes no representations about the suitability of	*
 | 
			
		||||
	* this software for any purpose. It is supplied "as is" without	*
 | 
			
		||||
	* express or implied warranty.  If the software is modified in 	*
 | 
			
		||||
	* a manner creating derivative copyright rights, appropriate	*
 | 
			
		||||
	* legends may be placed on the derivative work in addition to	*
 | 
			
		||||
	* that set forth above.						*
 | 
			
		||||
	*								*
 | 
			
		||||
	* Permission to use, copy, modify and distribute this software	*
 | 
			
		||||
	* and its documentation for any purpose and without fee is	*
 | 
			
		||||
	* hereby granted, provided that both the above copyright notice	*
 | 
			
		||||
	* and this permission notice appear in all copies and sup-	*
 | 
			
		||||
	* porting documentation, and that the name of the Australian	*
 | 
			
		||||
	* National University not be used in advertising or publicity	*
 | 
			
		||||
	* pertaining to distribution of the software without specific,	*
 | 
			
		||||
	* written prior permission.					*
 | 
			
		||||
	*								*
 | 
			
		||||
	****************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "MaGIC.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static unsigned possval[SZ][SZ];
 | 
			
		||||
 | 
			
		||||
static trs Tpt;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void new_two_ref( int a, int x, int b, int y )
 | 
			
		||||
{
 | 
			
		||||
  int cells[3], vals[3];
 | 
			
		||||
  boolean valency[3];
 | 
			
		||||
 | 
			
		||||
  cells[0] = a;	vals[0] = x;	valency[0] = false;
 | 
			
		||||
  cells[1] = b;	vals[1] = y;	valency[1] = false;
 | 
			
		||||
  cells[2] = -1;	vals[2] = 0;	valency[2] = false;
 | 
			
		||||
  new_small_ref(cells, vals, valency, Tpt);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
boolean find_twos(unsigned info[], trs Tr)
 | 
			
		||||
{
 | 
			
		||||
  int i, j;
 | 
			
		||||
 | 
			
		||||
  FORALL(i) FORALL(j) possval[i][j] = info[impindex[i][j]];
 | 
			
		||||
  Tpt = Tr;
 | 
			
		||||
 | 
			
		||||
  if ( theJob->f_fus ) pretest_fus();
 | 
			
		||||
 | 
			
		||||
  for ( i = 1; i < AXMAX; i++ ) if ( taxiom[i] && TL[i].two_test )
 | 
			
		||||
    (*(TL[i].two_test))();
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
boolean find_twos_and_threes(unsigned info[], trs Tr)
 | 
			
		||||
{
 | 
			
		||||
  int i, j;
 | 
			
		||||
 | 
			
		||||
  FORALL(i) FORALL(j) possval[i][j] = info[impindex[i][j]];
 | 
			
		||||
  Tpt = Tr;
 | 
			
		||||
 | 
			
		||||
  if ( theJob->f_fus ) pretest_fus();
 | 
			
		||||
 | 
			
		||||
  for ( i = 1; i < AXMAX; i++ ) if ( taxiom[i] && TL[i].two_test )
 | 
			
		||||
    (*(TL[i].two_test))();
 | 
			
		||||
 | 
			
		||||
  for ( i = 1; i < AXMAX; i++ ) if ( taxiom[i] && TL[i].three_test )
 | 
			
		||||
    (*(TL[i].three_test))();
 | 
			
		||||
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void new_three_ref( int a, int x, int b, int y, int c, int z )
 | 
			
		||||
{
 | 
			
		||||
  int cells[4], vals[4];
 | 
			
		||||
  boolean valency[4];
 | 
			
		||||
 | 
			
		||||
  cells[0] = a;	vals[0] = x;	valency[0] = false;
 | 
			
		||||
  cells[1] = b;	vals[1] = y;	valency[1] = false;
 | 
			
		||||
  cells[2] = c;	vals[2] = z;	valency[2] = false;
 | 
			
		||||
  cells[3] = -1; vals[3] = 0;	valency[3] = false;
 | 
			
		||||
  new_small_ref(cells, vals, valency, Tpt);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Where m is maximal, a->m is maximal for all a. Also, if m1 and 
 | 
			
		||||
*	m2 are maximal and different then a->m1 and a->m2 are different.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void pretest_fus()
 | 
			
		||||
{
 | 
			
		||||
  int m1, m2, a, x;
 | 
			
		||||
 | 
			
		||||
  FORALL(m1) if ( maximal[m1] )
 | 
			
		||||
    for ( m2 = m1+1; m2 <= siz; m2++ ) if ( maximal[m2] )
 | 
			
		||||
      FORALL(x) if ( maximal[x] )
 | 
			
		||||
	FORALL(a) 
 | 
			
		||||
	  new_two_ref( impindex[a][m1], x, impindex[a][m2], x );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	For affixing, we need to look at possval, which is why this is here.
 | 
			
		||||
*	Report the incompatible pairs of values for a->b, c->d.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void affix_case(int a, int b, int c, int d)
 | 
			
		||||
{
 | 
			
		||||
  int i, j;
 | 
			
		||||
 | 
			
		||||
  FORALL(i) if ( IN(i,possval[a][b]) )
 | 
			
		||||
    FORALL(j) if ( IN(j,possval[c][d]) )
 | 
			
		||||
      if ( !ord[i][j] )
 | 
			
		||||
	new_two_ref( impindex[a][b], i, impindex[c][d], j );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void test_assertion()
 | 
			
		||||
{
 | 
			
		||||
  int i, j;
 | 
			
		||||
  int a, b;
 | 
			
		||||
 | 
			
		||||
  FORALL(a) FORALL(j) if ( !ord[a][j] )
 | 
			
		||||
    FORALL(i) if ( a != i || j == i )
 | 
			
		||||
      FORALL(b) if ( IN(i,possval[a][b]) && IN(j,possval[i][b]) )
 | 
			
		||||
	new_two_ref( impindex[a][b], i, impindex[i][b], j );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void test_contraction()
 | 
			
		||||
{
 | 
			
		||||
  int i, j;
 | 
			
		||||
  int a, b;
 | 
			
		||||
 | 
			
		||||
  FORALL(i) FORALL(j) if ( !ord[j][i] )
 | 
			
		||||
    FORALL(b) if ( i != b )
 | 
			
		||||
      FORALL(a) if ( IN(i,possval[a][b]) )
 | 
			
		||||
	if ( IN(j,possval[a][i]) )
 | 
			
		||||
	  new_two_ref( impindex[a][b], i, impindex[a][i], j );
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										530
									
								
								src/logic_set.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										530
									
								
								src/logic_set.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,530 @@
 | 
			
		|||
/*
 | 
			
		||||
*			logic_set.c		V2.1 (May 1993)
 | 
			
		||||
*
 | 
			
		||||
*	The procedures going with set_poss() called from the 
 | 
			
		||||
*	search.  Also pre_set() called from job_initial().
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/****************************************************************
 | 
			
		||||
	*								*
 | 
			
		||||
	*			    MaGIC 2.1				*
 | 
			
		||||
	*								*
 | 
			
		||||
	*	    (C) 1993 Australian National University		*
 | 
			
		||||
	*								*
 | 
			
		||||
	* 		       All rights reserved			*
 | 
			
		||||
	*								*
 | 
			
		||||
	* The information in this software is subject to change without	*
 | 
			
		||||
	* notice and should not be construed as a commitment by the	*
 | 
			
		||||
	* Australian National University. The Australian National Uni-	*
 | 
			
		||||
	* versity makes no representations about the suitability of	*
 | 
			
		||||
	* this software for any purpose. It is supplied "as is" without	*
 | 
			
		||||
	* express or implied warranty.  If the software is modified in 	*
 | 
			
		||||
	* a manner creating derivative copyright rights, appropriate	*
 | 
			
		||||
	* legends may be placed on the derivative work in addition to	*
 | 
			
		||||
	* that set forth above.						*
 | 
			
		||||
	*								*
 | 
			
		||||
	* Permission to use, copy, modify and distribute this software	*
 | 
			
		||||
	* and its documentation for any purpose and without fee is	*
 | 
			
		||||
	* hereby granted, provided that both the above copyright notice	*
 | 
			
		||||
	* and this permission notice appear in all copies and sup-	*
 | 
			
		||||
	* porting documentation, and that the name of the Australian	*
 | 
			
		||||
	* National University not be used in advertising or publicity	*
 | 
			
		||||
	* pertaining to distribution of the software without specific,	*
 | 
			
		||||
	* written prior permission.					*
 | 
			
		||||
	*								*
 | 
			
		||||
	****************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "MaGIC.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int vuloc[VMAX];         /* Local version of vu		*/
 | 
			
		||||
static int phi;                 /* The changeable subformula	*/
 | 
			
		||||
static int phicc;               /* Vector cell of phi		*/
 | 
			
		||||
static int phival;              /* The value of formula phi	*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Pre_set checks that such axioms as Excluded Middle are
 | 
			
		||||
*	satisfied, returning 0 (false) if not.  These principles
 | 
			
		||||
*	are the ones that can be checked without generating any
 | 
			
		||||
*	implication matrix, or even setting up a search space, 
 | 
			
		||||
*	so the search is avoided if they fail.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
boolean pre_set()
 | 
			
		||||
{
 | 
			
		||||
  int i,j;
 | 
			
		||||
 | 
			
		||||
  FORALL(i) {
 | 
			
		||||
    greater_than[i] = less_than[i] = 0;
 | 
			
		||||
    FORALL(j) {
 | 
			
		||||
      if ( ord[i][j] ) ADDTO(j,greater_than[i]);
 | 
			
		||||
      if ( ord[j][i] ) ADDTO(j,less_than[i]);
 | 
			
		||||
    }
 | 
			
		||||
    Greater_than[i] = (greater_than[i] & ~(1 << i));
 | 
			
		||||
    Less_than[i] = (less_than[i] & ~(1 << i));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  for ( i = 1; i < AXMAX; i++ )
 | 
			
		||||
    if ( theJob->axiom[i] && TL[i].zero_test )
 | 
			
		||||
      if (!(*(TL[i].zero_test))()) return false;
 | 
			
		||||
 | 
			
		||||
  if ( theJob->f_T )
 | 
			
		||||
    FORALL(i)
 | 
			
		||||
      if ( !ord[i][siz] ) return false;
 | 
			
		||||
  if ( theJob->f_F )
 | 
			
		||||
    FORALL(i)
 | 
			
		||||
      if ( !ord[0][i] )	return false;
 | 
			
		||||
 | 
			
		||||
  for ( i = 0; theJob->croot[i][0]; i++ )
 | 
			
		||||
    if ( ! kost[i] )
 | 
			
		||||
      if ( ! utest(i,0) ) return false;
 | 
			
		||||
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Utest returns true if the user-defined axiom or rule #x
 | 
			
		||||
*	is valid (preserves designation for all assignments to the
 | 
			
		||||
*	variables it involves).  It is assumed that changeable 
 | 
			
		||||
*	connectives are not involved.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
boolean utest(int x, unsigned info[])
 | 
			
		||||
{
 | 
			
		||||
  int i, j;
 | 
			
		||||
 | 
			
		||||
  if ( kost[x] > 1 ) return true;
 | 
			
		||||
 | 
			
		||||
  for ( i = 1; i <= Vmax; i++ ) {
 | 
			
		||||
    theJob->form[i].val = 0;
 | 
			
		||||
    vuloc[i] = 0;
 | 
			
		||||
  }
 | 
			
		||||
  phi = 0;
 | 
			
		||||
  phival = 0;
 | 
			
		||||
  FORALL(i) FORALL(j) C[i][j] = (ord[i][j]? des: undes);
 | 
			
		||||
  for ( i = 0; theJob->croot[x][i]; i++ )
 | 
			
		||||
    set_vuloc( theJob->croot[x][i], theJob->croot[x][i] );
 | 
			
		||||
  for ( i = 0; theJob->proot[x][i]; i++ )
 | 
			
		||||
    set_vuloc( theJob->proot[x][i], theJob->proot[x][i] );
 | 
			
		||||
  do	if ( badcase( x, info )) {
 | 
			
		||||
    if ( kost[x] ) REMOVE(phival,info[phicc]);
 | 
			
		||||
    else return false;
 | 
			
		||||
  }
 | 
			
		||||
  while	( anothercase(x) );
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	The following few functions implement the testing of zero
 | 
			
		||||
*	and one refutations in a rather crude but acceptable way.
 | 
			
		||||
*	First we record the variables used locally.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void set_vuloc(int r, int rr)
 | 
			
		||||
{
 | 
			
		||||
  int	i;
 | 
			
		||||
 | 
			
		||||
  if ( r < 0 ) return;
 | 
			
		||||
  if ( r < VMAX ) vuloc[r] = 1;
 | 
			
		||||
  else {
 | 
			
		||||
    set_vuloc(theJob->form[r].lsub,rr);
 | 
			
		||||
    set_vuloc(theJob->form[r].rsub,rr);
 | 
			
		||||
    if ( r != rr && !strcmp(theJob->form[r].sym->s,"->") )
 | 
			
		||||
      phi = r;
 | 
			
		||||
    else if ( r != rr && !strcmp(theJob->form[r].sym->s,"o") )
 | 
			
		||||
      phi = r;
 | 
			
		||||
    else if ( !strcmp(theJob->form[r].sym->s,"!") )
 | 
			
		||||
      phi = r;
 | 
			
		||||
    else for ( i = 0; theJob->dcs[i]; i++ )
 | 
			
		||||
      if ( theJob->form[r].sym == theJob->dcs[i] ) {
 | 
			
		||||
	if ( theJob->defcon[i] == PRIMITIVE )
 | 
			
		||||
	  phi = r;
 | 
			
		||||
	else set_vuloc(theJob->defcon[i],rr);
 | 
			
		||||
      }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	This tests the rule for one assignment of values to its
 | 
			
		||||
*	constituent atoms.  Note the returned value is 1 for a
 | 
			
		||||
*	failure of the rule and 0 for success.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
boolean badcase(int x, unsigned info[])
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  for ( i = 0; theJob->proot[x][i] > 0; i++ )
 | 
			
		||||
    if ( !desig[eval( theJob->proot[x][i], info )] ) return false;
 | 
			
		||||
  for ( i = 0; theJob->croot[x][i] > 0; i++ )
 | 
			
		||||
    if ( desig[eval( theJob->croot[x][i], info )] ) return false;
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Eval returns the current value of the subformula rooted
 | 
			
		||||
*	at r.  This is not a fast way of testing, but it will do.
 | 
			
		||||
*	Note that C is set up so that true cases get designated 
 | 
			
		||||
*	values and false cases undesignated ones.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
int eval(int r, unsigned z[])
 | 
			
		||||
{
 | 
			
		||||
  int dr, Ls, Rs;
 | 
			
		||||
  symb c;
 | 
			
		||||
 | 
			
		||||
  if ( r < 1 ) skipout("Attempt to test rubbish",SKIP);
 | 
			
		||||
  c = theJob->form[r].sym;
 | 
			
		||||
  if ( is_var(c) ) return theJob->form[r].val;
 | 
			
		||||
 | 
			
		||||
  Ls = theJob->form[r].lsub;
 | 
			
		||||
  Rs = theJob->form[r].rsub;
 | 
			
		||||
  if ( !strcmp(c->s,"->") ) {
 | 
			
		||||
    if ( r == phi ) {
 | 
			
		||||
      phicc = impindex[eval(Ls,z)][eval(Rs,z)];
 | 
			
		||||
      while ( phival < siz && !IN(phival,z[phicc]) )
 | 
			
		||||
	phival++;
 | 
			
		||||
      return phival;
 | 
			
		||||
    }
 | 
			
		||||
    return C[eval(Ls,z)][eval(Rs,z)];
 | 
			
		||||
  }
 | 
			
		||||
  if ( !c->s[1] ) switch( c->s[0] ) {
 | 
			
		||||
  case 'T':
 | 
			
		||||
    return siz;
 | 
			
		||||
  case 'F':
 | 
			
		||||
    return 0;
 | 
			
		||||
  case 't':
 | 
			
		||||
    return des;
 | 
			
		||||
  case 'f':
 | 
			
		||||
    return N[des];
 | 
			
		||||
  case '&':
 | 
			
		||||
    return K[eval(Ls,z)][eval(Rs,z)];
 | 
			
		||||
  case 'v':
 | 
			
		||||
    return A[eval(Ls,z)][eval(Rs,z)];
 | 
			
		||||
  case 'o':
 | 
			
		||||
    if ( r == phi ) {
 | 
			
		||||
      phicc = impindex[eval(Ls,z)][N[eval(Rs,z)]];
 | 
			
		||||
      while ( phival < siz && !IN(phival,z[phicc]) )
 | 
			
		||||
	phival++;
 | 
			
		||||
      return N[phival];
 | 
			
		||||
    }
 | 
			
		||||
    return N[C[eval(Ls,z)][N[eval(Rs,z)]]];
 | 
			
		||||
  case '~':
 | 
			
		||||
    return N[eval(Rs,z)];
 | 
			
		||||
  case '!':
 | 
			
		||||
    if ( r == phi ) {
 | 
			
		||||
      phicc = boxindex[eval(Rs,z)];
 | 
			
		||||
      while ( phival < siz && 
 | 
			
		||||
	      !IN(phival,z[phicc]) )
 | 
			
		||||
	phival++;
 | 
			
		||||
      return phival;
 | 
			
		||||
    }
 | 
			
		||||
    return box[eval(Rs,z)];
 | 
			
		||||
  }
 | 
			
		||||
  for ( dr = 0; theJob->dcs[dr] != theJob->form[r].sym; dr++ ) ;
 | 
			
		||||
  if ( r == phi ) {
 | 
			
		||||
    switch( theJob->adicity[dr] ) {
 | 
			
		||||
    case 0:
 | 
			
		||||
      phicc = ucc0[dr];
 | 
			
		||||
      break;
 | 
			
		||||
    case 1:
 | 
			
		||||
      phicc = ucc1[dr][eval(Rs,z)];
 | 
			
		||||
      break;
 | 
			
		||||
    case 2:
 | 
			
		||||
      phicc = ucc2[dr][eval(Ls,z)][eval(Rs,z)];
 | 
			
		||||
    }
 | 
			
		||||
    while ( phival < siz && !IN(phival,z[phicc]) )
 | 
			
		||||
      phival++;
 | 
			
		||||
    return phival;
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    if ( theJob->adicity[dr] == 1 )
 | 
			
		||||
      theJob->form[atom[0][dr]].val = eval(Rs,z);
 | 
			
		||||
    else if ( theJob->adicity[dr] == 2 ) {
 | 
			
		||||
      theJob->form[atom[0][dr]].val = eval(Ls,z);
 | 
			
		||||
      theJob->form[atom[1][dr]].val = eval(Rs,z);
 | 
			
		||||
    }
 | 
			
		||||
    return eval( theJob->defcon[dr], z );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int anothercase(int x)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  if ( kost[x] ) {
 | 
			
		||||
    if ( phival == siz ) phival = 0;
 | 
			
		||||
    else return ++phival;
 | 
			
		||||
  }
 | 
			
		||||
  for ( i = 1; i <= Vmax; i++ ) if ( vuloc[i] ) {
 | 
			
		||||
    if ( theJob->form[i].val == siz ) theJob->form[i].val = 0;
 | 
			
		||||
    else return ++(theJob->form[i].val);
 | 
			
		||||
  }
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Set_poss is called from transref when a search space is
 | 
			
		||||
*	being initialised.  The vector info will contain (as bit
 | 
			
		||||
*	vectors) supersets of the possible values for each cell.
 | 
			
		||||
*	Set_poss may take values out but should on no account 
 | 
			
		||||
*	put values in.  Since transref is allowed to split up
 | 
			
		||||
*	the seasrch space and search bits of it separately, this
 | 
			
		||||
*	function should not be based on any assumption about what
 | 
			
		||||
*	values will be present as possibilities.
 | 
			
		||||
*
 | 
			
		||||
*	The first values to be pruned away are those which are 
 | 
			
		||||
*	larger than siz, the maximum value.  The arrow matrix C
 | 
			
		||||
*	should also have only designated (true) values in cells
 | 
			
		||||
*	a -> b where ord[a][b], and only undesignated values in
 | 
			
		||||
*	cells a -> b where not ord[a][b].
 | 
			
		||||
*
 | 
			
		||||
*	Logic_poss trims off more values according to the 
 | 
			
		||||
*	postulates of the chosen logic and any pre-defined axioms
 | 
			
		||||
*	which have been selected.
 | 
			
		||||
*
 | 
			
		||||
*	In affixing logics (all except FD), affixing and the 
 | 
			
		||||
*	existence of fusion force more values out.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
boolean set_poss(unsigned info[], trs T)
 | 
			
		||||
{
 | 
			
		||||
  int i, j, k, pr;
 | 
			
		||||
  unsigned mask;
 | 
			
		||||
 | 
			
		||||
  pr = 0;
 | 
			
		||||
  for ( i = 0; theJob->dcs[i]; i++ ) ;
 | 
			
		||||
  while ( i ) {
 | 
			
		||||
    if ( theJob->defcon[--i] == PRIMITIVE ) {
 | 
			
		||||
      switch ( theJob->adicity[i] ) {
 | 
			
		||||
      case 0:	co_priority( ucc0[i], pr, T );		
 | 
			
		||||
	break;
 | 
			
		||||
      case 1:
 | 
			
		||||
	FORALL(j) 
 | 
			
		||||
	  co_priority( ucc1[i][j], pr, T );
 | 
			
		||||
	break;
 | 
			
		||||
      case 2:
 | 
			
		||||
	FORALL(j) FORALL(k)
 | 
			
		||||
	  co_priority( ucc2[i][j][k], pr, T );
 | 
			
		||||
      }
 | 
			
		||||
      pr++;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if ( theJob->f_nec )
 | 
			
		||||
    FORALL(i) co_priority( boxindex[i], pr, T );
 | 
			
		||||
  FORALL(i) FORALL(j) co_priority( impindex[i][j], pr+1, T );
 | 
			
		||||
 | 
			
		||||
  mask = 0;
 | 
			
		||||
  FORALL(i) ADDTO(i,mask);
 | 
			
		||||
  for ( i = 0; i < tr_par.vlength; i++ ) info[i] &= mask;
 | 
			
		||||
 | 
			
		||||
  FORALL(i) FORALL(j) FORALL(k)
 | 
			
		||||
    if IFF( (ord[i][j]),(!desig[k]) )
 | 
			
		||||
	    REMOVE(k,info[impindex[i][j]]);
 | 
			
		||||
 | 
			
		||||
  if ( !logic_poss(info) ) return 0;
 | 
			
		||||
  if ( theJob->f_fus ) fusion(info);
 | 
			
		||||
	
 | 
			
		||||
  for ( i = 0; theJob->croot[i][0]; i++ )
 | 
			
		||||
    if ( kost[i] == 1 ) utest( i, info );
 | 
			
		||||
 | 
			
		||||
  return 1; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Fusion requires that if m is any maximal element then any 
 | 
			
		||||
*	a->m is also maximal.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void fusion(unsigned info[])
 | 
			
		||||
{
 | 
			
		||||
  int m, x, a;
 | 
			
		||||
 | 
			
		||||
  FORALL(m) if ( maximal[m] )
 | 
			
		||||
    FORALL(x) if ( !maximal[x] )
 | 
			
		||||
      FORALL(a)
 | 
			
		||||
	REMOVE(x,info[impindex[a][m]]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	If permutation is selected, wherever ord[a][ b->c ] we must
 | 
			
		||||
*	have ord[b][ a->c ].  Hence if ord[a][x] for ALL or NONE of
 | 
			
		||||
*	the values for b->c, then we can remove from the values for
 | 
			
		||||
*	a->c any y such that !ord[b][y] or ord[b][y] respectively.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
boolean permutable(int a, int b, int c, unsigned info[])
 | 
			
		||||
{
 | 
			
		||||
  int k, m;
 | 
			
		||||
 | 
			
		||||
  k = impindex[a][c];  m = impindex[b][c];
 | 
			
		||||
 | 
			
		||||
  if ( (greater_than[a] & info[m]) == info[m] )
 | 
			
		||||
    info[k] &= greater_than[b];
 | 
			
		||||
  if ( !(greater_than[a] & info[m]) )
 | 
			
		||||
    info[k] &= ~greater_than[b];
 | 
			
		||||
  if ( (greater_than[b] & info[k]) == info[k] )
 | 
			
		||||
    info[m] &= greater_than[a];
 | 
			
		||||
  if ( !(greater_than[b] & info[k]) )
 | 
			
		||||
    info[m] &= ~greater_than[a];
 | 
			
		||||
 | 
			
		||||
  return( info[k] != 0 && info[m] != 0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	This function calls the above cases as required, according
 | 
			
		||||
*	to the axioms selected.  Some additional slightly messy 
 | 
			
		||||
*	features of C-type logics are additionally implemented.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
boolean logic_poss(unsigned info[])
 | 
			
		||||
{
 | 
			
		||||
  int i, j, k;
 | 
			
		||||
 | 
			
		||||
  if ( theJob->logic==R )
 | 
			
		||||
    TaT(info);
 | 
			
		||||
  if ( (theJob->logic==RW || theJob->logic==LIN)
 | 
			
		||||
       && theJob->f_n && theJob->f_lat )
 | 
			
		||||
    RWX(info);
 | 
			
		||||
 | 
			
		||||
  for ( i = 1; i < AXMAX; i++)
 | 
			
		||||
    if ( theJob->axiom[i] && TL[i].one_test )
 | 
			
		||||
      (*(TL[i].one_test))(info);
 | 
			
		||||
 | 
			
		||||
  if ( afx && ( theJob->axiom[AxC] || theJob->axiom[AxC2] ))
 | 
			
		||||
    FORALL(i) FORALL(j) if ( i < j )
 | 
			
		||||
      FORALL(k) 
 | 
			
		||||
	if ( !permutable( i, j, k, info ) )
 | 
			
		||||
	  return false;
 | 
			
		||||
  return (*info != 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	The axioms valid in the chosen logic are set or unset
 | 
			
		||||
*	here according to whether the parameter x is 1 or 0.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#define TUNSET(axm) taxiom[axm] = 0
 | 
			
		||||
 | 
			
		||||
void logic_axioms(boolean x)
 | 
			
		||||
{
 | 
			
		||||
  AXIOM ax;
 | 
			
		||||
 | 
			
		||||
  if ( theJob->f_n && theJob->logic != FD )
 | 
			
		||||
    theJob->axiom[AxFN] = x;
 | 
			
		||||
 | 
			
		||||
  for ( ax = AxNull; ax < AXMAX; ax++ )
 | 
			
		||||
    if ( valid[theJob->logic][ax] )
 | 
			
		||||
      theJob->axiom[ax] = x;
 | 
			
		||||
 | 
			
		||||
  for ( ax = AxNull; ax < AXMAX; ax++ ) {
 | 
			
		||||
    if ( strchr(ax_string[ax],'~') && !theJob->f_n )
 | 
			
		||||
      theJob->axiom[ax] = 0;
 | 
			
		||||
    if ( strchr(ax_string[ax],'&') && !theJob->f_lat )
 | 
			
		||||
      theJob->axiom[ax] = 0;
 | 
			
		||||
    if ( strchr(ax_string[ax],'v') && !theJob->f_lat )
 | 
			
		||||
      theJob->axiom[ax] = 0;
 | 
			
		||||
    if ( strchr(ax_string[ax],'o') && !theJob->f_fus )
 | 
			
		||||
      theJob->axiom[ax] = 0;
 | 
			
		||||
    if ( strchr(ax_string[ax],'!') && !theJob->f_nec )
 | 
			
		||||
      theJob->axiom[ax] = 0;
 | 
			
		||||
    if ( strchr(ax_string[ax],'t') && !theJob->f_t )
 | 
			
		||||
      theJob->axiom[ax] = 0;
 | 
			
		||||
    if ( strchr(ax_string[ax],'f') && !(theJob->f_t && theJob->f_n) )
 | 
			
		||||
      theJob->axiom[ax] = 0;
 | 
			
		||||
    if ( strchr(ax_string[ax],'T') && !theJob->f_T )
 | 
			
		||||
      theJob->axiom[ax] = 0;
 | 
			
		||||
    if ( strchr(ax_string[ax],'F') && !theJob->f_F )
 | 
			
		||||
      theJob->axiom[ax] = 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (x) efficient_logic_set();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	The above sets all the axioms valid in a particular logic
 | 
			
		||||
*	- for example, so that they are not printed.  For the search
 | 
			
		||||
*	however, it is much more efficient only to test a few of them
 | 
			
		||||
*	as selected by this function.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void efficient_logic_set()
 | 
			
		||||
{
 | 
			
		||||
  AXIOM ax;
 | 
			
		||||
 | 
			
		||||
  for ( ax = AxNull; ax < AXMAX; ax++ )
 | 
			
		||||
    taxiom[ax] = theJob->axiom[ax];
 | 
			
		||||
 | 
			
		||||
  switch(theJob->logic) {
 | 
			
		||||
  case Null_logic:
 | 
			
		||||
  case FD:
 | 
			
		||||
  case B:
 | 
			
		||||
  case DW:
 | 
			
		||||
  case TW:
 | 
			
		||||
  case EW:
 | 
			
		||||
  case T:
 | 
			
		||||
  case LOGMAX:
 | 
			
		||||
    break;
 | 
			
		||||
  case R:
 | 
			
		||||
  case RW: 
 | 
			
		||||
  case LIN: 
 | 
			
		||||
  case CK:
 | 
			
		||||
    taxiom[AxB2] = false;
 | 
			
		||||
  case S4: 
 | 
			
		||||
  case E:
 | 
			
		||||
    taxiom[AxWB] = false;
 | 
			
		||||
    taxiom[AxB] = false;
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( theJob->axiom[AxC] )
 | 
			
		||||
    taxiom[AxC2] = true;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										362
									
								
								src/logic_test.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										362
									
								
								src/logic_test.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,362 @@
 | 
			
		|||
/*
 | 
			
		||||
*			logic_test.c		V2.1 (May 1993)
 | 
			
		||||
*
 | 
			
		||||
*	This is the "test" module for MaGIC.  Good_matrix is 
 | 
			
		||||
*	called from transref, and the rest of this file contains
 | 
			
		||||
*	only what depends on it (with the exception of functions
 | 
			
		||||
*	for removing isomorphs and for printing matrices, which
 | 
			
		||||
*	are in other files).
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/****************************************************************
 | 
			
		||||
	*								*
 | 
			
		||||
	*			    MaGIC 2.1				*
 | 
			
		||||
	*								*
 | 
			
		||||
	*	    (C) 1993 Australian National University		*
 | 
			
		||||
	*								*
 | 
			
		||||
	* 		       All rights reserved			*
 | 
			
		||||
	*								*
 | 
			
		||||
	* The information in this software is subject to change without	*
 | 
			
		||||
	* notice and should not be construed as a commitment by the	*
 | 
			
		||||
	* Australian National University. The Australian National Uni-	*
 | 
			
		||||
	* versity makes no representations about the suitability of	*
 | 
			
		||||
	* this software for any purpose. It is supplied "as is" without	*
 | 
			
		||||
	* express or implied warranty.  If the software is modified in 	*
 | 
			
		||||
	* a manner creating derivative copyright rights, appropriate	*
 | 
			
		||||
	* legends may be placed on the derivative work in addition to	*
 | 
			
		||||
	* that set forth above.						*
 | 
			
		||||
	*								*
 | 
			
		||||
	* Permission to use, copy, modify and distribute this software	*
 | 
			
		||||
	* and its documentation for any purpose and without fee is	*
 | 
			
		||||
	* hereby granted, provided that both the above copyright notice	*
 | 
			
		||||
	* and this permission notice appear in all copies and sup-	*
 | 
			
		||||
	* porting documentation, and that the name of the Australian	*
 | 
			
		||||
	* National University not be used in advertising or publicity	*
 | 
			
		||||
	* pertaining to distribution of the software without specific,	*
 | 
			
		||||
	* written prior permission.					*
 | 
			
		||||
	*								*
 | 
			
		||||
	****************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "MaGIC.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	The logic of Good_matrix, schematically, is as follows.
 | 
			
		||||
*
 | 
			
		||||
*		Translate the communication vector info into
 | 
			
		||||
*		testable data structures.
 | 
			
		||||
*		If these fail to satisfy some postulate
 | 
			
		||||
*			Report the refutation just found to the
 | 
			
		||||
*			search controller.
 | 
			
		||||
*			return FALSE.
 | 
			
		||||
*		endif
 | 
			
		||||
*		If the badguy (if any) fails
 | 
			
		||||
*			If the structure is not isomorphic
 | 
			
		||||
*			to any already generated
 | 
			
		||||
*				Print the matrix.
 | 
			
		||||
*			endif
 | 
			
		||||
*		endif
 | 
			
		||||
*		return TRUE.
 | 
			
		||||
*
 | 
			
		||||
*	The pre-defined axioms, including those defining the logic,
 | 
			
		||||
*	are tested first.  Then any user-defined ones are tested.
 | 
			
		||||
*
 | 
			
		||||
*	Before that, however, check to see that the break conditions
 | 
			
		||||
*	are not met.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
boolean Good_matrix(unsigned info[], trs T)
 | 
			
		||||
{
 | 
			
		||||
	int ti;  
 | 
			
		||||
 | 
			
		||||
	if ( theJob->maxmat && good == theJob->maxmat) tr_par.done = true;
 | 
			
		||||
	if ( tr_par.done ) return true;
 | 
			
		||||
 | 
			
		||||
	tot++; 
 | 
			
		||||
	vect_into_C(info);
 | 
			
		||||
  
 | 
			
		||||
	for ( ti = AxNull; ti < AXMAX; ti++ )
 | 
			
		||||
	if ( taxiom[ti] && TL[ti].many_test )
 | 
			
		||||
        if ( !(*(TL[ti].many_test))(T) )	return false;
 | 
			
		||||
	if ( !fus_test(T) )			return false;
 | 
			
		||||
	if ( !axtest(T) )			return false;
 | 
			
		||||
	if ( theJob->failure && !got_a_fail ) {
 | 
			
		||||
		no_ref( T );			return false;
 | 
			
		||||
	}
 | 
			
		||||
	if ( isomorphic(istak,T) )		return true;
 | 
			
		||||
	mat_print();
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Translate the communication vector into testable data structures.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void vect_into_C(unsigned info[])
 | 
			
		||||
{
 | 
			
		||||
	register int	
 | 
			
		||||
		i, j;
 | 
			
		||||
	int	k;
 | 
			
		||||
 | 
			
		||||
	FORALL(i) FORALL(j) C[i][j] = info[impindex[i][j]];
 | 
			
		||||
	if ( theJob->f_nec )
 | 
			
		||||
	FORALL(i) box[i] = info[boxindex[i]];
 | 
			
		||||
	for ( k = 0; theJob->dcs[k]; k++ )
 | 
			
		||||
	if ( theJob->defcon[k] == PRIMITIVE )
 | 
			
		||||
	switch( theJob->adicity[k] ) {
 | 
			
		||||
		case 0:	nulladic[k] = theJob->form[VMAX+4+k].val
 | 
			
		||||
			= info[ucc0[k]];
 | 
			
		||||
			break;
 | 
			
		||||
		case 1:	FORALL(i) monadic[k][i] = info[ucc1[k][i]];
 | 
			
		||||
			break;
 | 
			
		||||
		case 2:	FORALL(i) FORALL(j)
 | 
			
		||||
			dyadic[k][i][j] = info[ucc2[k][i][j]];
 | 
			
		||||
	}
 | 
			
		||||
	for (i = 0; i < tr_par.vlength; i++) thisvector[i] = info[i];
 | 
			
		||||
	if ( theJob->f_n && theJob->f_nec )
 | 
			
		||||
		FORALL(i) diamond[i] = N[box[N[i]]];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Where fusion is stipulated to exist but is not definable,
 | 
			
		||||
*	it is necessary to test for it.  This tends to give large
 | 
			
		||||
*	refutations, so it is done as late as possible.
 | 
			
		||||
*
 | 
			
		||||
*	Defining fus[a][b] as the least x such that ord[a][C[b][x]],
 | 
			
		||||
*	check that this exists and is also least in the relation ord.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
boolean fus_test(trs T)
 | 
			
		||||
{ int i,j,k,m;
 | 
			
		||||
 | 
			
		||||
	if ( !theJob->f_fus ) return true;
 | 
			
		||||
	if ( theJob->axiom[AxC] && theJob->f_n ) {
 | 
			
		||||
		FORALL(i) FORALL(j) fus[i][j] = N[C[i][N[j]]]; 
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	FORaLL(i) FORaLL(j) {
 | 
			
		||||
		FORALL(fus[i][j]) 
 | 
			
		||||
		if ( ord[i][C[j][fus[i][j]]] ) break;
 | 
			
		||||
		if ( fus[i][j] > siz ) {
 | 
			
		||||
			FORALL(k) Ref( impindex[j][k], T );
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
		for ( k = fus[i][j]+1; k <= siz; k++ )
 | 
			
		||||
		if ( ord[i][C[j][k]] && !ord[fus[i][j]][k] ) {
 | 
			
		||||
			for ( m = 0; m <= fus[i][j]; m++ )
 | 
			
		||||
			Ref( impindex[j][m], T );
 | 
			
		||||
			Ref( impindex[j][k], T );
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Eventually it is necessary to test any user-defined axioms
 | 
			
		||||
*	and rules there may be.  This is much slower than testing
 | 
			
		||||
*	pre-defined ones.
 | 
			
		||||
*
 | 
			
		||||
*	The test given here is the stupidest imaginable, simply
 | 
			
		||||
*	making all assignments of values to variables and working
 | 
			
		||||
*	out the consequent values of all subformulas in each case.
 | 
			
		||||
*	It works fairly well, however, except when there are many
 | 
			
		||||
*	variables in use.  Then its stupidity trips it up badly, so
 | 
			
		||||
*	there is a case for using a more sophisticated algorithm 
 | 
			
		||||
*	where the task is large.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
boolean axtest(trs T)
 | 
			
		||||
{
 | 
			
		||||
	WFF *w;
 | 
			
		||||
	int i, j;
 | 
			
		||||
 | 
			
		||||
	got_a_fail = 0;
 | 
			
		||||
	if ( !**(theJob->croot) && !theJob->failure ) return true;
 | 
			
		||||
	if ( *(theJob->defcon) ) setcon();
 | 
			
		||||
	for ( i = 0; i < CMAX; i++ ) {
 | 
			
		||||
		theJob->form[atom[0][i]].val = 0;
 | 
			
		||||
		theJob->form[atom[1][i]].val = 0;
 | 
			
		||||
	}
 | 
			
		||||
	theJob->form[0].val = 0;
 | 
			
		||||
	for ( i = 1; i <= Vmax; i++ ) theJob->form[i].val = siz;
 | 
			
		||||
 | 
			
		||||
WORK:	for ( w = theJob->form+VMAX+4+(CMAX*3); w != tx; w++ )
 | 
			
		||||
	w->val = *(w->mtx + *(w->lv)*SZ + *(w->rv));
 | 
			
		||||
 | 
			
		||||
	for ( i = 0; theJob->croot[i][0]; i++ ) if ( kost[i] > 1 ) {
 | 
			
		||||
		if ( theJob->proot[i][0] != TRIVIAL ) {
 | 
			
		||||
			for ( j = 0; theJob->proot[i][j]; j++ )
 | 
			
		||||
			if ( !desig[theJob->form[theJob->proot[i][j]].val] )
 | 
			
		||||
				goto AX_OK;
 | 
			
		||||
		}
 | 
			
		||||
		if ( theJob->croot[i][0] != ABSURD ) {
 | 
			
		||||
			for ( j = 0; theJob->croot[i][j]; j++ )
 | 
			
		||||
			if ( desig[theJob->form[theJob->croot[i][j]].val] )
 | 
			
		||||
				goto AX_OK;
 | 
			
		||||
		}
 | 
			
		||||
		for ( j = 0; theJob->proot[i][j]; j++ )
 | 
			
		||||
		set_used( theJob->proot[i][j], T, true );
 | 
			
		||||
		for ( j = 0; theJob->croot[i][j]; j++ )
 | 
			
		||||
		set_used( theJob->croot[i][j], T, true );
 | 
			
		||||
		return false;
 | 
			
		||||
AX_OK:		;
 | 
			
		||||
	}
 | 
			
		||||
	if ( theJob->failure && !desig[theJob->form[theJob->failure].val] ) {
 | 
			
		||||
		got_a_fail = 1;
 | 
			
		||||
		for ( i = 1; i <= Vmax; i++ ) 
 | 
			
		||||
		badvalue[i] = rvu[i]? theJob->form[i].val: SZ;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for ( i = 1; i <= Vmax; i++ ) 
 | 
			
		||||
	if ( vu[i] )  {       
 | 
			
		||||
		if ( theJob->form[i].val ) {
 | 
			
		||||
			theJob->form[i].val--; 
 | 
			
		||||
			goto WORK;
 | 
			
		||||
		}
 | 
			
		||||
		theJob->form[i].val = siz;
 | 
			
		||||
	}
 | 
			
		||||
       
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Find the appeals to changeable values in subformula #x.
 | 
			
		||||
*	Topper is a flag saying whether this is the outermost
 | 
			
		||||
*	level (so that implications at that level can be read
 | 
			
		||||
*	as appeals to ord).
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void set_used(int x, trs T, boolean topper)
 | 
			
		||||
{
 | 
			
		||||
	int	i;
 | 
			
		||||
	WFF	*wf;
 | 
			
		||||
 | 
			
		||||
	if ( x <= 0 ) return;
 | 
			
		||||
	wf = theJob->form+x;
 | 
			
		||||
 | 
			
		||||
	set_used( wf->lsub, T, false );
 | 
			
		||||
	set_used( wf->rsub, T, false );
 | 
			
		||||
 | 
			
		||||
	if ( !strcmp(wf->sym->s,"->") && !topper ) 
 | 
			
		||||
		Ref( impindex[*(wf->lv)][*(wf->rv)], T );
 | 
			
		||||
	else if ( !strcmp(wf->sym->s,"!") )
 | 
			
		||||
		Ref( boxindex[*(wf->rv)], T );
 | 
			
		||||
	else if ( !strcmp(wf->sym->s,"?") )
 | 
			
		||||
		Ref( boxindex[N[*(wf->rv)]], T );
 | 
			
		||||
	else if ( !strcmp(wf->sym->s,"o") ) {
 | 
			
		||||
		if ( theJob->f_n && valid[theJob->logic][AxC] )
 | 
			
		||||
			Ref( impindex[*(wf->lv)][N[*(wf->rv)]], T ); 
 | 
			
		||||
		else for ( i = 0; i <= wf->val; i++ ) 
 | 
			
		||||
			Ref( impindex[*(wf->rv)][i], T );
 | 
			
		||||
	}
 | 
			
		||||
	else for ( i = 0; theJob->dcs[i]; i++ ) 
 | 
			
		||||
	if ( theJob->dcs[i] == wf->sym ) {
 | 
			
		||||
		if ( theJob->defcon[i] == PRIMITIVE )
 | 
			
		||||
		switch( theJob->adicity[i] ) {
 | 
			
		||||
			case 0:	Ref( ucc0[i], T );
 | 
			
		||||
				break;
 | 
			
		||||
			case 1:	Ref( ucc1[i][*(wf->rv)], T );
 | 
			
		||||
				break;
 | 
			
		||||
			case 2:	Ref( ucc2[i][*(wf->lv)][*(wf->rv)], T );
 | 
			
		||||
				break;
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
			if ( theJob->adicity[i] == 2 ) {
 | 
			
		||||
				theJob->form[atom[0][i]].val
 | 
			
		||||
				= *(wf->lv);
 | 
			
		||||
				theJob->form[atom[1][i]].val
 | 
			
		||||
				= *(wf->rv);
 | 
			
		||||
			}
 | 
			
		||||
			else if ( theJob->adicity[i] == 1 ) 
 | 
			
		||||
			theJob->form[atom[0][i]].val = *(wf->rv);
 | 
			
		||||
			set_used(theJob->defcon[i], T, false);
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
	if ( wf->rsub )
 | 
			
		||||
	wf->val = *(wf->mtx + ((*(wf->lv))*SZ + *(wf->rv)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	The routine to derive matrices for defined connectives
 | 
			
		||||
*	calls the recursive getval as required.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void setcon()
 | 
			
		||||
{
 | 
			
		||||
	int	i, j, k, m;
 | 
			
		||||
 | 
			
		||||
	for ( i = 0; theJob->defcon[i]; i++ )
 | 
			
		||||
	if ( theJob->defcon[i] != PRIMITIVE )
 | 
			
		||||
	switch(theJob->adicity[i]) {
 | 
			
		||||
		case 0:
 | 
			
		||||
		nulladic[i] = theJob->form[VMAX+4+i].val = 
 | 
			
		||||
			getval(theJob->defcon[i]); 
 | 
			
		||||
		break;
 | 
			
		||||
		case 1:
 | 
			
		||||
		FORALL(j) {
 | 
			
		||||
			for ( m = 0; m < CMAX; m++ )
 | 
			
		||||
			theJob->form[atom[0][m]].val = j;
 | 
			
		||||
			monadic[i][j] = getval(theJob->defcon[i]);
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
		case 2:
 | 
			
		||||
		FORALL(j) {
 | 
			
		||||
			for  (m = 0; m < CMAX; m++ )
 | 
			
		||||
			theJob->form[atom[0][m]].val = j;
 | 
			
		||||
			FORALL(k) {
 | 
			
		||||
				for ( m = 0; m < CMAX; m++ )
 | 
			
		||||
				theJob->form[atom[1][m]].val = k;
 | 
			
		||||
				dyadic[i][j][k] = getval(theJob->defcon[i]);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Recursively generate the value of a subformula.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
int getval(int y)
 | 
			
		||||
{
 | 
			
		||||
	WFF *x;
 | 
			
		||||
 | 
			
		||||
	x = theJob->form + y;
 | 
			
		||||
 | 
			
		||||
	if ( x->rsub < 1 )
 | 
			
		||||
		return x->val;
 | 
			
		||||
	if ( x->lsub < 1 )
 | 
			
		||||
		return *(x->mtx + getval(x->rsub));
 | 
			
		||||
	return *(x->mtx + SZ*getval(x->lsub) + getval(x->rsub));
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										266
									
								
								src/mp_parse.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										266
									
								
								src/mp_parse.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,266 @@
 | 
			
		|||
/*
 | 
			
		||||
*			mp_parse.c		V2.1 (May 1993)
 | 
			
		||||
*
 | 
			
		||||
*	The parser for MaGIC and like programs.  This accepts
 | 
			
		||||
*	formulas in I Block normal form (that is, with our usual
 | 
			
		||||
*	conventions about scope, association to the left, dots
 | 
			
		||||
*	in place of parentheses etc.  See works of R.K. Meyer or
 | 
			
		||||
*	the author for details.  Actual scope ordering is passed
 | 
			
		||||
*	by means of the string cn which records the available 
 | 
			
		||||
*	connectives with the dyadic ones in scope order.
 | 
			
		||||
*
 | 
			
		||||
*	Programs such as minlog also use this parser, so although
 | 
			
		||||
*	for example WFF is defined in MaGIC.h it is defined again
 | 
			
		||||
*	here to make life easier at some points.  The WFF structure
 | 
			
		||||
*	must have at least the three fields specified here, though
 | 
			
		||||
*	of course it may have others if it is externally defined.
 | 
			
		||||
*
 | 
			
		||||
*	Note that formula #0 is regarded as the dummy, to be 
 | 
			
		||||
*	returned in case of failure.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/****************************************************************
 | 
			
		||||
	*								*
 | 
			
		||||
	*			    MaGIC 2.1				*
 | 
			
		||||
	*								*
 | 
			
		||||
	*	    (C) 1993 Australian National University		*
 | 
			
		||||
	*								*
 | 
			
		||||
	* 		       All rights reserved			*
 | 
			
		||||
	*								*
 | 
			
		||||
	* The information in this software is subject to change without	*
 | 
			
		||||
	* notice and should not be construed as a commitment by the	*
 | 
			
		||||
	* Australian National University. The Australian National Uni-	*
 | 
			
		||||
	* versity makes no representations about the suitability of	*
 | 
			
		||||
	* this software for any purpose. It is supplied "as is" without	*
 | 
			
		||||
	* express or implied warranty.  If the software is modified in 	*
 | 
			
		||||
	* a manner creating derivative copyright rights, appropriate	*
 | 
			
		||||
	* legends may be placed on the derivative work in addition to	*
 | 
			
		||||
	* that set forth above.						*
 | 
			
		||||
	*								*
 | 
			
		||||
	* Permission to use, copy, modify and distribute this software	*
 | 
			
		||||
	* and its documentation for any purpose and without fee is	*
 | 
			
		||||
	* hereby granted, provided that both the above copyright notice	*
 | 
			
		||||
	* and this permission notice appear in all copies and sup-	*
 | 
			
		||||
	* porting documentation, and that the name of the Australian	*
 | 
			
		||||
	* National University not be used in advertising or publicity	*
 | 
			
		||||
	* pertaining to distribution of the software without specific,	*
 | 
			
		||||
	* written prior permission.					*
 | 
			
		||||
	*								*
 | 
			
		||||
	****************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "MaGIC.h"
 | 
			
		||||
 | 
			
		||||
#define P_OK (c && c->s[0] != ')')
 | 
			
		||||
#define ERROR(sy,ws) { strcpy(P_ERR[0],(sy)->s); strcpy(P_ERR[1],ws); return 0; }
 | 
			
		||||
#define ERROR1(ws) { strcpy(P_ERR[0],""); strcpy(P_ERR[1],ws); return 0; }
 | 
			
		||||
 | 
			
		||||
static char P_ERR[2][32];
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Now for the parser.  It returns the offset of the successfully
 | 
			
		||||
*	parsed formula, or 0 if the parse attempt was unsuccessful.
 | 
			
		||||
*
 | 
			
		||||
*	s_parse (parse a subformula) is called to get the result.
 | 
			
		||||
*	Finally, if an error was recorded, it is output.
 | 
			
		||||
*
 | 
			
		||||
*	The parameters are the text to be parsed, the destination 
 | 
			
		||||
*	array of subformulas and the list of available connectives.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
int parse( symb fla[] )  
 | 
			
		||||
{
 | 
			
		||||
  int rc;
 | 
			
		||||
 | 
			
		||||
  rc = s_parse( fla );
 | 
			
		||||
  if ( !rc ) {
 | 
			
		||||
    if ( xdialog ) printf("E");
 | 
			
		||||
    printf("\n ERROR: \"%s\" %s",P_ERR[0],P_ERR[1]);
 | 
			
		||||
  }
 | 
			
		||||
  return rc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	S_parse parses successive subformulas which, separated by 
 | 
			
		||||
*	dyadic connectives, make up the string.  It then calls 
 | 
			
		||||
*	Finish to sort out the binary parsing according to the 
 | 
			
		||||
*	scope conventions.
 | 
			
		||||
*
 | 
			
		||||
*	This is a one-pass parser.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
int s_parse( symb fla[] )
 | 
			
		||||
{
 | 
			
		||||
  int sbf[20];		/* Dyadic-separated subformulas	*/
 | 
			
		||||
  int pptr=0;		/* Offset of current symbol	*/
 | 
			
		||||
  int oldptr;		/* Previous value of pptr 	*/
 | 
			
		||||
  int ns = 0;		/* "Next subformula"		*/
 | 
			
		||||
  int i,j;
 | 
			
		||||
  symb dcn[19];		/* Separating dyadics		*/
 | 
			
		||||
  symb c;
 | 
			
		||||
   
 | 
			
		||||
  c = *fla;
 | 
			
		||||
  while ( P_OK ) {
 | 
			
		||||
    oldptr = pptr;
 | 
			
		||||
    while ( symbol_listed(1,(c=fla[pptr++])) ) ;
 | 
			
		||||
    i = pptr-1;
 | 
			
		||||
    if ( is_var(c) || symbol_listed(0,c) )
 | 
			
		||||
      sbf[ns] = Loc(c, 0, 0);
 | 
			
		||||
    else if ( c->s[0] == '(' || c->s[0] == '.' ) {
 | 
			
		||||
      if ( !(sbf[ns] = s_parse( fla+pptr)) ) return 0;
 | 
			
		||||
      j = Match(fla+pptr-1);
 | 
			
		||||
      if ( !j ) return 0;
 | 
			
		||||
      pptr += j-1;
 | 
			
		||||
    }
 | 
			
		||||
    else	ERROR(fla[pptr-1]," can't begin a subformula");
 | 
			
		||||
    if ( symbol_listed(1,fla[oldptr]) )
 | 
			
		||||
      while ( i > oldptr ) 
 | 
			
		||||
	sbf[ns] = Loc(fla[--i], 0, sbf[ns]);
 | 
			
		||||
    c = fla[pptr];
 | 
			
		||||
    if ( P_OK ) {
 | 
			
		||||
      if ( symbol_listed(2,c) )
 | 
			
		||||
	dcn[ns++] = c;
 | 
			
		||||
      else ERROR(fla[pptr]," found where dyadic connective expected");
 | 
			
		||||
      c = fla[++pptr];
 | 
			
		||||
      if ( !P_OK)
 | 
			
		||||
	ERROR(fla[pptr]," found where subformula expected to start");
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return Finish(sbf, dcn, ns);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Return the offset of the right parenthesis matching the
 | 
			
		||||
*	left one at start.  Remember a dot is a left parenthesis
 | 
			
		||||
*	whose imaginary right mate is as far to the right as is
 | 
			
		||||
*	reasonable.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
int Match( symb start[] )
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  for ( i = 1; start[i] && start[i]->s[0] != ')'; i++ )
 | 
			
		||||
    if ( start[i]->s[0] == '(' )
 | 
			
		||||
      i += Match(start+i)-1;
 | 
			
		||||
  if ( start[0]->s[0] == '.' )
 | 
			
		||||
    return i;
 | 
			
		||||
  if ( !start[i] )
 | 
			
		||||
    ERROR1("Unmatched left parenthesis");
 | 
			
		||||
  return i+1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Given a formula A1 * .... * An where each Ai is a formula
 | 
			
		||||
*	and each * is some dyadic connective, turn it into a binary
 | 
			
		||||
*	wff tree as advertised in the definition of a formula.
 | 
			
		||||
*
 | 
			
		||||
*	Array subf holds the offsets of the main subformulas. The
 | 
			
		||||
*	corresponding connectives are in conn, while totl is the 
 | 
			
		||||
*	number of subformulas.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
int Finish( int subf[], symb conn[], int totl )
 | 
			
		||||
{
 | 
			
		||||
  int i, m = 0;
 | 
			
		||||
  int sk;
 | 
			
		||||
 | 
			
		||||
  if ( !totl ) return *subf;
 | 
			
		||||
  sk = 0;
 | 
			
		||||
  for (i = 0; i < totl; i++)
 | 
			
		||||
    if ( symbol_position(2,conn[i]) >= sk) {
 | 
			
		||||
      m = i;
 | 
			
		||||
      sk = symbol_position(2,conn[i]);
 | 
			
		||||
    }
 | 
			
		||||
  i = m+1;
 | 
			
		||||
  return Loc(conn[m],
 | 
			
		||||
	     Finish(subf, conn, m),
 | 
			
		||||
	     Finish(subf+i, conn+i, totl-i)
 | 
			
		||||
	     );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Locate the given formula in the stack of those already
 | 
			
		||||
*	parsed and return its offset.  If it is not already there
 | 
			
		||||
*	then add it and return its offset.
 | 
			
		||||
*
 | 
			
		||||
*	Note that in order to force variables to the bottom of the
 | 
			
		||||
*	stack of subformulas, there may be a section reserved for 
 | 
			
		||||
*	them with symbols initialised to '?'.  If not, never mind.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
int Loc( symb mn, int lft, int rgt )
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  for (i = 0; theJob->form[i].sym; i++)
 | 
			
		||||
    if ( theJob->form[i].sym == mn && theJob->form[i].lsub == lft
 | 
			
		||||
	 && theJob->form[i].rsub == rgt )
 | 
			
		||||
      return i;
 | 
			
		||||
 | 
			
		||||
    else if ( is_var(mn) && theJob->form[i].sym->s[0] == '.' )
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
  theJob->form[i].sym = mn; 
 | 
			
		||||
  theJob->form[i].lsub = lft;
 | 
			
		||||
  theJob->form[i].rsub = rgt;  
 | 
			
		||||
  return i;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	A variable is any lower-case letter that is not a connective.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
boolean is_var(symb x)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  for ( i = 0; i < 3; i++ )
 | 
			
		||||
    if ( symbol_listed(i,x) ) return 0;
 | 
			
		||||
  return (isalpha(x->s[0]) && !(x->s[1]));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Return the offset of symbol s in array theJob->symbol[x].
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
int symbol_position( int x, symb s )
 | 
			
		||||
{
 | 
			
		||||
	
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  for ( i = 0; theJob->symbol[x][i]; i++ )
 | 
			
		||||
    if ( theJob->symbol[x][i] == s ) return i;
 | 
			
		||||
  return -1;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										11
									
								
								src/nt_homomorphic.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/nt_homomorphic.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
#include "RM.h"
 | 
			
		||||
#include "hmi.h"
 | 
			
		||||
 | 
			
		||||
int main(int argc, char *argv[])
 | 
			
		||||
{
 | 
			
		||||
  if (argc != 2)
 | 
			
		||||
    Abort("synopsis: nt_homomorphic <file of algebras>",-1);
 | 
			
		||||
  relatemats(nt_homo, argv[1], "NontrivialHomomorphism");
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										94
									
								
								src/one_plus_t_gen.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								src/one_plus_t_gen.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,94 @@
 | 
			
		|||
 | 
			
		||||
#include "RM.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int tot_got;		/* Total of elements generated	*/
 | 
			
		||||
static int got[SZ];		/* Elements generated so far	*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int main( argc, argv )
 | 
			
		||||
int argc;
 | 
			
		||||
char *argv[];
 | 
			
		||||
{
 | 
			
		||||
  int option;
 | 
			
		||||
  PRINTMODE p = UGLY;
 | 
			
		||||
  int g2();
 | 
			
		||||
  int getopt();
 | 
			
		||||
 | 
			
		||||
  while ((option = getopt (argc, argv, "upt")) != -1)
 | 
			
		||||
    switch( option ) {
 | 
			
		||||
    case 'p': p = PRETTY;	break;
 | 
			
		||||
    case 't': p = TeX;
 | 
			
		||||
    }
 | 
			
		||||
  selectmats( g2, p );
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int g2(m)
 | 
			
		||||
MATRIX *m;
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
  int generator;
 | 
			
		||||
  int position = 0;
 | 
			
		||||
  void try();
 | 
			
		||||
 | 
			
		||||
  FORALL(m,generator) {
 | 
			
		||||
    FORALL(m,i) got[i] = 0;
 | 
			
		||||
    if (m->tee_exists) {
 | 
			
		||||
      got[m->tee] = 1;
 | 
			
		||||
      tot_got = 1;
 | 
			
		||||
    }
 | 
			
		||||
    else tot_got = 0;
 | 
			
		||||
    FORALLCON(m,i)
 | 
			
		||||
      if ( m->adicity[i] == 0 ) try( m, m->nulladic[i] );
 | 
			
		||||
    try( m, generator );
 | 
			
		||||
    if ( tot_got > m->siz ) {
 | 
			
		||||
      m->my_values[position] = generator;
 | 
			
		||||
      if ( position++ )
 | 
			
		||||
	strcpy( m->my_string, "Possible generators: ");
 | 
			
		||||
      else strcpy( m->my_string, "Generator: ");
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return( position > 0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void try(m,x)
 | 
			
		||||
MATRIX *m;
 | 
			
		||||
int x;
 | 
			
		||||
{
 | 
			
		||||
  int i, j;
 | 
			
		||||
 | 
			
		||||
  if ( got[x] ) return;
 | 
			
		||||
 | 
			
		||||
  got[x] = 1;
 | 
			
		||||
  tot_got++;
 | 
			
		||||
  if ( m->fragment[NEG] ) try( m, m->neg[x] );
 | 
			
		||||
  if ( m->fragment[BOX] ) try( m, m->box[x] );
 | 
			
		||||
  FORALLCON(m,i)
 | 
			
		||||
    if ( m->adicity[i] == 1 ) try( m, m->monadic[i][x] );
 | 
			
		||||
  FORALL(m,i) if ( got[i] ) {
 | 
			
		||||
    try( m, m->C[i][x] );
 | 
			
		||||
    try( m, m->C[x][i] );
 | 
			
		||||
    if ( m->fragment[LAT] ) {
 | 
			
		||||
      try( m, m->K[i][x] );
 | 
			
		||||
      try( m, m->A[i][x] );
 | 
			
		||||
    }
 | 
			
		||||
    if ( m->fragment[FUS] ) {
 | 
			
		||||
      try( m, m->fus[i][x] );
 | 
			
		||||
      try( m, m->fus[x][i] );
 | 
			
		||||
    }
 | 
			
		||||
    FORALLCON(m,j) {
 | 
			
		||||
      if ( m->adicity[j] == 2 )
 | 
			
		||||
	try( m, m->dyadic[j][i][x] );
 | 
			
		||||
      try( m, m->dyadic[j][x][i] );
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										152
									
								
								src/onegen.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										152
									
								
								src/onegen.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,152 @@
 | 
			
		|||
/*				One.c
 | 
			
		||||
*
 | 
			
		||||
*	This uses RM (Read Matrices) to read ugly output from 
 | 
			
		||||
*	MaGIC and calls a function "g1" to choose those matrices
 | 
			
		||||
*	generated by a single element using only the connectives
 | 
			
		||||
*	present in the fragment, with the exception of the normal
 | 
			
		||||
*	sentential constants.  The one-generated matrices are
 | 
			
		||||
*	printed out.  The print format may be changed from the 
 | 
			
		||||
*	default (UGLY) to PRETTY or TeX by means of the command
 | 
			
		||||
*	line switches "-p" or "-t".
 | 
			
		||||
*
 | 
			
		||||
*	For details of the matrix structures and other goodies 
 | 
			
		||||
*	defined in the header, see RM.h.  The following should be
 | 
			
		||||
*	fairly self-explanatory, however.  Note that my_values and
 | 
			
		||||
*	my_string are optional extras used by printmat.  These are 
 | 
			
		||||
*	re-initialised to <-1,-1,-1,....> and "" by mat_malloc.
 | 
			
		||||
*	Use strcpy to put a message in m->my_string.
 | 
			
		||||
*
 | 
			
		||||
*	Function g1 finds all the elements whose singletons generate
 | 
			
		||||
*	the algebra, records them in my_values and returns 1 to print
 | 
			
		||||
*	the matrix or 0 to suppress printing.
 | 
			
		||||
*
 | 
			
		||||
*	Try is the recursive procedure for adding new elements
 | 
			
		||||
*	to the array got[].  It is beside the point if element
 | 
			
		||||
*	x has already been generated.
 | 
			
		||||
*
 | 
			
		||||
*	Command line option -u (ugly) is allowed but has no effect
 | 
			
		||||
*	since UGLY is the default print mode.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/****************************************************************
 | 
			
		||||
	*								*
 | 
			
		||||
	*			    MaGIC 2.1				*
 | 
			
		||||
	*								*
 | 
			
		||||
	*	    (C) 1993 Australian National University		*
 | 
			
		||||
	*								*
 | 
			
		||||
	* 		       All rights reserved			*
 | 
			
		||||
	*								*
 | 
			
		||||
	* The information in this software is subject to change without	*
 | 
			
		||||
	* notice and should not be construed as a commitment by the	*
 | 
			
		||||
	* Australian National University. The Australian National Uni-	*
 | 
			
		||||
	* versity makes no representations about the suitability of	*
 | 
			
		||||
	* this software for any purpose. It is supplied "as is" without	*
 | 
			
		||||
	* express or implied warranty.  If the software is modified in 	*
 | 
			
		||||
	* a manner creating derivative copyright rights, appropriate	*
 | 
			
		||||
	* legends may be placed on the derivative work in addition to	*
 | 
			
		||||
	* that set forth above.						*
 | 
			
		||||
	*								*
 | 
			
		||||
	* Permission to use, copy, modify and distribute this software	*
 | 
			
		||||
	* and its documentation for any purpose and without fee is	*
 | 
			
		||||
	* hereby granted, provided that both the above copyright notice	*
 | 
			
		||||
	* and this permission notice appear in all copies and sup-	*
 | 
			
		||||
	* porting documentation, and that the name of the Australian	*
 | 
			
		||||
	* National University not be used in advertising or publicity	*
 | 
			
		||||
	* pertaining to distribution of the software without specific,	*
 | 
			
		||||
	* written prior permission.					*
 | 
			
		||||
	*								*
 | 
			
		||||
	****************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "RM.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int tot_got;		/* Total of elements generated	*/
 | 
			
		||||
static int got[SZ];		/* Elements generated so far	*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int main( argc, argv )
 | 
			
		||||
int argc;
 | 
			
		||||
char *argv[];
 | 
			
		||||
{
 | 
			
		||||
  int option;
 | 
			
		||||
  PRINTMODE p = UGLY;
 | 
			
		||||
  int g1();
 | 
			
		||||
  int getopt();
 | 
			
		||||
 | 
			
		||||
  while ((option = getopt (argc, argv, "upt")) != -1)
 | 
			
		||||
    switch( option ) {
 | 
			
		||||
    case 'p': p = PRETTY;	break;
 | 
			
		||||
    case 't': p = TeX;
 | 
			
		||||
    }
 | 
			
		||||
  selectmats( g1, p );
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int g1(m)
 | 
			
		||||
MATRIX *m;
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
  int generator;
 | 
			
		||||
  int position = 0;
 | 
			
		||||
  void try();
 | 
			
		||||
 | 
			
		||||
  FORALL(m,generator) {
 | 
			
		||||
    FORALL(m,i) got[i] = 0;
 | 
			
		||||
    tot_got = 0;
 | 
			
		||||
    FORALLCON(m,i)
 | 
			
		||||
      if ( m->adicity[i] == 0 ) try( m, m->nulladic[i] );
 | 
			
		||||
    try( m, generator );
 | 
			
		||||
    if ( tot_got > m->siz ) {
 | 
			
		||||
      m->my_values[position] = generator;
 | 
			
		||||
      if ( position++ )
 | 
			
		||||
	strcpy( m->my_string, "Possible generators: ");
 | 
			
		||||
      else strcpy( m->my_string, "Generator: ");
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return( position > 0 );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void try(m,x)
 | 
			
		||||
MATRIX *m;
 | 
			
		||||
int x;
 | 
			
		||||
{
 | 
			
		||||
  int i, j;
 | 
			
		||||
 | 
			
		||||
  if ( got[x] ) return;
 | 
			
		||||
 | 
			
		||||
  got[x] = 1;
 | 
			
		||||
  tot_got++;
 | 
			
		||||
  if ( m->fragment[NEG] ) try( m, m->neg[x] );
 | 
			
		||||
  if ( m->fragment[BOX] ) try( m, m->box[x] );
 | 
			
		||||
  FORALLCON(m,i)
 | 
			
		||||
    if ( m->adicity[i] == 1 ) try( m, m->monadic[i][x] );
 | 
			
		||||
  FORALL(m,i) if ( got[i] ) {
 | 
			
		||||
    try( m, m->C[i][x] );
 | 
			
		||||
    try( m, m->C[x][i] );
 | 
			
		||||
    if ( m->fragment[LAT] ) {
 | 
			
		||||
      try( m, m->K[i][x] );
 | 
			
		||||
      try( m, m->A[i][x] );
 | 
			
		||||
    }
 | 
			
		||||
    if ( m->fragment[FUS] ) {
 | 
			
		||||
      try( m, m->fus[i][x] );
 | 
			
		||||
      try( m, m->fus[x][i] );
 | 
			
		||||
    }
 | 
			
		||||
    FORALLCON(m,j) {
 | 
			
		||||
      if ( m->adicity[j] == 2 )
 | 
			
		||||
	try( m, m->dyadic[j][i][x] );
 | 
			
		||||
      try( m, m->dyadic[j][x][i] );
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										464
									
								
								src/setup.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										464
									
								
								src/setup.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,464 @@
 | 
			
		|||
/*
 | 
			
		||||
*			setup.c			V2.1 (May 1993)
 | 
			
		||||
*
 | 
			
		||||
*	These functions have nothing in common except that they
 | 
			
		||||
*	are called near the outer levels of MaGIC and don't really
 | 
			
		||||
*	fit into any other category.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/****************************************************************
 | 
			
		||||
	*								*
 | 
			
		||||
	*			    MaGIC 2.1				*
 | 
			
		||||
	*								*
 | 
			
		||||
	*	    (C) 1993 Australian National University		*
 | 
			
		||||
	*								*
 | 
			
		||||
	* 		       All rights reserved			*
 | 
			
		||||
	*								*
 | 
			
		||||
	* The information in this software is subject to change without	*
 | 
			
		||||
	* notice and should not be construed as a commitment by the	*
 | 
			
		||||
	* Australian National University. The Australian National Uni-	*
 | 
			
		||||
	* versity makes no representations about the suitability of	*
 | 
			
		||||
	* this software for any purpose. It is supplied "as is" without	*
 | 
			
		||||
	* express or implied warranty.  If the software is modified in 	*
 | 
			
		||||
	* a manner creating derivative copyright rights, appropriate	*
 | 
			
		||||
	* legends may be placed on the derivative work in addition to	*
 | 
			
		||||
	* that set forth above.						*
 | 
			
		||||
	*								*
 | 
			
		||||
	* Permission to use, copy, modify and distribute this software	*
 | 
			
		||||
	* and its documentation for any purpose and without fee is	*
 | 
			
		||||
	* hereby granted, provided that both the above copyright notice	*
 | 
			
		||||
	* and this permission notice appear in all copies and sup-	*
 | 
			
		||||
	* porting documentation, and that the name of the Australian	*
 | 
			
		||||
	* National University not be used in advertising or publicity	*
 | 
			
		||||
	* pertaining to distribution of the software without specific,	*
 | 
			
		||||
	* written prior permission.					*
 | 
			
		||||
	*								*
 | 
			
		||||
	****************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>      // needed for gettimeofday data types
 | 
			
		||||
#include <sys/time.h>       // because we use gettimeofday for timing
 | 
			
		||||
#include <sys/stat.h>       // nobody knows why this is included
 | 
			
		||||
#include <fcntl.h>          // because we use "open" to read data file
 | 
			
		||||
 | 
			
		||||
#include "MaGIC.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Subf_set completes the contents of theJob->form.
 | 
			
		||||
*	It also sets up vu[] and kost[].
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void subf_set()
 | 
			
		||||
{
 | 
			
		||||
  int i, j;
 | 
			
		||||
 | 
			
		||||
  for ( i = 0; theJob->form[i].sym; i++ ) {
 | 
			
		||||
    theJob->form[i].val = 0;
 | 
			
		||||
    theJob->form[i].mtx = 0;
 | 
			
		||||
    theJob->form[i].lv =
 | 
			
		||||
      &(theJob->form[theJob->form[i].lsub].val);
 | 
			
		||||
    theJob->form[i].rv =
 | 
			
		||||
      &(theJob->form[theJob->form[i].rsub].val);
 | 
			
		||||
    for ( j = 0; theJob->dcs[j]; j++ )
 | 
			
		||||
      if ( theJob->dcs[j] == theJob->form[i].sym ) {
 | 
			
		||||
	switch( theJob->adicity[j] ) {
 | 
			
		||||
	case 0:
 | 
			
		||||
	  theJob->form[i].mtx = nulladic+j;
 | 
			
		||||
	  break;
 | 
			
		||||
	case 1:
 | 
			
		||||
	  theJob->form[i].mtx = monadic[j];
 | 
			
		||||
	  break;
 | 
			
		||||
	case 2:
 | 
			
		||||
	  theJob->form[i].mtx = *(dyadic[j]); 
 | 
			
		||||
	}
 | 
			
		||||
	break;
 | 
			
		||||
      }
 | 
			
		||||
    if ( !theJob->form[i].mtx && 
 | 
			
		||||
	 !strcmp(theJob->form[i].sym->s,"->") )
 | 
			
		||||
      theJob->form[i].mtx = *C;
 | 
			
		||||
    else if ( !theJob->form[i].sym->s[1] && !theJob->form[i].mtx )
 | 
			
		||||
      switch( theJob->form[i].sym->s[0] ) {
 | 
			
		||||
      case '~':
 | 
			
		||||
	theJob->form[i].mtx = N;
 | 
			
		||||
	break;
 | 
			
		||||
      case '!':
 | 
			
		||||
	theJob->form[i].mtx = box;
 | 
			
		||||
	break;
 | 
			
		||||
      case '?':
 | 
			
		||||
	theJob->form[i].mtx = diamond;
 | 
			
		||||
	break;
 | 
			
		||||
      case 'v':
 | 
			
		||||
	theJob->form[i].mtx = *A;
 | 
			
		||||
	break;
 | 
			
		||||
      case '&':
 | 
			
		||||
	theJob->form[i].mtx = *K;
 | 
			
		||||
	break;
 | 
			
		||||
      case 'o':
 | 
			
		||||
	theJob->form[i].mtx = *fus;
 | 
			
		||||
      }
 | 
			
		||||
  }
 | 
			
		||||
  tx = theJob->form+i;
 | 
			
		||||
 | 
			
		||||
  for ( i = 0; i < VMAX; i++ ) vu[i] = rvu[i] = 0;
 | 
			
		||||
  Vmax = 0;
 | 
			
		||||
  if ( theJob->failure ) { 
 | 
			
		||||
    set_u(vu,theJob->failure);
 | 
			
		||||
    set_u(rvu,theJob->failure);
 | 
			
		||||
  }
 | 
			
		||||
  for ( i = 0; theJob->croot[i][0]; i++ ) {
 | 
			
		||||
    kost[i] = 0;
 | 
			
		||||
    for ( j = 0; theJob->croot[i][j]; j++ ) {
 | 
			
		||||
      set_u(vu,theJob->croot[i][j]);
 | 
			
		||||
      kost[i] += worstcase(theJob->croot[i][j],0);
 | 
			
		||||
    }
 | 
			
		||||
    for ( j = 0; theJob->proot[i][j]; j++ ) {
 | 
			
		||||
      set_u(vu,theJob->proot[i][j]);
 | 
			
		||||
      kost[i] += worstcase(theJob->proot[i][j],0);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Worstcase calculates the maximum number of lookups of
 | 
			
		||||
*	changeable matrices in the assignment of a value to the
 | 
			
		||||
*	formula rooted at x.  This is 0 if that formula is a variable,
 | 
			
		||||
*	a pre-defined constant or null.  Otherwise it is the worstcases
 | 
			
		||||
*	of its left and right subformulas plus the cost of its main 
 | 
			
		||||
*	connective.  This cost is 0 for ~, & and v, 1 for -> and any
 | 
			
		||||
*	user-given primitives, the worstcase of the definition for any
 | 
			
		||||
*	user-defined connective and a number depending on the logic and
 | 
			
		||||
*	the matrix size in the case of o.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
int worstcase(int x, int ntop)
 | 
			
		||||
{
 | 
			
		||||
  int i, wcsum;
 | 
			
		||||
  WFF *wf;
 | 
			
		||||
 | 
			
		||||
  if ( x < 1 ) return 0;
 | 
			
		||||
 | 
			
		||||
  wf = theJob->form+x;
 | 
			
		||||
 | 
			
		||||
  if ( is_var(wf->sym) ) return 0;
 | 
			
		||||
 | 
			
		||||
  wcsum = worstcase(wf->lsub,1) + worstcase(wf->rsub,1);
 | 
			
		||||
 | 
			
		||||
  if ( !strcmp(wf->sym->s,"->") ) return (wcsum + ntop);
 | 
			
		||||
  if ( !wf->sym->s[1] ) switch( wf->sym->s[0] ) {
 | 
			
		||||
  case '&':
 | 
			
		||||
  case 'v':
 | 
			
		||||
  case '~':
 | 
			
		||||
  case 't':
 | 
			
		||||
  case 'f':
 | 
			
		||||
  case 'T':
 | 
			
		||||
  case 'F':	return wcsum;
 | 
			
		||||
  case '!':	return (wcsum + 1);
 | 
			
		||||
  case '?':	return (wcsum + 1);
 | 
			
		||||
  case 'o':
 | 
			
		||||
    if ( F_N && theJob->axiom[AxC] )
 | 
			
		||||
      return (wcsum + 1);
 | 
			
		||||
    return (wcsum + siz + 1);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  for ( i = 0; theJob->dcs[i]; i++ )
 | 
			
		||||
    if ( theJob->dcs[i] == wf->sym ) {
 | 
			
		||||
      if ( theJob->defcon[i] == PRIMITIVE )
 | 
			
		||||
	return (wcsum + 1);
 | 
			
		||||
      return (wcsum + worstcase(theJob->defcon[i],1));
 | 
			
		||||
    }
 | 
			
		||||
  /*
 | 
			
		||||
    This case should never happen!
 | 
			
		||||
  */
 | 
			
		||||
  skipout("Unrecognised symbol in a formula",SKIP);
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Record the variables used in the formula rooted at x by
 | 
			
		||||
*	setting the array arr.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void set_u(int arr[], int x)
 | 
			
		||||
{
 | 
			
		||||
  if ( x < 1 ) return;
 | 
			
		||||
  if ( x < VMAX ) {
 | 
			
		||||
    *(arr+x) = 1;
 | 
			
		||||
    if ( x > Vmax ) Vmax = x;
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    set_u(arr,theJob->form[x].lsub);
 | 
			
		||||
    set_u(arr,theJob->form[x].rsub);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Here is a clock function which ought to work even in
 | 
			
		||||
*	the worst of times.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void CLoCK(int *timer)
 | 
			
		||||
{
 | 
			
		||||
  struct timeval tp;
 | 
			
		||||
  struct timezone tzp;
 | 
			
		||||
 | 
			
		||||
#ifdef HASTIMES
 | 
			
		||||
  times(&time_buffer);
 | 
			
		||||
#endif
 | 
			
		||||
  gettimeofday(&tp,&tzp);
 | 
			
		||||
  *timer = tp.tv_sec & 0xffff;
 | 
			
		||||
  *timer *= TICK;
 | 
			
		||||
  *timer += (tp.tv_usec / (1000000/TICK));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	This is called from got_ord in logic_io.c to set up the 
 | 
			
		||||
*	index from the structures representing the models to the
 | 
			
		||||
*	vector to be used by transref. At the same time, it labels 
 | 
			
		||||
*	`forbidden' any cells at which backtracking is not allowed.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void set_up_cc()
 | 
			
		||||
{
 | 
			
		||||
  int i, j, k;
 | 
			
		||||
  boolean fb;
 | 
			
		||||
 | 
			
		||||
  tr_par.vlength = 0;
 | 
			
		||||
  for ( i = 0; theJob->dcs[i]; i++ ) ;
 | 
			
		||||
  while ( i ) {
 | 
			
		||||
    if ( theJob->defcon[--i] == PRIMITIVE ) {
 | 
			
		||||
      fb = theJob->concut[i];
 | 
			
		||||
      switch ( theJob->adicity[i] ) {
 | 
			
		||||
      case 0:
 | 
			
		||||
	ucc0[i] = tr_par.vlength++;
 | 
			
		||||
	tr_par.forbidden[ucc0[i]] = fb;				
 | 
			
		||||
	break;
 | 
			
		||||
      case 1:
 | 
			
		||||
	FORALL(j) {
 | 
			
		||||
	ucc1[i][j] = tr_par.vlength++;
 | 
			
		||||
	tr_par.forbidden[ucc1[i][j]] = fb;
 | 
			
		||||
	}
 | 
			
		||||
	break;
 | 
			
		||||
      case 2:
 | 
			
		||||
	FORALL(j) FORALL(k) {
 | 
			
		||||
	  ucc2[i][j][k] = tr_par.vlength++;
 | 
			
		||||
	  tr_par.forbidden[ucc2[i][j][k]] = fb;
 | 
			
		||||
	}
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if ( theJob->f_nec ) {
 | 
			
		||||
    firstbox = tr_par.vlength;
 | 
			
		||||
    FORALL(i) {
 | 
			
		||||
      boxindex[i] = tr_par.vlength++;
 | 
			
		||||
      tr_par.forbidden[boxindex[i]] = false;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  firstarrow = tr_par.vlength;
 | 
			
		||||
  FORALL(i) FORALL(j)
 | 
			
		||||
    if ( !( F_N && i < N[j] )) {
 | 
			
		||||
      impindex[i][j] = tr_par.vlength++;
 | 
			
		||||
      tr_par.forbidden[impindex[i][j]] = false;
 | 
			
		||||
      if ( F_N ) impindex[N[j]][N[i]] = impindex[i][j];
 | 
			
		||||
    }
 | 
			
		||||
  if ( tr_par.vlength > V_LENGTH ) {
 | 
			
		||||
    printf(" %d > %d\n", tr_par.vlength, V_LENGTH);
 | 
			
		||||
    skipout( "V_LENGTH is too small for this job", SKIP );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	This is called immediately before transref.
 | 
			
		||||
*/
 | 
			
		||||
 
 | 
			
		||||
void job_start()
 | 
			
		||||
{
 | 
			
		||||
  char infil_name[100];
 | 
			
		||||
 | 
			
		||||
  set_orders(infil_name);
 | 
			
		||||
  if ( (infil = open(infil_name,0)) < 0 )
 | 
			
		||||
    skipout("Failed to open the data file",SKIP);
 | 
			
		||||
  input_bit = 8;
 | 
			
		||||
  if ( *(theJob->outfil_name) && !filing ) {
 | 
			
		||||
    outfil = fopen(theJob->outfil_name,"w");
 | 
			
		||||
    filing = 1;
 | 
			
		||||
  }
 | 
			
		||||
  if ( theJob->fil_out == PRETTY || theJob->fil_out == SUMMARY )
 | 
			
		||||
    disp(outfil);
 | 
			
		||||
  else if ( theJob->fil_out == UGLY )
 | 
			
		||||
    uglydisp(outfil);
 | 
			
		||||
  if ( theJob->tty_out == UGLY )
 | 
			
		||||
    uglydisp(stdout);
 | 
			
		||||
  
 | 
			
		||||
  logic_axioms(1);
 | 
			
		||||
 | 
			
		||||
  CLoCK(&start_time);
 | 
			
		||||
#ifdef HASTIMES
 | 
			
		||||
  begin_timer = time_buffer.tms_utime;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  good = tot = isoms = isoms2 = 0;
 | 
			
		||||
  siz = 0;
 | 
			
		||||
  set_up_trin();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	This, on the other hand, is not.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void job_stop(boolean batch)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  CLoCK( &stop_time );
 | 
			
		||||
#ifdef HASTIMES
 | 
			
		||||
  end_timer = time_buffer.tms_utime;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  if ( theJob->tty_out == UGLY ) {
 | 
			
		||||
    printf(" -1\n");
 | 
			
		||||
    for ( i = 0; theJob->dcs[i]; i++ )
 | 
			
		||||
      if ( theJob->defcon[i] == PRIMITIVE ) printf(" -1\n");
 | 
			
		||||
  }
 | 
			
		||||
  if (theJob->fil_out == UGLY ) {
 | 
			
		||||
    fprintf(outfil, " -1\n");
 | 
			
		||||
    for ( i = 0; theJob->dcs[i]; i++ )
 | 
			
		||||
      if ( theJob->defcon[i] == PRIMITIVE )
 | 
			
		||||
	fprintf(outfil, " -1\n");
 | 
			
		||||
  }
 | 
			
		||||
  if ( !batch ) {
 | 
			
		||||
    stats_print();
 | 
			
		||||
    paws();
 | 
			
		||||
  }
 | 
			
		||||
  if ( filing ) {
 | 
			
		||||
    fclose(outfil);
 | 
			
		||||
    filing = 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( infil ) {
 | 
			
		||||
    close(infil);
 | 
			
		||||
    infil = 0;
 | 
			
		||||
  }
 | 
			
		||||
  tr_par.done = true;
 | 
			
		||||
  logic_axioms(false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Set_orders works out the input file name and extends the
 | 
			
		||||
*	string passed to it with that name.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void set_orders(char s[])
 | 
			
		||||
{
 | 
			
		||||
  strcpy( s, theJob->data_dir );
 | 
			
		||||
 | 
			
		||||
  if ( theJob->totord )
 | 
			
		||||
    strcat(s,(theJob->f_n? "tn": "to"));
 | 
			
		||||
  else if ( theJob->f_lat ) {
 | 
			
		||||
    if ( !theJob->distrib ) 
 | 
			
		||||
      strcat(s,(theJob->f_n? "ln": "l"));
 | 
			
		||||
    else if ( theJob->axiom[AxBA] || 
 | 
			
		||||
	      ( theJob->logic==S4 && theJob->f_n ))
 | 
			
		||||
      strcat(s,"ba");
 | 
			
		||||
    else	strcat(s,(theJob->f_n? "dln": "dl"));
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    if ( theJob->f_n && theJob->f_t )
 | 
			
		||||
      strcat(s,"pont");
 | 
			
		||||
    else if ( theJob->f_n )
 | 
			
		||||
      strcat(s,"pon");
 | 
			
		||||
    else if ( theJob->f_t )
 | 
			
		||||
      strcat(s,"pot");
 | 
			
		||||
    else	strcat(s,"po");
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  sprintf( s+strlen(s), ".%d", Sizmax );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	This routine just prints the header for ugly output.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void uglydisp(FILE *f)
 | 
			
		||||
{
 | 
			
		||||
  int i, j;
 | 
			
		||||
 | 
			
		||||
  fprintf( f, " %d", theJob->f_n );
 | 
			
		||||
  fprintf( f, " %d", theJob->f_t );
 | 
			
		||||
  fprintf( f, " %d", theJob->f_T );
 | 
			
		||||
  fprintf( f, " %d", theJob->f_F );
 | 
			
		||||
  fprintf( f, " %d", theJob->f_fus );
 | 
			
		||||
  fprintf( f, " %d", theJob->f_lat );
 | 
			
		||||
  fprintf( f, " %d", theJob->f_nec );
 | 
			
		||||
  j = 0;
 | 
			
		||||
  for ( i = 0; theJob->dcs[i]; i++ )
 | 
			
		||||
    if ( theJob->defcon[i] == PRIMITIVE ) j++;
 | 
			
		||||
  fprintf( f, " %d", j );
 | 
			
		||||
  for ( i = 0; theJob->dcs[i]; i++ )
 | 
			
		||||
    if ( theJob->defcon[i] == PRIMITIVE )
 | 
			
		||||
      fprintf( f, " %d %s", theJob->adicity[i], theJob->dcs[i]->s );
 | 
			
		||||
  fprintf( f, "\n" );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	The job parameters are communicated to transref via a structure
 | 
			
		||||
*	tr_par which must be set up before each call. Note that 
 | 
			
		||||
*	tr_par.forbidden which records functions on which there is a 
 | 
			
		||||
*	"cut" is set elsewhere.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void set_up_trin()
 | 
			
		||||
{
 | 
			
		||||
  tr_par.Test = Good_matrix;
 | 
			
		||||
  tr_par.Onerefs = set_poss;
 | 
			
		||||
  tr_par.Smallrefs = find_twos;
 | 
			
		||||
  tr_par.batches = 10;
 | 
			
		||||
  tr_par.extra_batches = EXTRA_DEFAULT;
 | 
			
		||||
  tr_par.maxref = 6;
 | 
			
		||||
  tr_par.maxbak = 0;
 | 
			
		||||
  tr_par.verb = 0;
 | 
			
		||||
  tr_par.Nosecs = false;
 | 
			
		||||
  tr_par.topsoff = true;
 | 
			
		||||
  tr_par.report_breaks = false;
 | 
			
		||||
  tr_par.done = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	These stubs are just to maintain compatibility with the vntr used
 | 
			
		||||
*	by FINDER. They are not called.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void report_branches(trin T) {}
 | 
			
		||||
void ref_size_report() {}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										202
									
								
								src/sub_irr.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										202
									
								
								src/sub_irr.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,202 @@
 | 
			
		|||
/*				One.c
 | 
			
		||||
*
 | 
			
		||||
*	This uses RM (Read Matrices) to read ugly output from MaGIC and calls
 | 
			
		||||
*	a function "si" to choose those matrices which are subdirectly
 | 
			
		||||
*	irreducible under the connectives present in the fragment. The
 | 
			
		||||
*	matrices are printed out. The print format may be changed from the
 | 
			
		||||
*	default (UGLY) to PRETTY or TeX by means of the command line switches
 | 
			
		||||
*	"-p" or "-t".
 | 
			
		||||
*
 | 
			
		||||
*	For details of the matrix structures and other goodies defined in the
 | 
			
		||||
*	header, see RM.h. The following should be fairly self-explanatory,
 | 
			
		||||
*	however. Note that my_values and my_string are optional extras used
 | 
			
		||||
*	by printmat. These are re-initialised to <-1,-1,-1,....> and "" by
 | 
			
		||||
*	mat_malloc. Use strcpy to put a message in m->my_string.
 | 
			
		||||
*
 | 
			
		||||
*	Command line option -u (ugly) is allowed but has no effect since UGLY
 | 
			
		||||
*	is the default print mode.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "RM.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int si(MATRIX *m);
 | 
			
		||||
int non_degenerate(MATRIX* m, int g1, int g2, int congruence[]);
 | 
			
		||||
void adjust(MATRIX *m, int congruence[], int from, int to);
 | 
			
		||||
int extended(MATRIX *m, int congruence[], int a, int b);
 | 
			
		||||
int monex(MATRIX *m, int arr[], int a, int b, int congruence[]);
 | 
			
		||||
int dyex(MATRIX *m, int arr[][SZ], int a, int b, int congruence[]);
 | 
			
		||||
int orthogonal(MATRIX *m, int theCongruences[][SZ]);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int main( argc, argv )
 | 
			
		||||
int argc;
 | 
			
		||||
char *argv[];
 | 
			
		||||
{
 | 
			
		||||
  int option;
 | 
			
		||||
  PRINTMODE p = UGLY;
 | 
			
		||||
  int g1();
 | 
			
		||||
  int getopt();
 | 
			
		||||
 | 
			
		||||
  while ((option = getopt (argc, argv, "upt")) != -1)
 | 
			
		||||
    switch( option ) {
 | 
			
		||||
    case 'p': p = PRETTY;	break;
 | 
			
		||||
    case 't': p = TeX;
 | 
			
		||||
    }
 | 
			
		||||
  selectmats(si,p);
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int si(MATRIX *m)
 | 
			
		||||
{
 | 
			
		||||
  int theCongruences[2][SZ];
 | 
			
		||||
  int gen1a, gen1b, gen2a, gen2b;
 | 
			
		||||
 | 
			
		||||
  FORALL(m,gen1a) FORALL(m,gen1b) if (gen1b < gen1a) {
 | 
			
		||||
    if (non_degenerate(m,gen1a,gen1b,theCongruences[0])) {
 | 
			
		||||
      FORALL(m,gen2a) FORALL(m,gen2b) if (gen2b < gen2a) {
 | 
			
		||||
	if (non_degenerate(m,gen2a,gen2b,theCongruences[1]) &&
 | 
			
		||||
	    orthogonal(m,theCongruences))
 | 
			
		||||
	  return 0;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int non_degenerate(MATRIX* m, int g1, int g2, int congruence[])
 | 
			
		||||
{
 | 
			
		||||
  int x, y, temp;
 | 
			
		||||
 | 
			
		||||
  for (x=0; x<SZ; x++)
 | 
			
		||||
    congruence[x] = -1;
 | 
			
		||||
  FORALL(m,x)
 | 
			
		||||
    congruence[x] = x;
 | 
			
		||||
  congruence[g2] = g1;
 | 
			
		||||
  
 | 
			
		||||
  /*
 | 
			
		||||
   * EXTEND THE CONGRUENCE TO A FIXED POINT
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  do {
 | 
			
		||||
    temp = 0;
 | 
			
		||||
    FORALL(m,x) FORALL(m,y)
 | 
			
		||||
      if (x < y && congruence[x] == congruence[y]) {
 | 
			
		||||
	if (extended(m,congruence,x,y))
 | 
			
		||||
	  temp = 1;
 | 
			
		||||
      }
 | 
			
		||||
  }
 | 
			
		||||
  while (temp);
 | 
			
		||||
 | 
			
		||||
  /*
 | 
			
		||||
   * Now renumber the congruence classes contiguously starting from 0,
 | 
			
		||||
   * in the order of their smallest-numbered members
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  temp = -1;
 | 
			
		||||
  FORALL(m,x)
 | 
			
		||||
    if (congruence[x] >= 0) {
 | 
			
		||||
      temp--;
 | 
			
		||||
      adjust(m,congruence,congruence[x],temp);
 | 
			
		||||
    }
 | 
			
		||||
  for (x=-2,y=0; x>=temp; x--,y++)
 | 
			
		||||
    adjust(m,congruence,x,y);
 | 
			
		||||
  if (y == 0)
 | 
			
		||||
    return 0;
 | 
			
		||||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void adjust(MATRIX *m, int congruence[], int from, int to)
 | 
			
		||||
{
 | 
			
		||||
  int x;
 | 
			
		||||
 | 
			
		||||
  FORALL(m,x)
 | 
			
		||||
    if (congruence[x] == from)
 | 
			
		||||
      congruence[x] = to;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int extended(MATRIX *m, int congruence[], int a, int b)
 | 
			
		||||
{
 | 
			
		||||
  int x;
 | 
			
		||||
  int ex = 0;
 | 
			
		||||
 | 
			
		||||
  if (m->fragment[NEG] &&
 | 
			
		||||
      monex(m,m->neg,a,b,congruence))
 | 
			
		||||
    ex = 1;
 | 
			
		||||
  if (m->fragment[BOX] &&
 | 
			
		||||
      monex(m,m->box,a,b,congruence))
 | 
			
		||||
    ex = 1;
 | 
			
		||||
  FORALLCON(m,x)
 | 
			
		||||
    if (m->adicity[x] == 1 &&
 | 
			
		||||
	monex(m,m->monadic[x],a,b,congruence))
 | 
			
		||||
      ex = 1;
 | 
			
		||||
  if (dyex(m,m->C,a,b,congruence))
 | 
			
		||||
    ex = 1;
 | 
			
		||||
  if (m->fragment[LAT] &&
 | 
			
		||||
      dyex(m,m->K,a,b,congruence))
 | 
			
		||||
    ex = 1;
 | 
			
		||||
  if (m->fragment[LAT] &&
 | 
			
		||||
      dyex(m,m->A,a,b,congruence))
 | 
			
		||||
    ex = 1;
 | 
			
		||||
  if ( m->fragment[FUS] &&
 | 
			
		||||
       dyex(m,m->fus,a,b,congruence))
 | 
			
		||||
    ex = 1;
 | 
			
		||||
  FORALLCON(m,x)
 | 
			
		||||
    if ( m->adicity[x] == 2 &&
 | 
			
		||||
	 dyex(m,m->dyadic[x],a,b,congruence))
 | 
			
		||||
      ex = 1;
 | 
			
		||||
  return ex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int monex(MATRIX *m, int arr[], int a, int b, int congruence[])
 | 
			
		||||
{
 | 
			
		||||
  if (congruence[arr[a]] == congruence[arr[b]])
 | 
			
		||||
    return 0;
 | 
			
		||||
  adjust(m,congruence,congruence[arr[b]],congruence[arr[a]]);
 | 
			
		||||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int dyex(MATRIX *m, int arr[][SZ], int a, int b, int congruence[])
 | 
			
		||||
{
 | 
			
		||||
  int x;
 | 
			
		||||
  int ext = 0;
 | 
			
		||||
 | 
			
		||||
  FORALL(m,x) {
 | 
			
		||||
    if (congruence[arr[x][a]] != congruence[arr[x][b]]) {
 | 
			
		||||
      adjust(m,congruence,congruence[arr[x][b]],congruence[arr[x][a]]);
 | 
			
		||||
      ext = 1;
 | 
			
		||||
    }
 | 
			
		||||
    if (congruence[arr[a][x]] != congruence[arr[b][x]]) {
 | 
			
		||||
      adjust(m,congruence,congruence[arr[b][x]],congruence[arr[a][x]]);
 | 
			
		||||
      ext = 1;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return ext;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int orthogonal(MATRIX *m, int theCongruences[][SZ])
 | 
			
		||||
{
 | 
			
		||||
  int x,y;
 | 
			
		||||
 | 
			
		||||
  FORALL(m,x)
 | 
			
		||||
    FORALL(m,y)
 | 
			
		||||
    if (x<y &&
 | 
			
		||||
	theCongruences[0][x] == theCongruences[0][y] &&
 | 
			
		||||
	theCongruences[1][x] == theCongruences[1][y])
 | 
			
		||||
      return 0;
 | 
			
		||||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										50
									
								
								src/u2p.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								src/u2p.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,50 @@
 | 
			
		|||
/*				Pretty.c
 | 
			
		||||
*
 | 
			
		||||
*	This is the simplest post-processing program for MaGIC.
 | 
			
		||||
*	It reads MaGIC's "ugly" output from stdin and pretty-prints 
 | 
			
		||||
*	the matrices to stdout.  MaGIC may be used in batch mode to
 | 
			
		||||
*	pipe the matrices through a program such as this, or they 
 | 
			
		||||
*	may be read from a file.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "RM.h"
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
  selectmats( True, PRETTY );
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/****************************************************************
 | 
			
		||||
	*								*
 | 
			
		||||
	*			    MaGIC 2.1				*
 | 
			
		||||
	*								*
 | 
			
		||||
	*	    (C) 1993 Australian National University		*
 | 
			
		||||
	*								*
 | 
			
		||||
	* 		       All rights reserved			*
 | 
			
		||||
	*								*
 | 
			
		||||
	* The information in this software is subject to change without	*
 | 
			
		||||
	* notice and should not be construed as a commitment by the	*
 | 
			
		||||
	* Australian National University. The Australian National Uni-	*
 | 
			
		||||
	* versity makes no representations about the suitability of	*
 | 
			
		||||
	* this software for any purpose. It is supplied "as is" without	*
 | 
			
		||||
	* express or implied warranty.  If the software is modified in 	*
 | 
			
		||||
	* a manner creating derivative copyright rights, appropriate	*
 | 
			
		||||
	* legends may be placed on the derivative work in addition to	*
 | 
			
		||||
	* that set forth above.						*
 | 
			
		||||
	*								*
 | 
			
		||||
	* Permission to use, copy, modify and distribute this software	*
 | 
			
		||||
	* and its documentation for any purpose and without fee is	*
 | 
			
		||||
	* hereby granted, provided that both the above copyright notice	*
 | 
			
		||||
	* and this permission notice appear in all copies and sup-	*
 | 
			
		||||
	* porting documentation, and that the name of the Australian	*
 | 
			
		||||
	* National University not be used in advertising or publicity	*
 | 
			
		||||
	* pertaining to distribution of the software without specific,	*
 | 
			
		||||
	* written prior permission.					*
 | 
			
		||||
	*								*
 | 
			
		||||
	****************************************************************/
 | 
			
		||||
							
								
								
									
										76
									
								
								src/u2pic.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								src/u2pic.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,76 @@
 | 
			
		|||
/*				Upic.c
 | 
			
		||||
*
 | 
			
		||||
*	This uses RM (Read Matrices) to read ugly output from 
 | 
			
		||||
*	MaGIC and calls a function "choose" to allow the user 
 | 
			
		||||
*	to decide of each matrix whether it should be kept or 
 | 
			
		||||
*	ignored.  The chosen matrices are printed in the ugly
 | 
			
		||||
*	format.
 | 
			
		||||
*
 | 
			
		||||
*	For details of the matrix structures and other goodies 
 | 
			
		||||
*	defined in the header, see RM.h.  The following should be
 | 
			
		||||
*	fairly self-explanatory, however.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "RM.h"
 | 
			
		||||
 | 
			
		||||
static FILE *tty;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
  int choose();
 | 
			
		||||
 | 
			
		||||
  tty = fopen( "/dev/tty", "r" );
 | 
			
		||||
  selectmats( choose, UGLY );
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int choose(m)
 | 
			
		||||
MATRIX *m;
 | 
			
		||||
{
 | 
			
		||||
  displaymat( m, "Keep this matrix?  (y/n/q)....." );
 | 
			
		||||
 | 
			
		||||
  for (;;)
 | 
			
		||||
    switch( getc(tty) ) {
 | 
			
		||||
    case 'y': return 1;
 | 
			
		||||
    case 'n': return 0;
 | 
			
		||||
    case 'q': return -1;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/****************************************************************
 | 
			
		||||
	*								*
 | 
			
		||||
	*			    MaGIC 2.1				*
 | 
			
		||||
	*								*
 | 
			
		||||
	*	    (C) 1993 Australian National University		*
 | 
			
		||||
	*								*
 | 
			
		||||
	* 		       All rights reserved			*
 | 
			
		||||
	*								*
 | 
			
		||||
	* The information in this software is subject to change without	*
 | 
			
		||||
	* notice and should not be construed as a commitment by the	*
 | 
			
		||||
	* Australian National University. The Australian National Uni-	*
 | 
			
		||||
	* versity makes no representations about the suitability of	*
 | 
			
		||||
	* this software for any purpose. It is supplied "as is" without	*
 | 
			
		||||
	* express or implied warranty.  If the software is modified in 	*
 | 
			
		||||
	* a manner creating derivative copyright rights, appropriate	*
 | 
			
		||||
	* legends may be placed on the derivative work in addition to	*
 | 
			
		||||
	* that set forth above.						*
 | 
			
		||||
	*								*
 | 
			
		||||
	* Permission to use, copy, modify and distribute this software	*
 | 
			
		||||
	* and its documentation for any purpose and without fee is	*
 | 
			
		||||
	* hereby granted, provided that both the above copyright notice	*
 | 
			
		||||
	* and this permission notice appear in all copies and sup-	*
 | 
			
		||||
	* porting documentation, and that the name of the Australian	*
 | 
			
		||||
	* National University not be used in advertising or publicity	*
 | 
			
		||||
	* pertaining to distribution of the software without specific,	*
 | 
			
		||||
	* written prior permission.					*
 | 
			
		||||
	*								*
 | 
			
		||||
	****************************************************************/
 | 
			
		||||
							
								
								
									
										54
									
								
								src/u2tex.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								src/u2tex.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,54 @@
 | 
			
		|||
/*				Texmats.c
 | 
			
		||||
*
 | 
			
		||||
*	This is a post-processing program for MaGIC.
 | 
			
		||||
*	It reads ugly MaGIC output from stdin and prints the 
 | 
			
		||||
*	matrices to stdout in TeX format.
 | 
			
		||||
*
 | 
			
		||||
*	See RM.h for more information.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "RM.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int main()
 | 
			
		||||
{
 | 
			
		||||
  selectmats( True, TeX );
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/****************************************************************
 | 
			
		||||
	*								*
 | 
			
		||||
	*			    MaGIC 2.1				*
 | 
			
		||||
	*								*
 | 
			
		||||
	*	    (C) 1993 Australian National University		*
 | 
			
		||||
	*								*
 | 
			
		||||
	* 		       All rights reserved			*
 | 
			
		||||
	*								*
 | 
			
		||||
	* The information in this software is subject to change without	*
 | 
			
		||||
	* notice and should not be construed as a commitment by the	*
 | 
			
		||||
	* Australian National University. The Australian National Uni-	*
 | 
			
		||||
	* versity makes no representations about the suitability of	*
 | 
			
		||||
	* this software for any purpose. It is supplied "as is" without	*
 | 
			
		||||
	* express or implied warranty.  If the software is modified in 	*
 | 
			
		||||
	* a manner creating derivative copyright rights, appropriate	*
 | 
			
		||||
	* legends may be placed on the derivative work in addition to	*
 | 
			
		||||
	* that set forth above.						*
 | 
			
		||||
	*								*
 | 
			
		||||
	* Permission to use, copy, modify and distribute this software	*
 | 
			
		||||
	* and its documentation for any purpose and without fee is	*
 | 
			
		||||
	* hereby granted, provided that both the above copyright notice	*
 | 
			
		||||
	* and this permission notice appear in all copies and sup-	*
 | 
			
		||||
	* porting documentation, and that the name of the Australian	*
 | 
			
		||||
	* National University not be used in advertising or publicity	*
 | 
			
		||||
	* pertaining to distribution of the software without specific,	*
 | 
			
		||||
	* written prior permission.					*
 | 
			
		||||
	*								*
 | 
			
		||||
	****************************************************************/
 | 
			
		||||
							
								
								
									
										1956
									
								
								src/vntr.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1956
									
								
								src/vntr.c
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										343
									
								
								src/vntr.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										343
									
								
								src/vntr.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,343 @@
 | 
			
		|||
 | 
			
		||||
        /****************************************************************
 | 
			
		||||
        *                                                               *
 | 
			
		||||
        *                          FINDER 3.0                           *
 | 
			
		||||
        *                                                               *
 | 
			
		||||
        *           (C) 1993 Australian National University             *
 | 
			
		||||
        *                                                               *
 | 
			
		||||
        *                      All rights reserved                      *
 | 
			
		||||
        *                                                               *
 | 
			
		||||
        * The information in this software is subject to change without *
 | 
			
		||||
        * notice and should not be construed as a commitment by the     *
 | 
			
		||||
        * Australian National University. The Australian National Uni-  *
 | 
			
		||||
        * versity makes no representations about the suitability of     *
 | 
			
		||||
        * this software for any purpose. It is supplied "as is" without *
 | 
			
		||||
        * express or implied warranty.  If the software is modified in  *
 | 
			
		||||
        * a manner creating derivative copyright rights, appropriate    *
 | 
			
		||||
        * legends may be placed on the derivative work in addition to   *
 | 
			
		||||
        * that set forth above.                                         *
 | 
			
		||||
        *                                                               *
 | 
			
		||||
        * Permission to use, copy, modify and distribute this software  *
 | 
			
		||||
        * and its documentation for any purpose and without fee is      *
 | 
			
		||||
        * hereby granted, provided that both the above copyright notice *
 | 
			
		||||
        * and this permission notice appear in all copies and sup-      *
 | 
			
		||||
        * porting documentation, and that the name of the Australian    *
 | 
			
		||||
        * National University not be used in advertising or publicity   *
 | 
			
		||||
        * pertaining to distribution of the software without specific,  *
 | 
			
		||||
        * written prior permission.                                     *
 | 
			
		||||
        *                                                               *
 | 
			
		||||
        ****************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
#ifndef __APPLE__
 | 
			
		||||
#include <malloc.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Constant definitions
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#define REF_MAX 512
 | 
			
		||||
#define REF_DEFAULT 16
 | 
			
		||||
#define EXTRA_DEFAULT 5
 | 
			
		||||
#define MAX_REF_SIZE 8
 | 
			
		||||
 | 
			
		||||
#ifndef SZ
 | 
			
		||||
#define SZ 32
 | 
			
		||||
#endif
 | 
			
		||||
#define V_LENGTH 1024
 | 
			
		||||
/*
 | 
			
		||||
*	#define SURJ_MAX 64
 | 
			
		||||
*/
 | 
			
		||||
#define SURJ_MAX 256
 | 
			
		||||
#define STAK_MAX (REF_MAX*MAX_REF_SIZE)
 | 
			
		||||
#define RRA 50
 | 
			
		||||
#define RRB 30
 | 
			
		||||
 | 
			
		||||
#define NO_REPORT ((unsigned)1)
 | 
			
		||||
#define INT_REPORT ((unsigned)2)
 | 
			
		||||
#define FLOAT_REPORT ((unsigned)4)
 | 
			
		||||
#define DO_REPORT ((unsigned)8)
 | 
			
		||||
 | 
			
		||||
#define logical unsigned int
 | 
			
		||||
 | 
			
		||||
#define FOR(x,y) for( y = x; y; y = y->p )
 | 
			
		||||
#define FORR(x,y) FOR( x->cellvals, y )
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Type definitions
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*typedef enum {
 | 
			
		||||
*	false,
 | 
			
		||||
*	true
 | 
			
		||||
*} boolean;
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#define boolean char
 | 
			
		||||
#define false ((boolean)0)
 | 
			
		||||
#define true ((boolean)1)
 | 
			
		||||
 | 
			
		||||
typedef enum {
 | 
			
		||||
	NOCUT,
 | 
			
		||||
	FOUND,
 | 
			
		||||
	RECORDED
 | 
			
		||||
} cutcode;
 | 
			
		||||
 | 
			
		||||
typedef	enum {
 | 
			
		||||
	PERFECT,
 | 
			
		||||
	NULL_SPACE,
 | 
			
		||||
	BIG_SPACE,
 | 
			
		||||
	REF_LIST,
 | 
			
		||||
	BUST,
 | 
			
		||||
	IBUST,
 | 
			
		||||
	NULL_REF,
 | 
			
		||||
	SURJES,
 | 
			
		||||
	SKIP
 | 
			
		||||
} exit_code;
 | 
			
		||||
 | 
			
		||||
typedef	enum {
 | 
			
		||||
	SETPOSSES,
 | 
			
		||||
	DOSMALLS,
 | 
			
		||||
	SEARCHES,
 | 
			
		||||
	SOLUTIONS,
 | 
			
		||||
	BAD_TESTS,
 | 
			
		||||
	SURJ_BACKTRACKS,
 | 
			
		||||
	NULL_BACKTRACKS,
 | 
			
		||||
	F_SUBSUMED,
 | 
			
		||||
	B_SUBSUMED,
 | 
			
		||||
	B1_SUBSUMED,
 | 
			
		||||
	PREREFS,
 | 
			
		||||
	REFSIZE,
 | 
			
		||||
	TOPLESS,
 | 
			
		||||
	LOC_MEMORY,
 | 
			
		||||
	MEMORY,
 | 
			
		||||
	BRANCHES,
 | 
			
		||||
	PRE_TIME,
 | 
			
		||||
	SEARCH_TIME,
 | 
			
		||||
	MAX_REPORT
 | 
			
		||||
} report_code;
 | 
			
		||||
 | 
			
		||||
typedef struct IL {
 | 
			
		||||
	boolean positive;	/* Represents positive literal	*/
 | 
			
		||||
	short int v, w;		/* A couple of integers 	*/
 | 
			
		||||
	struct IL *p;		/* in a list			*/
 | 
			
		||||
} INTLIST, *intlist;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct reftype {
 | 
			
		||||
	int	cardinality;	/* Just what is says		*/
 | 
			
		||||
	boolean	notop;		/* Useless extension omitted	*/
 | 
			
		||||
	intlist	cellvals;	/* The cell-valuess involved	*/
 | 
			
		||||
	struct reftype *nxtr;	/* Just for stack management	*/
 | 
			
		||||
} REF, *ref;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct rf_list {	/* A list of refutations	*/
 | 
			
		||||
	ref	rf;
 | 
			
		||||
	struct rf_list *nextref;
 | 
			
		||||
} REFLIST, *reflist;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
	int	blocks;		/* How many times blocked	*/
 | 
			
		||||
	ref	back;		/* For calculating secondaries	*/
 | 
			
		||||
	reflist	cvrefs;		/* The refs involving this c-v	*/
 | 
			
		||||
	reflist	posrefs;	/* Positives involving this c-v	*/
 | 
			
		||||
	int	vpos;		/* Offset of its cell		*/
 | 
			
		||||
} CELLVALUE, *cellvalue;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
	short	poss;		/* How many possible values	*/
 | 
			
		||||
	short	vpos;		/* Vector position of this cell	*/
 | 
			
		||||
	reflist	inject;		/* Index to injective function	*/
 | 
			
		||||
	CELLVALUE cvals[SZ];	/* The cell-value structures	*/
 | 
			
		||||
	boolean	used;		/* Involved in new refutation	*/
 | 
			
		||||
	boolean	has_value;	/* This cell has a value	*/
 | 
			
		||||
} CELL, *cell;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
	logical	valset;
 | 
			
		||||
	int	last_seen[SZ];
 | 
			
		||||
	intlist	cellset;
 | 
			
		||||
} SURJ;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
	logical	report_type;
 | 
			
		||||
	char	s_report[80];
 | 
			
		||||
	int	i_report;
 | 
			
		||||
	float	f_report;
 | 
			
		||||
	void	(*do_report)();
 | 
			
		||||
} REPORT;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct cng {
 | 
			
		||||
	int	forkpoint;
 | 
			
		||||
	int	cutval;
 | 
			
		||||
	logical	comvec[V_LENGTH];
 | 
			
		||||
	int	inorder[V_LENGTH];
 | 
			
		||||
	logical	possvals[V_LENGTH];
 | 
			
		||||
	boolean	active;	
 | 
			
		||||
	struct cng *lastone;
 | 
			
		||||
} CUTT, *cutt;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct { REF news[1024]; }	RBATCH,  *rbatch;
 | 
			
		||||
typedef struct { INTLIST news[1024]; }	ILBATCH, *ilbatch;
 | 
			
		||||
typedef struct { REFLIST news[1024]; }	RLBATCH, *rlbatch;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
	boolean	(*Test)(),	/* The principal test function	*/
 | 
			
		||||
		(*Onerefs)(),	/* Removal of impossible values */
 | 
			
		||||
		(*Smallrefs)();	/* Special treatment for smalls	*/
 | 
			
		||||
	int	vlength,	/* Local vector length		*/
 | 
			
		||||
		batches,	/* Local stack size / 1000	*/
 | 
			
		||||
		extra_batches,	/* Batches after pretest	*/
 | 
			
		||||
		maxref,		/* Maximum refutation size	*/
 | 
			
		||||
		maxbak,		/* Maximum number of backtracks */
 | 
			
		||||
		verb,		/* Statistics verbosity setting */
 | 
			
		||||
		ref_record[RRA][RRB],
 | 
			
		||||
		branches[SZ];
 | 
			
		||||
	boolean	Nosecs,		/* Suppress secondary refs	*/
 | 
			
		||||
		topsoff,	/* Remove redundant ref tops	*/
 | 
			
		||||
		report_breaks,	/* Print reason for end search 	*/
 | 
			
		||||
		forbidden[V_LENGTH],	/* No backtracking	*/
 | 
			
		||||
		done;		/* End-of-search status raised	*/
 | 
			
		||||
	REPORT	reps[MAX_REPORT+1];	/* Search statistics	*/
 | 
			
		||||
} TRIN, *trin;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
	trin	job;
 | 
			
		||||
	CELL	vector[V_LENGTH];
 | 
			
		||||
	logical	comvec[V_LENGTH];
 | 
			
		||||
	int	inorder[V_LENGTH];
 | 
			
		||||
	int	coinorder[V_LENGTH];
 | 
			
		||||
	int	priority[V_LENGTH];
 | 
			
		||||
	int	this_cell;
 | 
			
		||||
	int	susguy;
 | 
			
		||||
	int	firstchange;
 | 
			
		||||
	int	forkpoint;
 | 
			
		||||
	int	maxval;
 | 
			
		||||
	int	stakmax;
 | 
			
		||||
	int	unfixt;
 | 
			
		||||
	int	local_memory;
 | 
			
		||||
	int	max_batches;
 | 
			
		||||
	boolean	novect;
 | 
			
		||||
	boolean	ts;
 | 
			
		||||
	boolean	cut_recorded;
 | 
			
		||||
	boolean noref;
 | 
			
		||||
	rbatch	stak[REF_MAX];
 | 
			
		||||
	ilbatch	il_stak[STAK_MAX];
 | 
			
		||||
	rlbatch	rl_stak[STAK_MAX + REF_MAX];
 | 
			
		||||
	intlist	il_free;
 | 
			
		||||
	reflist	rl_free;
 | 
			
		||||
	reflist	duds;
 | 
			
		||||
	ref	newref;
 | 
			
		||||
	ref	stak_ptr;
 | 
			
		||||
	SURJ	surjection[SURJ_MAX];
 | 
			
		||||
	cutt	cutptr;
 | 
			
		||||
	cutcode	cut_flag;
 | 
			
		||||
} TRS, *trs;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef CLK_TCK
 | 
			
		||||
extern long sysconf();
 | 
			
		||||
#define CLK_TCK sysconf(3)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Global variables
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifdef TRFILE
 | 
			
		||||
#define TR_GLOB
 | 
			
		||||
#else
 | 
			
		||||
#define TR_GLOB extern
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
TR_GLOB trs debugger;
 | 
			
		||||
TR_GLOB	int	begin_time, end_time;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Function prototypes
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void	transref	( trin job );
 | 
			
		||||
void	init_trin	( trin tr );
 | 
			
		||||
void	clean_up	( trs T );
 | 
			
		||||
void	report_initial	( trs T );
 | 
			
		||||
trs	tr_initial	( trin job );
 | 
			
		||||
void	search		( trs T );
 | 
			
		||||
int	pick_cell	( trs T );
 | 
			
		||||
int     set_fork        ( trs T, int rc );
 | 
			
		||||
void	delete_cut	( trs T );
 | 
			
		||||
reflist	get_rl		( trs T );
 | 
			
		||||
void	put_rl		( trs T, reflist dead );
 | 
			
		||||
intlist get_il		( trs T, boolean b, int x, int y, intlist ip );
 | 
			
		||||
void	put_il		( trs T, intlist dead );
 | 
			
		||||
int	batches_used	( trs T );
 | 
			
		||||
ref	get_ref		( trs T );
 | 
			
		||||
void	put_ref		( trs T, ref dead, boolean flag );
 | 
			
		||||
void	rec_put_il	( trs T, intlist ip, ref r, boolean flag );
 | 
			
		||||
void	more_refs	( trs T );
 | 
			
		||||
void	more_rls	( trs T );
 | 
			
		||||
void	more_ils	( trs T );
 | 
			
		||||
boolean	invalue		( trs T, cell c, int v );
 | 
			
		||||
void	transfer_ref	(trs T, cell c, ref rf);
 | 
			
		||||
void	blockval	( trs T, cell c, int v, ref rrf, report_code RC );
 | 
			
		||||
boolean	surjok		( trs T );
 | 
			
		||||
void	outvalue	( trs T, cell c );
 | 
			
		||||
void	untransfer_ref	(trs T, cell c, ref rf);
 | 
			
		||||
void	unblockval	( trs T, cell c, int v, ref rrf );
 | 
			
		||||
void	mark_delete	( trs T, ref r );
 | 
			
		||||
void	delete_duds	( trs T );
 | 
			
		||||
void	delete_a_dud	( trs T, reflist r );
 | 
			
		||||
void	setref		( trs T );
 | 
			
		||||
void	reduceref	( trs T );
 | 
			
		||||
void	addref		( int x, trs T );
 | 
			
		||||
void    print_ref       ( ref r );
 | 
			
		||||
void    print_sus       ( trs T, cell c );
 | 
			
		||||
void	totsus		( trs T );
 | 
			
		||||
void	make_coherent	( trs T );
 | 
			
		||||
void	no_ref		( trs T );
 | 
			
		||||
void	new_small_ref	( int cells[], int vals[], boolean valency[], trs T );
 | 
			
		||||
void	remove_value	( trs T, cell c, int x );
 | 
			
		||||
intlist	get_all_ils	( int cells[], int vals[], boolean valency[], int x, trs T );
 | 
			
		||||
boolean	subsumed	( ref the_ref, trs T );
 | 
			
		||||
boolean	subsumes	( ref little_ref, ref big_ref );
 | 
			
		||||
void	back_sub	( trs T, ref the_ref );
 | 
			
		||||
void	Ref		( int x, trs T );
 | 
			
		||||
void	record_cut	( trs T );
 | 
			
		||||
void	record_part_cut	( int x, trs T );
 | 
			
		||||
void	complete_cut	( int ex, trs T );
 | 
			
		||||
boolean	prepared	( trs T );
 | 
			
		||||
void	setinx		( trs T );
 | 
			
		||||
boolean	pre_test	( trs T );
 | 
			
		||||
boolean	absfixt		( int x );
 | 
			
		||||
void	surjective	( logical vec[], logical vset, trs T );
 | 
			
		||||
void	injective	( logical vec[], int x, trs T );
 | 
			
		||||
void	co_priority	( int x, int y, trs T );
 | 
			
		||||
void	ref_size_report	();
 | 
			
		||||
void	Report		( trin tr );
 | 
			
		||||
void	report_branches	( trin tr );
 | 
			
		||||
void	dump_refs	( int rows, int columns );
 | 
			
		||||
void	job_done	( trin t, char *s );
 | 
			
		||||
int	timestamp	();
 | 
			
		||||
void	skipout		( char s[], int exitcode );
 | 
			
		||||
void test_backs         (trs T);
 | 
			
		||||
							
								
								
									
										499
									
								
								src/wffs.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										499
									
								
								src/wffs.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,499 @@
 | 
			
		|||
/*
 | 
			
		||||
*			wffs.c			V2.1 (May 1993)
 | 
			
		||||
*
 | 
			
		||||
*	This contains the routines from MaGIC (other than the
 | 
			
		||||
*	parser) which deal with formulas.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/****************************************************************
 | 
			
		||||
	*								*
 | 
			
		||||
	*			    MaGIC 2.1				*
 | 
			
		||||
	*								*
 | 
			
		||||
	*	    (C) 1993 Australian National University		*
 | 
			
		||||
	*								*
 | 
			
		||||
	* 		       All rights reserved			*
 | 
			
		||||
	*								*
 | 
			
		||||
	* The information in this software is subject to change without	*
 | 
			
		||||
	* notice and should not be construed as a commitment by the	*
 | 
			
		||||
	* Australian National University. The Australian National Uni-	*
 | 
			
		||||
	* versity makes no representations about the suitability of	*
 | 
			
		||||
	* this software for any purpose. It is supplied "as is" without	*
 | 
			
		||||
	* express or implied warranty.  If the software is modified in 	*
 | 
			
		||||
	* a manner creating derivative copyright rights, appropriate	*
 | 
			
		||||
	* legends may be placed on the derivative work in addition to	*
 | 
			
		||||
	* that set forth above.						*
 | 
			
		||||
	*								*
 | 
			
		||||
	* Permission to use, copy, modify and distribute this software	*
 | 
			
		||||
	* and its documentation for any purpose and without fee is	*
 | 
			
		||||
	* hereby granted, provided that both the above copyright notice	*
 | 
			
		||||
	* and this permission notice appear in all copies and sup-	*
 | 
			
		||||
	* porting documentation, and that the name of the Australian	*
 | 
			
		||||
	* National University not be used in advertising or publicity	*
 | 
			
		||||
	* pertaining to distribution of the software without specific,	*
 | 
			
		||||
	* written prior permission.					*
 | 
			
		||||
	*								*
 | 
			
		||||
	****************************************************************/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "MaGIC.h"
 | 
			
		||||
 | 
			
		||||
#define oldsymbol(s) newsymbol(s,0,0)
 | 
			
		||||
#define found_symbol(s) (this_symbol(s)? true: false)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	This grabs, initialises and returns the symbol with the
 | 
			
		||||
*	given string, inserting it in the first unoccupied symbol
 | 
			
		||||
*	structure if need be. It is added to the end of the given 
 | 
			
		||||
*	symbol lists if these are non-null.
 | 
			
		||||
*
 | 
			
		||||
*	If the symbol already exists, no change is made to the 
 | 
			
		||||
*	symbol lists, even if they are non-null.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
symb newsymbol( char *string, symb symbol_list1[], symb symbol_list2[] )
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
  symb sy = 0;
 | 
			
		||||
 | 
			
		||||
  for ( i = 0; i < SYMBOLMAX; i++ )
 | 
			
		||||
    if ( !strcmp(theJob->symtable[i].s,string) )
 | 
			
		||||
      return (theJob->symtable + i);
 | 
			
		||||
 | 
			
		||||
  for ( i = 0; i < SYMBOLMAX; i++ )
 | 
			
		||||
    if ( !theJob->symtable[i].s[0] ) {
 | 
			
		||||
      sy = theJob->symtable + i;
 | 
			
		||||
      strcpy(sy->s, string);
 | 
			
		||||
      sy->next = theJob->symtab;
 | 
			
		||||
      sy->last = 0;
 | 
			
		||||
      if ( theJob->symtab ) theJob->symtab->last = sy;
 | 
			
		||||
      theJob->symtab = sy;
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
  if ( symbol_list1 ) {
 | 
			
		||||
    for ( i = 0; symbol_list1[i]; i++ ) ;
 | 
			
		||||
    symbol_list1[i] = sy;
 | 
			
		||||
    symbol_list1[i+1] = 0;
 | 
			
		||||
  }
 | 
			
		||||
  if ( symbol_list2 ) {
 | 
			
		||||
    for ( i = 0; symbol_list2[i]; i++ ) ;
 | 
			
		||||
    symbol_list2[i] = sy;
 | 
			
		||||
    symbol_list2[i+1] = 0;
 | 
			
		||||
  }
 | 
			
		||||
  return sy;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Wff_initial initialises theJob->form etc.
 | 
			
		||||
*	It is called from dialog.c as part of setting 
 | 
			
		||||
*	up a new job.
 | 
			
		||||
*/
 | 
			
		||||
 
 | 
			
		||||
void wff_initial()
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
  symb dummy_symbol;
 | 
			
		||||
 | 
			
		||||
  dummy_symbol = oldsymbol("no_connective");
 | 
			
		||||
 | 
			
		||||
  for ( i = 0; i < FMAX; i++ ) {
 | 
			
		||||
    theJob->form[i].lsub = theJob->form[i].rsub = 0;
 | 
			
		||||
    if ( i == 0 ) theJob->form[i].sym = dummy_symbol;
 | 
			
		||||
    else if ( i == 1 ) theJob->form[i].sym = oldsymbol("a");
 | 
			
		||||
    else if ( i == 2 ) theJob->form[i].sym = oldsymbol("b");
 | 
			
		||||
    else if ( i < VMAX ) theJob->form[i].sym = oldsymbol(".");
 | 
			
		||||
    else if ( i < VMAX+4+CMAX ) theJob->form[i].sym = oldsymbol(" ");
 | 
			
		||||
    else theJob->form[i].sym = 0;
 | 
			
		||||
  }
 | 
			
		||||
  theJob->form[VMAX].sym = oldsymbol("t");
 | 
			
		||||
  theJob->form[VMAX+1].sym = oldsymbol("f");
 | 
			
		||||
  theJob->form[VMAX+2].sym = oldsymbol("T");
 | 
			
		||||
  theJob->form[VMAX+3].sym = oldsymbol("F");
 | 
			
		||||
  
 | 
			
		||||
  for ( i = 0; i < CMAX; i++ ) {
 | 
			
		||||
    atom[0][i] = VMAX+4+CMAX+i;
 | 
			
		||||
    theJob->form[atom[0][i]].sym = oldsymbol("a");
 | 
			
		||||
    atom[1][i] = VMAX+4+(2*CMAX)+i;
 | 
			
		||||
    theJob->form[atom[1][i]].sym = oldsymbol("b");
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Got_formula calls infml to read in a formula if possible.
 | 
			
		||||
*	If the user asks for help this is given, otherwise the 
 | 
			
		||||
*	boolean return value is 1 for success, 0 for failure.
 | 
			
		||||
*
 | 
			
		||||
*	The parameters x, y and yy are passed on to infml.  The
 | 
			
		||||
*	string s states what type of formula ("axiom", etc) is 
 | 
			
		||||
*	sought.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
boolean got_formula(int x, int y, int yy, char *s)
 | 
			
		||||
{ 
 | 
			
		||||
  for(;;)
 | 
			
		||||
    switch( infml(x,y,yy) ) {
 | 
			
		||||
    case -1:
 | 
			
		||||
      return(0);
 | 
			
		||||
    case 0:
 | 
			
		||||
      return(1);
 | 
			
		||||
    case 1:
 | 
			
		||||
      if ( xdialog ) return(0);
 | 
			
		||||
      printf("\n H)elp, R)epeat %s or N)either?   ", s);
 | 
			
		||||
      switch(readin("hnr")) {
 | 
			
		||||
      case 'n':
 | 
			
		||||
	return(0);
 | 
			
		||||
      case 'h':
 | 
			
		||||
	help(x+1);
 | 
			
		||||
	break;
 | 
			
		||||
      case 'r':
 | 
			
		||||
	printf("\n Definition:   ");
 | 
			
		||||
	fflush(stdout);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*  Infml calls for and processes a formula from stdin.  The two
 | 
			
		||||
*  parameters are: x, the destination (IN_CONC = axiom or
 | 
			
		||||
*  conclusion, IN_PREM = premise, IN_BGUY = badguy, IN_DEFN =
 | 
			
		||||
*  definition); y, the offset for cases other than x = IN_BGUY; yy,
 | 
			
		||||
*  the second offset for cases x = IN_CONC and x = IN_PREM.
 | 
			
		||||
*
 | 
			
		||||
*  Return value is 0 if successful in reading a formula and getting
 | 
			
		||||
*  it parsed, 1 if an error is encountered, -1 if the null formula
 | 
			
		||||
*  is input.
 | 
			
		||||
*
 | 
			
		||||
*  The first action after input is to render the formula hygenic,
 | 
			
		||||
*  checking for bad characters at the same time.  A list of the
 | 
			
		||||
*  symbols is compiled from the input string.  By default, each
 | 
			
		||||
*  string of characters surrounded by white space (or parentheses)
 | 
			
		||||
*  is tried against the symbol table. If it is not found, initial
 | 
			
		||||
*  segments are tried.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
int infml(input_case x, int y, int yy)
 | 
			
		||||
{
 | 
			
		||||
  int i, k, wf;
 | 
			
		||||
  symb fml[SLEN*2];
 | 
			
		||||
  char longs[SLEN];
 | 
			
		||||
 | 
			
		||||
  if ( x != IN_DEFN && !xdialog ) printf("\n Enter formula (or RETURN):  ");
 | 
			
		||||
  fflush(stdout);
 | 
			
		||||
  fgets(answer,SLEN,stdin);
 | 
			
		||||
 | 
			
		||||
  k = 0;
 | 
			
		||||
  while ( next_symbol(longs) )
 | 
			
		||||
    if ( !seek_symbol(longs,fml,&k) ) {
 | 
			
		||||
      EP;
 | 
			
		||||
      printf("\n Illegal input: unrecognised symbol %s\n\n ", longs);
 | 
			
		||||
      return 1;
 | 
			
		||||
    }
 | 
			
		||||
  if ( !k ) return -1;
 | 
			
		||||
  fml[k] = 0;
 | 
			
		||||
 | 
			
		||||
  if ( x == IN_DEFN ) {
 | 
			
		||||
    if ( k == 1 ) {
 | 
			
		||||
      EP; printf("\n ERROR: definition is too short!\n\n");
 | 
			
		||||
      return 1;
 | 
			
		||||
    }
 | 
			
		||||
    if ( theJob->adicity[y] ) {
 | 
			
		||||
      for ( i = 0; i < k; i++ )
 | 
			
		||||
	if ( !strchr(fml[i]->s,'a') ) break;
 | 
			
		||||
      if ( i == k ) {
 | 
			
		||||
	EP; printf("\n ERROR: variable \"a\" does not ");
 | 
			
		||||
	printf("occur in the definition\n\n");
 | 
			
		||||
	return 1;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    if ( theJob->adicity[y] == 2 ) {
 | 
			
		||||
      for ( i = 0; i < k; i++ )
 | 
			
		||||
	if ( !strchr(fml[i]->s,'b') ) break;
 | 
			
		||||
      if ( i == k ) {
 | 
			
		||||
	EP; printf("\n ERROR: variable \"b\" does not ");
 | 
			
		||||
	printf("occur in the definition\n\n");
 | 
			
		||||
	return 1;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  wf = parse(fml);
 | 
			
		||||
  if ( !wf ) return 1;
 | 
			
		||||
  if ( x == IN_CONC )
 | 
			
		||||
    theJob->croot[y][yy] = wf;
 | 
			
		||||
  else if ( x == IN_PREM )
 | 
			
		||||
    theJob->proot[y][yy] = wf;
 | 
			
		||||
  else if ( x == IN_BGUY )
 | 
			
		||||
    theJob->failure = wf;
 | 
			
		||||
  else {
 | 
			
		||||
    fix_atoms(y,wf);
 | 
			
		||||
    theJob->defcon[y] = wf;
 | 
			
		||||
  }
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Get the first space-delimited sequence of nonspace characters 
 | 
			
		||||
*	from answer[], truncate answer[] to the following portion and
 | 
			
		||||
*	return true. If there is no such sequence, return false.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
boolean next_symbol( char longs[] )
 | 
			
		||||
{
 | 
			
		||||
  int i, j;
 | 
			
		||||
 | 
			
		||||
  for ( i = 0; answer[i] && isspace(answer[i]); i++ );
 | 
			
		||||
  if ( !answer[i] ) return false;
 | 
			
		||||
  j = i;
 | 
			
		||||
  do {
 | 
			
		||||
    longs[i-j] = answer[i];
 | 
			
		||||
    i++;
 | 
			
		||||
  }
 | 
			
		||||
  while ( answer[i-1] && !isspace(answer[i-1]) ); i--;
 | 
			
		||||
  if ( answer[i] ) longs[i-j] = 0;
 | 
			
		||||
  for ( j = 0; answer[j]; j++ ) answer[j] = answer[j+i];
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	String occurs in the current symbol table.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
symb this_symbol( char *string )
 | 
			
		||||
{
 | 
			
		||||
  symb sy;
 | 
			
		||||
 | 
			
		||||
  for ( sy = theJob->symtab; sy; sy = sy->next )
 | 
			
		||||
    if ( !strcmp(sy->s,string) ) return sy;
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	The "long string" longs may contain exactly a meaningful symbol,
 | 
			
		||||
*	in which case this is placed in fml[*k] and *k incremented.
 | 
			
		||||
*	Otherwise, the longest meaningful initial substring is placed
 | 
			
		||||
*	in fml[*k], *k incremented and the remainder of longs treated 
 | 
			
		||||
*	recursively. The value returned is true on success, false if no
 | 
			
		||||
*	meaningful initial string is found. 
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
boolean seek_symbol( char longs[], symb fml[], int *k )
 | 
			
		||||
{
 | 
			
		||||
  char shorts[64], *cp;
 | 
			
		||||
  int i, j;
 | 
			
		||||
 | 
			
		||||
  if ( !*longs ) return true;
 | 
			
		||||
  if ( found_symbol(longs) ) {
 | 
			
		||||
    fml[(*k)++] = this_symbol(longs);
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( (cp = strchr(longs,'(')) && (j = cp - longs) ) {
 | 
			
		||||
    for ( i = 0; i < j; i++ ) shorts[i] = longs[i];
 | 
			
		||||
    shorts[i] = 0;
 | 
			
		||||
    if ( !seek_symbol(shorts, fml, k) ) return false;
 | 
			
		||||
    for ( i = 0; longs[i]; i++ ) longs[i] = longs[i+j];
 | 
			
		||||
  }		
 | 
			
		||||
  else if ( (cp = strchr(longs,')')) && (j = cp-longs) ) {
 | 
			
		||||
    for ( i = 0; i < j; i++ ) shorts[i] = longs[i];
 | 
			
		||||
    shorts[i] = 0;
 | 
			
		||||
    if ( !seek_symbol(shorts, fml, k) ) return false;
 | 
			
		||||
    for ( i = 0; longs[i]; i++ ) longs[i] = longs[i+j];
 | 
			
		||||
  }		
 | 
			
		||||
 | 
			
		||||
  if ( strchr(")(",*longs) ) {
 | 
			
		||||
    *shorts = *longs;
 | 
			
		||||
    shorts[1] = 0;
 | 
			
		||||
    fml[(*k)++] = oldsymbol(shorts);
 | 
			
		||||
    return seek_symbol(longs+1, fml, k);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  strcpy( shorts, longs );
 | 
			
		||||
  for ( i = strlen(longs)-1; i; i-- ) {
 | 
			
		||||
    shorts[i] = 0;
 | 
			
		||||
    if ( found_symbol(shorts) ) {
 | 
			
		||||
      fml[(*k)++] = this_symbol(shorts);
 | 
			
		||||
      return seek_symbol(longs+i, fml, k);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if ( isalpha(*longs) ) {
 | 
			
		||||
		*shorts = *longs;
 | 
			
		||||
		shorts[1] = 0;
 | 
			
		||||
		fml[(*k)++] = oldsymbol(shorts);
 | 
			
		||||
		return seek_symbol(longs+1, fml, k);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Part of infml is to "fix the atoms".  This means change the
 | 
			
		||||
*	occurrences of 'a' and 'b' in the definition of defined 
 | 
			
		||||
*	connective #y to atom[0][y] and atom[1][y] respectively.
 | 
			
		||||
*	The other parameter, dy, points to the subformula within 
 | 
			
		||||
*	which to search for 'a' and 'b'.  Fix_atoms is recursive.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void fix_atoms(int y, int wf)
 | 
			
		||||
{
 | 
			
		||||
  WFF *dy;
 | 
			
		||||
 | 
			
		||||
  if ( !wf ) return;
 | 
			
		||||
  dy = theJob->form + wf;
 | 
			
		||||
 | 
			
		||||
  if ( dy->lsub ) {
 | 
			
		||||
    if ( !strcmp(theJob->form[dy->lsub].sym->s,"a") ) 
 | 
			
		||||
      dy->lsub = atom[0][y];
 | 
			
		||||
    else if ( !strcmp(theJob->form[dy->lsub].sym->s,"b") ) 
 | 
			
		||||
      dy->lsub = atom[1][y];
 | 
			
		||||
    else fix_atoms(y,dy->lsub);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  if ( dy->rsub ) {
 | 
			
		||||
    if ( !strcmp(theJob->form[dy->rsub].sym->s,"a") ) 
 | 
			
		||||
      dy->rsub = atom[0][y];
 | 
			
		||||
    else if ( !strcmp(theJob->form[dy->rsub].sym->s,"b") ) 
 | 
			
		||||
      dy->rsub = atom[1][y];
 | 
			
		||||
    else fix_atoms(y,dy->rsub);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Outfml is a very simple deparser which writes the formula
 | 
			
		||||
*	rooted at p, a subformula of that rooted at q, to stream f.
 | 
			
		||||
*
 | 
			
		||||
*	Local variable c is set to p->sym just for brevity.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void outformula(int p, int q, FILE *f, varmode vm)
 | 
			
		||||
{
 | 
			
		||||
  symb c;
 | 
			
		||||
 | 
			
		||||
  if ( p <= 0 ) skipout("Attempt to print nonsense formula",SKIP);
 | 
			
		||||
 | 
			
		||||
  c = theJob->form[p].sym;
 | 
			
		||||
 | 
			
		||||
  if ( symbol_listed(2,c) ) {
 | 
			
		||||
    if ( p != q ) fprintf( f, "(" );
 | 
			
		||||
    outformula(theJob->form[p].lsub,q,f,vm);
 | 
			
		||||
    fprintf( f, " %s ", c->s );
 | 
			
		||||
    outformula(theJob->form[p].rsub,q,f,vm);
 | 
			
		||||
    if ( p != q ) fprintf( f, ")" );
 | 
			
		||||
  }
 | 
			
		||||
  else if ( symbol_listed(1,c) ) {
 | 
			
		||||
    fprintf( f, "%s", c->s );
 | 
			
		||||
    if ( strlen(c->s) > 1 ) fprintf( f, " " );
 | 
			
		||||
    outformula(theJob->form[p].rsub,q,f,vm);
 | 
			
		||||
  }
 | 
			
		||||
  else {
 | 
			
		||||
    if ( p <= Vmax && vm == VALS )
 | 
			
		||||
      fprintf( f, "%d", theJob->form[p].val );
 | 
			
		||||
    else fprintf( f, "%s", c->s );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*	Is_in returns 1 (true) if c occurs in the formula *w 
 | 
			
		||||
*	and 0 (false) if it does not.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
boolean is_in(symb s, int w)
 | 
			
		||||
{
 | 
			
		||||
  if ( w <= 0 ) return false;
 | 
			
		||||
  if ( theJob->form[w].sym == s ) return true;
 | 
			
		||||
  if ( is_in( s, theJob->form[w].lsub )) return true;
 | 
			
		||||
  return is_in(s, theJob->form[w].rsub);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
*       It is sometimes necessary to purge the formula list of any
 | 
			
		||||
*       appeal to a given symbol.  This is done especially when a
 | 
			
		||||
*       connective has just been deleted.
 | 
			
		||||
*
 | 
			
		||||
*	The first move is to propagate the bad symbol up the tree:
 | 
			
		||||
*	anything with a bad subformula is also bad.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void purge( symb badsym )
 | 
			
		||||
{
 | 
			
		||||
  int i, j, k, m;
 | 
			
		||||
 | 
			
		||||
  for ( k = 1; theJob->form[k].sym; k++ ) {
 | 
			
		||||
    if ( theJob->form[theJob->form[k].lsub].sym == badsym )
 | 
			
		||||
      theJob->form[k].sym = badsym;
 | 
			
		||||
    if ( theJob->form[theJob->form[k].rsub].sym == badsym )
 | 
			
		||||
      theJob->form[k].sym = badsym;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  j = 1;
 | 
			
		||||
  for ( i = 1; theJob->form[i].sym; i++ )
 | 
			
		||||
    if ( theJob->form[i].sym == badsym ) {
 | 
			
		||||
      if ( j < i ) j = i;
 | 
			
		||||
      while ( theJob->form[++j].sym == badsym ) ;
 | 
			
		||||
      if ( ! theJob->form[j].sym ) {
 | 
			
		||||
	do {
 | 
			
		||||
	  theJob->form[i].sym = 0;
 | 
			
		||||
	  theJob->form[i].lsub = 0;
 | 
			
		||||
	  theJob->form[i].rsub = 0;
 | 
			
		||||
	}
 | 
			
		||||
	while ( ++i <= j );
 | 
			
		||||
	return;
 | 
			
		||||
      }
 | 
			
		||||
      theJob->form[i].sym = theJob->form[j].sym;
 | 
			
		||||
      theJob->form[i].lsub = theJob->form[j].lsub;
 | 
			
		||||
      theJob->form[i].rsub = theJob->form[j].rsub;
 | 
			
		||||
      theJob->form[j].sym = badsym;
 | 
			
		||||
 | 
			
		||||
      for ( k = j+1; theJob->form[k].sym; k++ ) {
 | 
			
		||||
	if ( theJob->form[k].lsub == j )
 | 
			
		||||
	  theJob->form[k].lsub = i;
 | 
			
		||||
	if ( theJob->form[k].rsub == j )
 | 
			
		||||
	  theJob->form[k].rsub = i;
 | 
			
		||||
      }
 | 
			
		||||
      if ( theJob->failure == j ) theJob->failure = i;
 | 
			
		||||
      for ( k = 0; theJob->croot[k][0]; k++ )
 | 
			
		||||
	for ( m = 0; m < RTMAX; m++ ) {
 | 
			
		||||
	  if ( theJob->proot[k][m] == j )
 | 
			
		||||
	    theJob->proot[k][m] = i;
 | 
			
		||||
	  if ( theJob->croot[k][m] == j )
 | 
			
		||||
	    theJob->croot[k][m] = i;
 | 
			
		||||
	}
 | 
			
		||||
      for ( k = 0; theJob->dcs[k]; k++ )
 | 
			
		||||
	if ( theJob->defcon[k] == j ) theJob->defcon[k] = i;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue