2012-10-26 10 views
7

Sono nuovo in Mathematica (v8) e lo sto utilizzando per programmare la logica proposizionale.Mathematica If-then vs. Implicita

Mi chiedo quale sia la differenza tra gli operatori If e Implies. Ad esempio,
sia If[p,q] e Implies[p,q] restituiscono q per p=True (come previsto).

Ma quando cerco di ottenere SatisfiabilityInstances, ottengo il seguente:

SatisfiabilityInstances[If[p, q], {p, q}] 
(* 
    {{True, True}} 
*) 

a meno che non lo chiedo per più istanze:

SatisfiabilityInstances[If[p, q], {p, q}, All] 

SatisfiabilityInstances :: boolv: "Se [p , q] non è valore booleano su {False, True}

Tuttavia:

SatisfiabilityInstances[Implies[p, q], {p, q}, All] 

Restituisce l'atteso fuori:

(* {{True, True}, {False, True}, {False, False}} *) 

che cosa sta causando questa differenza nelle uscite?

risposta

4

È quello che ha detto - If non è booleano, cioè restituisce non solo vero o falso. Prova a If[False,True] e non vedrai alcun risultato. If[a,b,c,d] può restituire qualsiasi b, c, d, non solo booleano, ad esempio If[True,2] restituisce 2. Quindi, If è per diramazione (pur essendo funzionale) mentre Implies è una normale funzione booleana.

P.S. Ah, Implies può anche restituire 2. Quindi la differenza è che If[False,True] non restituisce nulla, quindi la funzione SatisfiabilityInstances non riesce a trovare l'area vera.

P.P.S. Più precisamente, se il primo argomento di è False, restituisce il suo terzo argomento. Quando è assente, non restituisce nulla.

+0

Mi potete indirizzare ad un buon tutorial? Ho letto la documentazione di Mathematica ma non ero a conoscenza del fatto che è possibile fornire "Se" quattro valori (solo tre per if-else). 'Se [a, b, c, d]' restituisce 'd' senza alcun valore di verità assegnato - perché è così? @Dims – QuietThud

+0

@QuietThud 'Se [condizione, clausola true, clausola falsa, clausola non true-or-false]' –

+0

Grazie @belisarius. =) Apprezzerei una raccomandazione per quanto riguarda la matematica. la fonte di apprendimento della programmazione va - la Documentazione funziona meglio come riferimento. – QuietThud

3

Si può provare:

SatisfiabilityInstances[If[p, q, Not[q]], {p, q}, All] 
+0

Ciò spiega il messaggio di errore, grazie. – QuietThud