Changed generating functions printouts to be copy-paste-able into SageMath.

Now we can do things like:

# copy-paste from output
ring.<t,L,tie,Cn,M,Ln,I,D,J,Rn,A,K,F,G> = QQ[]
ID = ring.ideal(L - (1*Cn*t),tie - (1*Ln*t),Cn - (1*I + 1*J),M - (1*t^2),Ln - (1*D + 1*L + 1*M),I - (1*Rn*t),D - (1*Rn*t),J - (1*Ln*t),Rn - (1*F + 1*G + 1*K),A - (1*tie),K - (1*t^2),F - (1*Ln*t),G - (1*Cn*t))

# we are interested in tie in terms of t; so we want to remove anything not these two:
ID.elimination_ideal([L,Cn,M,Ln,I,D,J,Rn,A,K,F,G])

# output from this SageMath command is
# Ideal (t^3 + 2*t^2*tie + t*tie - tie) of Multivariate Polynomial Ring in t, L, tie, Cn, M, Ln, I, D, J, Rn, A, K, F, G over Rational Field
# which we can solve for tie to get tie = t^3/(1-t-2*t^2) just as expected
This commit is contained in:
Mikael Vejdemo-Johansson 2015-04-10 10:05:19 +02:00
parent a72aff9b39
commit d13657a411
2 changed files with 93 additions and 11 deletions

View file

@ -20,7 +20,8 @@
#include <stdio.h>
const char *nonterminal_name(const HCFGrammar *g, const HCFChoice *nt) {
if(nt->user_data != NULL) {
// if user_data exists and is printable:
if(nt->user_data != NULL && *(char*)(nt->user_data) > ' ' && *(char*)(nt->user_data) < 127) {
if(*(char*)(nt->user_data) != '0') {
// user_data is a non-empty string
return nt->user_data;
@ -80,7 +81,7 @@ void readsequence(FILE *file, uint32_t *count, uint32_t *length,
*count *= cscount;
break;
default: // HCF_CHOICE, non-terminal symbol
fprintf(file, "*%s(t)", nonterminal_name(g, *x));
fprintf(file, "*%s", nonterminal_name(g, *x));
break;
}
}
@ -101,19 +102,48 @@ void h_pprint_gfeqns(FILE *file, const HCFGrammar *g) {
// determine maximum string length of symbol names
int len;
size_t s;
for(len=1, s=26; s < g->nts->used; len++, s*=26);
for(len=1, s=26; s < g->nts->used; len++, s*=26);
// iterate over g->nts
// emit the SageMath ring init string
// iterate over g->nts, output symbols
size_t i;
HHashTableEntry *hte;
HHashTableEntry *hte;
fprintf(file, "ring.<t");
for(i=0; i < g->nts->capacity; i++) {
for(hte = &g->nts->contents[i]; hte; hte = hte->next) {
if (hte->key == NULL) {
continue;
}
const HCFChoice *nt = hte->key;
fprintf(file, ",");
fprintf(file, "%s", nonterminal_name(g, nt));
}
}
fprintf(file, "> = QQ[]\n");
// iterate over g->nts
// emit a Sage ideal definition
int j=0;
fprintf(file, "ID = ring.ideal(");
for(i=0; i < g->nts->capacity; i++) {
for(hte = &g->nts->contents[i]; hte; hte = hte->next) {
if (hte->key == NULL) {
continue;
}
if(j>0) {
fprintf(file, ",");
}
j++;
const HCFChoice *nt = hte->key;
fprintf(file, "%s(t) = ", nonterminal_name(g, nt));
const char *ntn = nonterminal_name(g, nt);
if(*ntn == 0) {
continue;
}
fprintf(file, "%s - (", ntn);
for(HCFSequence **seq = nt->seq; *seq; seq++) {
@ -142,7 +172,8 @@ void h_pprint_gfeqns(FILE *file, const HCFGrammar *g) {
}
}
fprintf(file, "\n");
fprintf(file, ")");
}
}
fprintf(file, ")\n");
}

View file

@ -47,6 +47,18 @@ HParser* finkmao() {
h_bind_indirect(Rnext, R_);
h_bind_indirect(Cnext, C_);
HParser *tie = h_sequence(L, Lnext, NULL);
h_desugar_augmented(mm__, tie);
L->desugared->user_data = "L";
R->desugared->user_data = "R";
C->desugared->user_data = "C";
Lnext->desugared->user_data = "Ln";
Rnext->desugared->user_data = "Rn";
Cnext->desugared->user_data = "Cn";
tie->desugared->user_data = "tie";
U->desugared->user_data = "0U";
return tie;
}
@ -103,7 +115,20 @@ HParser* depth1TW() {
h_epsilon_p(),
NULL);
h_bind_indirect(tuckpairstar, tpstar_);
return h_choice(h_sequence(prefix, tuckpairstar, tuck, NULL), NULL);
HParser *tie = h_choice(h_sequence(prefix, tuckpairstar, tuck, NULL), NULL);
h_desugar_augmented(mm__, tie);
T->desugared->user_data = "T";
W->desugared->user_data = "W";
U->desugared->user_data = "0U";
prefix->desugared->user_data = "prefix";
pair->desugared->user_data = "pair";
tuck->desugared->user_data = "tuck";
tpstar_->desugared->user_data = "tuckpairstar";
tie->desugared->user_data = "tie";
return tie;
}
HParser* depth1() {
@ -144,10 +169,23 @@ HParser* depth1() {
h_bind_indirect(lastR, R_);
h_bind_indirect(lastL, L_);
h_bind_indirect(lastC, C_);
return h_choice(h_sequence(L, lastL, NULL),
HParser* tie = h_choice(h_sequence(L, lastL, NULL),
h_sequence(R, lastR, NULL),
h_sequence(C, lastC, NULL),
NULL);
h_desugar_augmented(mm__, tie);
L->desugared->user_data = "L";
R->desugared->user_data = "R";
C->desugared->user_data = "C";
U->desugared->user_data = "0U";
lastL ->desugared->user_data = "Ln";
lastR->desugared->user_data = "Rn";
lastC->desugared->user_data = "Cn";
tie->desugared->user_data = "tie";
return tie;
}
HParser* depthNTW() {
@ -237,14 +275,27 @@ HParser* depthNTW() {
NULL);
h_bind_indirect(tuckpairstar, tpstar_);
return h_choice(h_sequence(prefix, tuckpairstar, tuck, NULL), NULL);
HParser *tie = h_choice(h_sequence(prefix, tuckpairstar, tuck, NULL), NULL);
h_desugar_augmented(mm__, tie);
T->desugared->user_data = "T";
W->desugared->user_data = "W";
U->desugared->user_data = "0U";
prefix->desugared->user_data = "prefix";
pair->desugared->user_data = "pair";
tuck->desugared->user_data = "tuck";
tpstar_->desugared->user_data = "tuckpairstar";
tie->desugared->user_data = "tie";
return tie;
}
int main(int argc, char **argv) {
mm__ = &system_allocator;
HParser *p = finkmaoTW();
HParser *p = finkmao();
HCFGrammar *g = h_cfgrammar_(mm__, h_desugar_augmented(mm__, p));
if (g == NULL) {
fprintf(stderr, "h_cfgrammar failed\n");