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:
parent
a72aff9b39
commit
d13657a411
2 changed files with 93 additions and 11 deletions
|
|
@ -20,7 +20,8 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
const char *nonterminal_name(const HCFGrammar *g, const HCFChoice *nt) {
|
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') {
|
if(*(char*)(nt->user_data) != '0') {
|
||||||
// user_data is a non-empty string
|
// user_data is a non-empty string
|
||||||
return nt->user_data;
|
return nt->user_data;
|
||||||
|
|
@ -80,7 +81,7 @@ void readsequence(FILE *file, uint32_t *count, uint32_t *length,
|
||||||
*count *= cscount;
|
*count *= cscount;
|
||||||
break;
|
break;
|
||||||
default: // HCF_CHOICE, non-terminal symbol
|
default: // HCF_CHOICE, non-terminal symbol
|
||||||
fprintf(file, "*%s(t)", nonterminal_name(g, *x));
|
fprintf(file, "*%s", nonterminal_name(g, *x));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -103,17 +104,46 @@ void h_pprint_gfeqns(FILE *file, const HCFGrammar *g) {
|
||||||
size_t s;
|
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;
|
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(i=0; i < g->nts->capacity; i++) {
|
||||||
for(hte = &g->nts->contents[i]; hte; hte = hte->next) {
|
for(hte = &g->nts->contents[i]; hte; hte = hte->next) {
|
||||||
if (hte->key == NULL) {
|
if (hte->key == NULL) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(j>0) {
|
||||||
|
fprintf(file, ",");
|
||||||
|
}
|
||||||
|
j++;
|
||||||
|
|
||||||
const HCFChoice *nt = hte->key;
|
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++) {
|
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");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,18 @@ HParser* finkmao() {
|
||||||
h_bind_indirect(Rnext, R_);
|
h_bind_indirect(Rnext, R_);
|
||||||
h_bind_indirect(Cnext, C_);
|
h_bind_indirect(Cnext, C_);
|
||||||
HParser *tie = h_sequence(L, Lnext, NULL);
|
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;
|
return tie;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -103,7 +115,20 @@ HParser* depth1TW() {
|
||||||
h_epsilon_p(),
|
h_epsilon_p(),
|
||||||
NULL);
|
NULL);
|
||||||
h_bind_indirect(tuckpairstar, tpstar_);
|
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() {
|
HParser* depth1() {
|
||||||
|
|
@ -144,10 +169,23 @@ HParser* depth1() {
|
||||||
h_bind_indirect(lastR, R_);
|
h_bind_indirect(lastR, R_);
|
||||||
h_bind_indirect(lastL, L_);
|
h_bind_indirect(lastL, L_);
|
||||||
h_bind_indirect(lastC, C_);
|
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(R, lastR, NULL),
|
||||||
h_sequence(C, lastC, NULL),
|
h_sequence(C, lastC, NULL),
|
||||||
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() {
|
HParser* depthNTW() {
|
||||||
|
|
@ -237,14 +275,27 @@ HParser* depthNTW() {
|
||||||
NULL);
|
NULL);
|
||||||
h_bind_indirect(tuckpairstar, tpstar_);
|
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) {
|
int main(int argc, char **argv) {
|
||||||
mm__ = &system_allocator;
|
mm__ = &system_allocator;
|
||||||
|
|
||||||
HParser *p = finkmaoTW();
|
HParser *p = finkmao();
|
||||||
HCFGrammar *g = h_cfgrammar_(mm__, h_desugar_augmented(mm__, p));
|
HCFGrammar *g = h_cfgrammar_(mm__, h_desugar_augmented(mm__, p));
|
||||||
if (g == NULL) {
|
if (g == NULL) {
|
||||||
fprintf(stderr, "h_cfgrammar failed\n");
|
fprintf(stderr, "h_cfgrammar failed\n");
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue