Newsgroup: it.comp.java
Titolo: [HELP!] Problema String...[lunghetto]

  Ciao a tutti!
Questa ? la prima volta che mi rivolgo al Newsgroup, visto che ho 
iniziato a programmare in Java solo da circa una ventina di giorni 
(possiamo dire che ho iniziato con Java a programmare in modo serio...o 
meglio ci provo).
Essendo MOLTO inesperto, sono incappato in un problema da cui proprio 
non riesco a uscire, quindi mi rivolgo a voi.
In pratica sto cercando di realizzare (? un'esercitazione 
dell'universit?) un programma che, dato una espressione logica con gli 
operatori | & ~ (cio? OR, AND, NOT), la semplifica fino ad ottenere vero 
o falso, applicando l'algoritmo di Quine (forse qualcuno ha presente).
Io devo caricare la formula in una stringa, quindi estrarre delle 
sottostringhe e confrontarle con delle altre date, di modo che, se le 
trovo uguali, le sostituisco col relativo risultato._
Esempio:_
Dall'algoritmo di Quine so che:
~0 --> 1
~1 --> 0
0|A --> A
1&A --> A
[...]
con:
0 --> false
1 --> true
A --> una qualsiasi altra expr logica
Per fare ci? sono passato per un paio di metodi:
1) con un ciclo for che mi scandisce la stringa passo carattere per 
carattere e, appena trovo una corrispondenza, verifico i caratteri 
successivi, quindi sostituisco concatenando pezzi di stringhe:
/
while(!(ax2.equals("1")|ax2.equals("0")))
{
for(int i=0;i<ax2.length();i++)
{
if(ax2.charAt(i)=='!') /// <-- Da qui risolvo ~0->1 o ~1->0 (inizio alg1)
{
if(ax2.charAt(i+1)=='0')
ax2=ax2.substring(0, i) + "1" + ax2.substring(i+2);
/ if(ax2.charAt(i+1)=='1')
ax2=ax2.substring(0, i) + "0" + ax2.substring(i+2);
} / //fine alg1
/ if(ax2.charAt(i)=='(') ///<-- Da qui risolvo i casi del tipo (0/1|A) 
-> A/1, togliendo le parentesi(inizio alg2) /
{
if(ax2.charAt(i+1)=='0')
if((ax2.charAt(i+2)=='|')&(ax2.charAt(i+4)==')'))
ax2=ax2.substring(0, i) + ax2.charAt(i+3) + ax2.substring(i+5);
else if(ax2.charAt(i+1)=='1')
if((ax2.charAt(i+2)=='|')&(ax2.charAt(i+4)==')'))
ax2=ax2.substring(0, i) + "1" + ax2.substring(i+5);
} / //fine alg2
Questo ? un estratto del metodo che stavo costruendo.
2) Nel secondo caso invece faccio partire 2 cicli, uno dall'inizio della 
stringa e uno dalla fine in modo da formare delle sottostringhe, 
confrontarle usando match() e sostituendo usando replaceAll().
/ do
{
for(int i=0;i<ax.length();i++)
for(int y=ax.length();y!=i+1;y--)
{
ConsoleReader c = new ConsoleReader(System.in);
c.readLine();
System.out.print(i+"\t"+y+"\n");
String x = ax.substring(i,y);
String z = "";
if(x.matches("!0")) ax=ax.replaceAll(x,"1"); //1
if(x.matches("!1")) ax=ax.replaceAll(x,"0"); //2
if(x.matches("0|([01a-z()|&~]+)")) 
ax=ax.replaceAll(x,x.substring(3,x.length())); //3
if(x.matches("0{1}&{1}({1}[01a-z()|&~]+){1}")) ax=ax.replaceAll(x,"0"); //4
if(x.matches("")) ax=ax.replaceAll(x,"1"); //5
if(x.matches("1{1}|{1}({1}[01a-z()|&~]+){1}")) ax=ax.replaceAll(x,"1"); //6
if(x.matches("1{1}&{1}({1}[01a-z()|&~]+){1}")) 
ax=ax.replaceAll(x,x.substring(3,x.length())); //7
if(x.matches("("+z+")&~("+z+")")) ax=ax.replaceAll(x,"0"); //8
System.out.println(ax);
}
}
while(!(ax.equals("1")|ax.equals("0")));
return(ax);
/
Il metodo lavora solo se lascio attivati gli if 1 e 2. Ho quindi 
attivato anche il 6 e mi ? stato dato questo output:
3 8
!(1|(!1|1))|(!(1|1)|(1|1))
3 7
!(1|(!1|1))|(!(1|1)|(1|1))
3 6
!(1|(!1|1))|(!(1|1)|(1|1))
3 5
Exception in thread "main" java.util.regex.PatternSyntaxException: 
Unclosed group near index 2
|(
^
at java.util.regex.Pattern.error(Pattern.java:1472)
at java.util.regex.Pattern.accept(Pattern.java:1330)
at java.util.regex.Pattern.group0(Pattern.java:2228)
at java.util.regex.Pattern.sequence(Pattern.java:1517)
at java.util.regex.Pattern.expr(Pattern.java:1489)
at java.util.regex.Pattern.compile(Pattern.java:1257)
at java.util.regex.Pattern.<init>(Pattern.java:1013)
at java.util.regex.Pattern.compile(Pattern.java:760)
at java.lang.String.replaceAll(String.java:1706)
at Esercit2altro.quine(Esercit2altro.java:30)
at Esercit2altro.main(Esercit2altro.java:200)
N.B. I numeri che vedete prima di Exception sono
- il primo, cio? "3", l'avanzamento del contatore di caratteri da sx
- il secondo, cio?"8,7,6..." ? l'avanzamento del contatore da dx
La formula data in input ?: "!(!0|(!1|1))|(!(!0|1)|(!0|1))" (in origine 
era "!(!a|(!b|c))|(!(!a|b)|(!a|c))", poi ho assegnato a=0, b=1, c=1, per 
provare);
Come vedete mi converte i !0 e !1 ma non appena trova 1|(....) che ? il 
caso del 3? if si blocca.
Come faccio a dirgli di cambiare un'espressione del tipo 
1|(qualsiasicosa) in 1?
Scusate la lunghezza, ma sono molto inesperto ed ? la prima volta che 
lavoro su stringhe (i miei prog precedenti riguardavano somme e 
prodotti, fate voi!).
RINGRAZIO MOLTISSIMO chi sapr? aiutarmi o anche solo darmi qualche 
dritta sull'uso di questi metodi.
Sto impazzendo!
Ciao!

Mi correggo un errore:
il NOT è rappresentato da !, non da ~
Grazie e ciao!

 Ciao!
ciao
euterpex

 
GRAZIE GRAZIE GRAZIE!
ciao!