Ciao, ragazzi,
devo scrivere un programma in Java di ASFND e non ho nessuna idea come si fa. Qualcuno mi puo' aiutare?
Devo scrivere una classe ASFNDSolver che estende un altra classe astratta ASFND(in giu') e deve implementare i seguenti metodi:
-public void aggiungiStatoFinale( int stato ) - Permette di aggiungere lo stato specificato tra gli stati finali dell' automa
-public void aggiungiTransizioneND (int statoSorgente, char simbolo, int statoDestinatazione) - Aggiunge un arco di transizione dello stato sorgente a quello di destinazione per il particolare simbolo di input
- public boolean accettaSequenza (char[] sequenzaInput) - Ritorna true se la sequenza di input e' riconosciuta dall'automa, false altrimenti
- public ASFND costruisciAutomaConcatenazione (ASFND a) - Restituisce un nuovo automa ottenuto concatenazione dell'automa corrente "this" e dell'automa "a". In particolare il nouva ASFND dovra' riconoscere il linguaggio L(this) o L(a).
- public ASFND costruisciAutomaUnione (ASFND a) - Restituisce un nuovo automa ottenuto unione dell'automa corrente "this" e dell'automa "a". In particolare il nouva ASFND dovra' riconoscere il linguaggio L(this) U L(a).
- public ASFND costruisciAutomaInterazione() - Restituisce un nuovo automa in grado di riconoscere il linguaggio L(this)*
public abstract class ASFND {
protected final char[] alfabeto;
protected final int numeroStati;
/**
* costruisce un automa con uno specifico numero di stati e uno specifico alfabeto
*
* @param numeroStati
* @param alfabeto
*/
protected ASFND(int numeroStati, char[] alfabeto) {
this.numeroStati = numeroStati;
this.alfabeto = alfabeto;
if (getClass().getDeclaredConstructors().length != 1) {
throw new RuntimeException("ATTENZIONE!!! La sottoclasse deve avere un solo costruttore che prende int numeroStati e char[] alfabeto");
}
try {
getClass().getConstructor(int.class, char[].class);
} catch (NoSuchMethodException e) {
throw new RuntimeException("ATTENZIONE!!! La sottoclasse deve avere un solo costruttore che prende int numeroStati e char[] alfabeto");
}
if (!getClass().getSimpleName().equals("ASFNDSolver") ) {
throw new RuntimeException("ATTENZIONE!!! La sottoclasse deve avere nome ASFNDSolver");
}
}
/**
* ritorna l'alfabero associato all'automa
*
* @return
*/
public final char[] getAlfabeto() {
return alfabeto;
}
/**
* ritorna il numero di stati
*
* @return
*/
public final int getNumeroStati() {
return numeroStati;
}
/**
* il metodo deve ritornare true se la sequenza di input e' accettata dall'automa
*
* @param sequenzaInput
* @return
*/
public abstract boolean accettaSequenza(char[] sequenzaInput);
/**
* definisce lo stato specificato come finale
*
* @param stato
*/
public abstract void aggiungiStatoFinale(int stato);
/**
* aggiunge un arco di transizione dallo stato sorgente a quello di destinazione
*
* @param statoSorgente
* @param simbolo
* @param statoFinale
*/
public abstract void aggiungiTransizioneND(int statoSorgente, char simbolo, int statoDestinatazione);
/**
* costruisce un nuovo automa ottenuto come concatenazione dell'automa corrente (this) e dell'automa passato come parametro
*
* @param automa
* @return
*/
public abstract ASFND costruisciAutomaConcatenazione(ASFND automa);
/**
* costruisce un automa che riconosce
*
* @param automa
* @return
*/
public abstract ASFND costruisciAutomaIterazione();
/**
* costruisce un nuovo automa ottenuto come unione dell'automa corrente (this) e dell'automa passato come parametro
* Siano dati due ASFND (this ed A2). Ritornare un ASFND che riconosce L(A1) ? L(A2).
*
* @param automa
* @return
*/
public abstract ASFND costruisciAutomaUnione(ASFND automa);
/**
* ritorna lo stato iniziale: per convenzione lo stato iniziale è lo stato 0
*
* @return
*/
public final int getStatoIniziale() {
return 0;
}
/**
* indica se lo stato specificato e' uno stato finale
*
* @return
*/
public abstract boolean isFinale(int stato);
}



