a,r,g : VAR [nat->int]
p : VAR [nat->[nat->int]]
relseq: VAR [nat->RealOrder]
n : VAR [nat->nat]
d,i,j,k : VAR nat
m: VAR posnat %m : VAR posnat
x,y,c,b : VAR real
babove,bbelow,bbelow2,babove2: VAR bool
RelF6,TQRow: VAR [nat->subrange(0,5)]
% Next is a function that takes a system, possibly involving only inequalities and not equalities, % and converts it to a system(s) with at least one equality.
strictify(RelF6)(i): subrange(0,5) = IF RelF6(i)=4 THEN 1 ELSIF RelF6(i)=5 THEN 2 ELSE RelF6(i) ENDIF
first_eq(RelF6,k): RECURSIVE {i | (i>k IMPLIESFORALL (j:upto(k)): RelF6(j)>0) AND
(i<=k IMPLIES RelF6(i)=0 ANDFORALL (j): j<i IMPLIES RelF6(j)>0)} = IF k=0 THEN (IF RelF6(0)=0 THEN 0 ELSE 1 ENDIF) ELSELET last = first_eq(RelF6,k-1) IN IF last>k-1 THEN (IF RelF6(k)=0 THEN k ELSE k+1 ENDIF) ELSE last ENDIF ENDIFMEASURE k
prod_nonstrict(k,p,(n|FORALL (j:upto(k)): p(j)(n(j))/=0),RelF6): list[int] =
prod_polynomials_list(LAMBDA (i): IF RelF6(i)>=4 THEN p(i) ELSE (LAMBDA (j:nat): 1) ENDIF, LAMBDA (i): IF RelF6(i)>=4 THEN n(i) ELSE 0 ENDIF,(LAMBDA (i): 1),k)
rel5(i:subrange(0,5))(r1,r2:real): bool =
(IF i=0 THEN r1=r2 ELSIF i=1 THEN r1>r2 ELSIF i=2 THEN r1<r2 ELSIF i=3 THEN r1/=r2 ELSIF i=4 THEN r1>=r2 ELSIF i=5 THEN r1<=r2 ELSETRUEENDIF)
compute_solvable_single(i:subrange(0,5),a,(d|a(d)/=0)): bool = IF d=0 THEN rel5(i)(a(0),0) ELSIF d=1 THENTRUE ELSIF i=3 THENTRUE ELSELET iseq = sturm_tarski_faster(1,a,d,LAMBDA (k):LAMBDA (j):1, LAMBDA (k):0,LAMBDA (j):1)/=0 INIF i=0 THEN iseq ELSIF i/=1 AND i/=2 AND iseq THENTRUE ELSELET newa = IF rel5(i)(1,0) THEN a ELSE (-1)*a ENDIF IN
newa(d)>0 OR (odd?(d) AND newa(d)<0) OR
sturm_tarski_faster(1,poly_deriv(a),d-1,LAMBDA (j): newa, LAMBDA (j): d,greatify_rel(LAMBDA (j): i))/=0 ENDIF ENDIF
poly_deriv_integer: LEMMA
rational_pred(poly_deriv(a)(d)) AND
integer_pred(poly_deriv(a)(d))
compute_solvable(k,p,(n|FORALL (j:upto(k)): p(j)(n(j))/=0 AND n(j)>0),RelF6): bool = LET newp=greatify_poly_rel(p,RelF6),
newRel=greatify_rel(RelF6) IN IF k=0 THEN compute_solvable_single(RelF6(0),p(0),n(0)) ELSIF (EXISTS (i:upto(k)): newRel(i)=0) THEN LET fe = first_eq(newRel,k) IN
sturm_tarski_faster(k-1,newp(fe),n(fe),
(LAMBDA (i): IF i<fe THEN newp(i) ELSE newp(i+1) ENDIF),
(LAMBDA (i): IF i<fe THEN n(i) ELSE n(i+1) ENDIF),
(LAMBDA (i): IF i<fe THEN newRel(i) ELSE newRel(i+1) ENDIF))/=0 ELSE LET Qprodlist = prod_polynomials_list(newp,n,LAMBDA i: 1,k),
Qdeg = length(Qprodlist)-1,
Qprod = (LAMBDA (i): IF i<length(Qprodlist) THEN nth(Qprodlist,i) ELSE 0 ENDIF) IN
(Qdeg>0 AND sturm_tarski_faster(k,Qprod,Qdeg,newp,n,newRel)/=0) OR
(Qdeg>=2 AND
((FORALL (j:upto(k)): rel5(newRel(j))(newp(j)(n(j)),0)) OR
(FORALL (j:upto(k)): (odd?(n(j)) IMPLIES rel5(newRel(j))(-newp(j)(n(j)),0)) AND
(even?(n(j)) IMPLIES rel5(newRel(j))(newp(j)(n(j)),0))) OR
sturm_tarski_faster(k,poly_deriv(Qprod),Qdeg-1,newp,n,newRel)/=0)) ENDIF
poly_system_list(k,p,(n|FORALL (j:upto(k)): p(j)(n(j))/=0 AND n(j)>0)): {lli : list[list[int]] |
length[list[int]](lli) = k+1 AND (FORALL (i:upto(k)): length[int](nth[list[int]](lli,i)) = n(i)+1) AND
(FORALL (j:upto(k),i:upto(n(j))): nth[int](nth[list[int]](lli,j),i)=p(j)(i))} =
array2list[list[int]](k+1)(LAMBDA (j:nat): array2list[int](n(j)+1)(p(j)))
pq: VAR [nat->[nat->rat]]
tarski(k,pq,(n|FORALL (j:upto(k)): pq(j)(n(j))/=0 AND n(j)>0),RelF6): bool = LET pi = (LAMBDA (j): rat_poly_to_int(pq(j),n(j))),
pl = poly_system_list(k,pi,n),
p = (LAMBDA (i): LAMBDA (j): IF i<=k AND j<=n(i) THEN nth[int](nth[list[int]](pl,i),j) ELSE 0 ENDIF) IN compute_solvable(k,p,n,RelF6)
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 ist noch experimentell.