Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/GAP/pkg/kbmag/standalone/src/   (Algebra von RWTH Aachen Version 4.15.1©)  Datei vom 3.0.2023 mit Größe 9 kB image not shown  

Quelle  wordreduce.c   Sprache: C

 
/* wordreduce.c 1/11/94.
 * 6/11/99 re-introduce option to input list of words from filename.
 *         also added -e option (expanded) to output expanded powers.
 * 6/8/98 large scale reorganisation to omit globals, etc.
 * 5/2/98 change generators from type char to type `gen'.
 *
 * 15/3/96 - amalgamated with wordreducecos.c, which was specially written
 * for reducing cosets using a word-difference machines.
 * There is now a -cos option, which means reduce cosets (using either
 * a rewriting system or a word-difference machine).
 * For coset reduction using a rewrting system, the word to be reduced can
 * contain any of available symbols, but to make sense (for H subgroup of G),
 * it should either be a word in the G-generators alone, or a word in the
 * H-generators alone, or a word of form H-word*_H*G-word.
 * For coset reduction using a word-difference machine, the word to be
 * reduced must either be in the G-generators alone, or have form _H*G-word.
 *
 * Input of words from a filename specified on command line no longer works.
 *
 * 18/1/95 - added options to reduce words using rewriting system.
 * Reduce words using a rewriting system or a word-difference machine.
 *
 * SYNOPSIS:
 *    wordreduce [-kbprog/-diff1/-diff2/-diff1c] [-mrl maxreducelen] [-e]
 *      [-cos] groupname [cosname] [-f filename]
 *
 * If -cos is false:
 * Input is from groupname.kbprog, groupname.diff1, groupname.diff2 or
 * groupname.diff1c, and stdin.
 *
 * If -cos is true:
 * cosname defaults to "cos"
 * Input is from groupname.cosname.kbprog, groupname.cosname.midiff1,
 * groupname.cosname.midiff2, and stdin (unless -f filename is used).
 *
 * Output is to stdout (unless -f filename is used).
 *
 * If the optional "-f filename" argument is present, then the file filename
 * should contain an assignment of a list of words to be reduced
 * (e.g. words := [a^3,(a*b)^7];), and output will be a list of reduced words
 * to filename.reduced.
 *
 * OPTIONS:
 * -cos If set reduce cosets. This changes i/o files.
 *
 * -kbprog/diff1/diff2/diff1c
 * This determines which finite state automaton is used for
 * the word-reduction.
 * If the kbprog flag is called, then a rewriting system is
 * input from groupname.kbprog
 * (or, if -cos, groupname.cosname.kbprog).
 * Otherwise, a word-difference machine is input from the
 * appropriate file.
 * The default is groupname.kbprog if that file is present,
 * and otherwise groupname.diff2.
 *
 * Words are input interactively to stdin and output to stdout.
 */


#include <stdio.h>
#include "defs.h"
#include "fsa.h"
#include "rws.h"
#include "definitions.h"

#define MAXEQNS 32767
#define MAXREDUCELEN 32767

static FILE *rfile, *wfile;

static void badusage(void);

