Costrutto condizionale per un tipo di dati kleenean

2

Stavo pensando a un ipotetico linguaggio di programmazione con un tipo di dati kleenean che implementerebbe la logica a tre valori di Kleene . Per riassumere, è un'estensione del tipo di dati booleana con le tre costanti true , false e unknown dove unknown significa che il valore è o true o false , ma non lo facciamo sapere quale.

Le tabelle di verità per un tipo keniano sono ben note e la logica è abbastanza facile da capire. Tuttavia, mi chiedevo come si progetterebbe un costrutto condizionale per tenere conto di questo valore di unknown .

Un costrutto condizionale di base if-then-else è quasi sempre il seguente:

if (boolean condition) then
    condition is true, do something
else
    condition is false, do some other thing
end

Tuttavia, ho difficoltà a vedere come sarebbe il kleenean if . Come interpretare la costante di unknown ? Tecnicamente parlando, potrebbe soddisfare la condizione true e la condizione false poiché è uno di questi due. Tuttavia, non possiamo farli corrispondere a nessuno di questi poiché potrebbe essere l'altro, non è in realtà truefalse .

Esiste un modo ben noto per implementare un simile costrutto?

EDIT: Per specificare un po ', preferirei qualcosa di diverso dal modo in cui boost::tribool funziona, o da un semplice switch come se fosse un enum. Le risposte sulla sovrapposizione quantistica e sulla semantica sono le benvenute.

    
posta Morwenn 22.05.2013 - 19:50
fonte

3 risposte

2

However, I have troubles seeing what a kleenean if construct would look like.

Sembra esattamente come un normale if . Tuttavia, la semantica è leggermente diversa. Invece di dire "se la condizione è vera, allora questo altrimenti", in realtà va qualcosa come "se la condizione è nota per essere vera, allora questo altrimenti" (o forse "provato" invece di "conosciuto", a seconda di quale modalità preferisci usare la tua logica keniana per rappresentare). Ciò significa che potresti volere un operatore per testare "è sconosciuto / non provato" in modo da poter controllare il terzo stato, sebbene ciò non sia strettamente necessario:

let boolvar = boolean condition
if (boolvar) then
    # The true case...
elseif (not boolvar) then
    # The false case...
else
    # The unproven case...
fi

(Supponendo che not unknown sia unknown , ovviamente.)

    
risposta data 22.05.2013 - 23:59
fonte
-1

Da quello che hai detto, unknown rappresenta rappresenta true o false "allo stesso tempo". Non dovresti prenderlo come un altro valore, ma come qualcosa di speciale o eccezionale.

Se unknown è passato a if diventa non deterministico quale dei due percorsi di codice dovrebbe prendere. Penso che sia meglio assumere che passare unknown in if dovrebbe portare all'errore.

Ma dovresti avere modo di rilevare se il valore è definito correttamente. Qualcosa come

if defined (boolean condition) then
    condition is defined true or false, do something
else
    condition is unknown, do some other thing
end

e ci dovrebbe essere una versione negata di questo, perché non è possibile utilizzare la logica normale per invertire i percorsi del codice per rimuovere uno dei rami per la chiarezza del codice.

    
risposta data 22.05.2013 - 20:30
fonte
-1

Ho implementato questo approccio nel linguaggio che ho sviluppato (quindi ho rimosso questa funzione e passato alla logica booleana, in quanto la logica a tre stati non è veramente utile).

Una logica a tre stati può essere convertita in booleana in modo trasparente con la seguente regola:

The boolean value of the logical is true only when the logical value is true.

I valori logici unknown e false corrispondono a false booleano.

Per poter lavorare con logiche a tre stati, è possibile utilizzare una serie di operatori unari:

  • ++ ( è ) - converte un operando logico in valore booleano. Solo in un modo più dettagliato della conversione implicita.
  • -- ( non ) - il risultato è true solo quando l'operando è false .
  • +- ( noto ) - il risultato è true solo quando l'operando è o true o false .
  • -+ ( sconosciuto ) - il risultato è true solo quando l'operando è unknown .

In questo modo i condizionali potrebbero essere implementati per funzionare con le condizioni booleane, come si usa. Una logica può essere utilizzata come condizione booleana in modo trasparente o esplicito. Diverse combinazioni di operatori logici potrebbero essere utilizzate per raggiungere lo stesso obiettivo, qualunque sia la soluzione migliore:

if (condition) {
  // condition is true
} else if (--condition) {
  // condition is false
} else {
  // condition is unknown
}

if (-+condition) {
  // condition is unknown
} else if (condition) {
  // condition is true
} else {
  // condition is false
}
    
risposta data 23.05.2013 - 06:41
fonte

Leggi altre domande sui tag