//---Robot dell'esempio 2 ring r=(0,l4,l3,l2,a,b,c,s),(c2,s2,c1,s1),lp; option(redSB); ideal id=l4*c+l3*(c1*c2-s1*s2)+l2*c1-a, l4*s+l3*(c1*s2+c2*s1)+l2*s1-b, c1^2+s1^2-1,c2^2+s2^2-1; ideal j=std(id); dim(j); //---j e' la base di Groebner con parametri. j; //---Cambiamo l'anello (in due passi) per poter sostiuire // i parametri con valori concreti. ring t=0,(c2,s2,c1,s1,l4,l3,l2,a,b,c,s),lp; ideal id=imap(r,id); ring re=(real,6),(c2,s2,c1,s1,l4,l3,l2,a,b,c,s),lp; ideal id=imap(t,id); //---Sostituiamo i parametri come segue: l3 = l2 = 1, // a = b = l4 = 1, c = 1, s = 0 (cioe' alpha = 0). ideal ids=subst(id,l3,1,l2,1,a,1,b,1,l4,1,c,1,s,0); //---Cambiamo l'anello affiche' l'ideale abbia la dimensione 0. ring re2=(real,6),(c2,s2,c1,s1),lp; ideal id=imap(re,ids); //---Ricalcoliamo una base di Groebner (non e' detto che dopo la // specializzazione si ottenga una base di Groebner). ideal ids=std(id); //---Risolviamo il problema cinematico inverso, cioe' // dato il posizionamento della mano (a,b,c,s) e la // lunghezza del giunto prismatico l4 troviamo // (c2,s2,c1,s1) = elenco l. LIB "solve.lib"; list l=solve(ids,6,0); l;