int main(int argc, char *argv[])
{
  int delim, arg, num_gens, i;
  char gpname[100], cosgpname[100], inf1[100], fsaname[100], inf2[100],
      outf[100];
  boolean rws_ip, diff1_ip, diff2_ip, diff1c_ip, file_ip, expwds, open, first;
  boolean cosets = FALSE;
  rewriting_system rws;
  rewriting_system *rwsptr;
  reduction_struct rs;
  int (*reduce_word)(gen * w, reduction_struct * rs_rws);
  boolean seengpname, seencosname;
  gen *gen_word;
  char **gen_names;

  setbuf(stdout, (char *)0);
  setbuf(stderr, (char *)0);

  rwsptr = &rws;
  rwsptr->maxeqns = MAXEQNS;
  rwsptr->maxreducelen = MAXREDUCELEN;
  rwsptr->inv_of = 0;
  rwsptr->weight = 0;
  rwsptr->level = 0;
  rwsptr->history = 0;
  rwsptr->slowhistory = 0;
  rwsptr->slowhistorysp = 0;
  rwsptr->preflen = 0;
  rwsptr->prefno = 0;
  rs.rws = rwsptr;
  gpname[0] = '\0';
  arg = 1;
  rws_ip = diff1_ip = diff2_ip = diff1c_ip = file_ip = expwds = FALSE;
  seengpname = seencosname = FALSE;
  while (argc > arg) {
    if (strcmp(argv[arg], "-cos") == 0)
      cosets = TRUE;
    else if (strcmp(argv[arg], "-kbprog") == 0)
      rws_ip = TRUE;
    else if (strcmp(argv[arg], "-diff1") == 0)
      diff1_ip = TRUE;
    else if (strcmp(argv[arg], "-diff2") == 0)
      diff2_ip = TRUE;
    else if (strcmp(argv[arg], "-diff1c") == 0)
      diff1c_ip = TRUE;
    else if (strcmp(argv[arg], "-e") == 0)
      expwds = TRUE;
    else if (strcmp(argv[arg], "-mrl") == 0) {
      rwsptr->maxreducelenset = TRUE;
      arg++;
      if (arg >= argc)
        badusage();
      rwsptr->maxreducelen = atoi(argv[arg]);
    }
    else if (strcmp(argv[arg], "-f") == 0) {
      file_ip = TRUE;
      arg++;
      if (arg >= argc)
        badusage();
      strcpy(inf2, argv[arg]);
      strcpy(outf, inf2);
      strcat(outf, ".reduced");
    }
    else if (argv[arg][0] == '-')
      badusage();
    else if (!seengpname) {
      seengpname = TRUE;
      strcpy(gpname, argv[arg]);
    }
    else if (!seencosname) {
      seencosname = TRUE;
      sprintf(cosgpname, "%s.%s", gpname, argv[arg]);
    }
    else
      badusage();

    arg++;
  }

  if (!seengpname)
    badusage();
  if (cosets && !seencosname)
    sprintf(cosgpname, "%s.cos", gpname);

  if (cosets)
    strcpy(inf1, cosgpname);
  else
    strcpy(inf1, gpname);

  rwsptr->maxreducelen *= 2;
  /* Since rws-reduction returns when half of this length is exceeded. */
  open = FALSE;
  if (rws_ip)
    strcat(inf1, ".kbprog");
  else if (diff1_ip) {
    if (cosets)
      strcat(inf1, ".midiff1");
    else
      strcat(inf1, ".diff1");
  }
  else if (diff2_ip) {
    if (cosets)
      strcat(inf1, ".midiff2");
    else
      strcat(inf1, ".diff2");
  }
  else if (diff1c_ip) {
    if (cosets) {
      fprintf(stderr, "Sorry, diff1c coset reduction is not yet supported.\n");
      exit(1);
    }
    strcat(inf1, ".diff1c");
  }
  else {
    strcat(inf1, ".kbprog");
    rfile = fopen(inf1, "r");
    if (rfile) {
      rws_ip = TRUE;
      open = TRUE;
    }
    else {
      diff2_ip = TRUE;
      if (cosets) {
        strcpy(inf1, cosgpname);
        strcat(inf1, ".midiff2");
      }
      else {
        strcpy(inf1, gpname);
        strcat(inf1, ".diff2");
      }
    }
  }

  if (!open)
    if ((rfile = fopen(inf1, "r")) == 0) {
      fprintf(stderr, "Cannot open file %s.\n", inf1);
      exit(1);
    }

  if (rws_ip) {
    rwsptr->cosets = cosets;
    tmalloc(rwsptr->reduction_fsa, fsa, 1);
    read_kbinput_simple(rfile, FALSE, rwsptr);
    fclose(rfile);
    if (cosets)
      strcpy(inf1, cosgpname);
    else
      strcpy(inf1, gpname);
    strcat(inf1, ".reduce");
    if ((rfile = fopen(inf1, "r")) == 0) {
      fprintf(stderr, "Cannot open file %s.\n", inf1);
      exit(1);
    }
    fsa_read(rfile, rwsptr->reduction_fsa, DENSE, 0, 0, TRUE, fsaname);
    fclose(rfile);
    num_gens = rws.num_gens;
    gen_names = rws.gen_name;
    process_names(gen_names, num_gens);
    tmalloc(rws.history, int, rwsptr->maxreducelen + 1);
  }
  else {
    tmalloc(rs.wd_fsa, fsa, 1);
    fsa_read(rfile, rs.wd_fsa, DENSE, 0, 0, TRUE, fsaname);
    fclose(rfile);
    num_gens = rs.wd_fsa->alphabet->base->size;
    if (cosets && (diff1_ip || diff2_ip)) {
      /* Because of the separator, we copy the names and add "_H" as separator
       */

      num_gens++;
      tmalloc(gen_names, char *, num_gens + 1);
      for (i = 1; i < num_gens; i++) {
        tmalloc(gen_names[i], char,
                stringlen(rs.wd_fsa->alphabet->base->names[i] + 1));
        strcpy(gen_names[i], rs.wd_fsa->alphabet->base->names[i]);
      }
      tmalloc(gen_names[num_gens], char, 3);
      strcpy(gen_names[num_gens], "_H");
      rs.separator = num_gens;
    }
    else
      gen_names = rs.wd_fsa->alphabet->base->names;
    process_names(gen_names, num_gens);
    /* Set the pointers in the word-difference machine */
    if (fsa_table_dptr_init(rs.wd_fsa) == -1)
      exit(1);
  }

  reduce_word = rws_ip ? rws_reduce : cosets ? diff_reduce_cos : diff_reduce;

  tmalloc(gen_word, gen, rwsptr->maxreducelen);

  if (file_ip) {
    /* open file containing list of words, and deal with assignment */
    if ((rfile = fopen(inf2, "r")) == 0) {
      fprintf(stderr, "Cannot open file %s.\n", inf2);
      exit(1);
    }
    wfile = fopen(outf, "w");
    read_ident(rfile, kbm_buffer, &delim, FALSE);
    fprintf(wfile, "%s.reduced := [\n", kbm_buffer);
    if (delim != ':') {
      fprintf(stderr, "#Input error: file must contain a list assignment\n");
      exit(1);
    }
    check_next_char(rfile, '=');
    read_delim(rfile, &delim);
    if (delim != '[') {
      fprintf(stderr, "#Input error: file must contain a list assignment\n");
      exit(1);
    }
    first = TRUE;
  }
  else {
    printf("#Input words for reduction.\n#Separate words with ','.\n");
    printf("#Terminate input with ';'.\n");
    rfile = stdin;
    wfile = stdout;
  }

  delim = 0;
  while (delim != ';' && delim != ']') {
    read_word(rfile, gen_word, gen_word + rwsptr->maxreducelen, &delim,
              gen_names, num_gens, TRUE);
    reduce_word(gen_word, &rs);
    if (genstrlen(gen_word) > rwsptr->maxreducelen / 2) {
      fprintf(wfile, "Word grew too long during reduction!\n");
    }
    else {
      if (file_ip) {
        if (first)
          first = FALSE;
        else
          fprintf(wfile, ",\n");
      }
      else
        fprintf(wfile, "reduces to:\n");
      strcpy(kbm_buffer, " ");
      if (expwds)
        add_expanded_word_to_buffer(wfile, gen_word, gen_names);
      else
        add_word_to_buffer(wfile, gen_word, gen_names);
      if (file_ip)
        fprintf(wfile, "%s", kbm_buffer);
      else
        fprintf(wfile, "%s\n", kbm_buffer);
    }
  }
  if (file_ip) {
    check_next_char(rfile, ';');
    fprintf(wfile, "\n];\n");
    fclose(wfile);
  }

  if (rws_ip) {
    rws_clear(rwsptr);
    fsa_clear(rwsptr->reduction_fsa);
  }
  else {
    fsa_clear(rs.wd_fsa);
    tfree(rs.wd_fsa);
  }
  tfree(gen_word);
  exit(0);
}

void badusage(void)
{
  fprintf(stderr, "Usage: wordreduce [-kbprog/-diff1/-diff2/-diff1c] [-mrl "
                  "maxreducelen] [-e]\n");
  fprintf(stderr, "\t[-cos] groupname [cosname] [-f filename]\n");
  exit(1);
}

Messung V0.5
C=99 H=95 G=96

¤ Dauer der Verarbeitung: 0.0 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.