mirror of
https://github.com/arranstewart/magic.git
synced 2024-12-03 12:00:24 -05: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…
Reference in a new issue