introduzione
La tua missione nella vita è semplice: dimostrare alle persone di sbagliarsi su Internet!
Per fare questo di solito analizzi attentamente le loro affermazioni e fai notare la contraddizione in esse.
È tempo di automatizzare tutto ciò, ma poiché siamo pigri, vogliamo dimostrare alle persone che sbagliano con il minimo sforzo (leggi: il codice più breve) possibile.
specificazione
Ingresso
Il tuo input sarà una formula in forma congiuntiva normale . Per il formato, è possibile utilizzare il formato seguente o definire il proprio, in base alle esigenze della propria lingua (tuttavia non è possibile codificare più nel formato rispetto al CNF puro). I casi di test (qui) sono comunque forniti nel formato seguente (anche se non sarà difficile generare il tuo).
Il tuo input sarà un elenco di un elenco di un elenco di variabili (puoi anche leggerlo come stringhe / richiedere stringhe). L'input è una formula in forma congiuntiva normale (CNF) scritta come un insieme di clausole, ciascuna delle quali è un elenco di due elenchi. Il primo elenco nella clausola codifica i letterali (variabili) positivi, il secondo elenco codifica i letterali (variabili) negativi (negati). Ogni variabile nella clausola è OR insieme e tutte le clausole sono AND insieme.
Per renderlo più chiaro: [[[A,B],[C]],[[C,A],[B]],[[B],[A]]]
può essere letto come:
(A OR B OR (NOT C)) AND (C OR A OR (NOT B)) AND (B OR (NOT A))
Produzione
L'output è booleano, ad esempio un valore di verità o un valore di falsa.
Cosa fare?
È semplice: controlla se la formula fornita è soddisfacente, ad es. Se esiste qualche assegnazione di vero e falso a tutte le variabili in modo tale che la formula complessiva renda "vero". Il tuo output sarà "vero" se la formula è soddisfacente e "falso" se non lo è.
Curiosità: questo è un problema NP completo nel caso generale.
Nota: è consentita la generazione di una tabella di verità e la verifica della presenza di qualsiasi voce risultante.
Custodie angolari
Se ottieni un elenco vuoto di 3 ° livello, allora non c'è tale variabile (positiva / negativa) in quella clausola - un input valido.
Puoi lasciare altri casi angolari non definiti se lo desideri.
Puoi anche restituire true su una formula vuota (elenco di 1 ° livello) e false su una clausola vuota (elenco di 2 ° livello).
Chi vince?
Questo è code-golf quindi vince la risposta più breve in byte!
Ovviamente si applicano le regole standard.
Casi test
[[[P],[Q,R]],[[Q,R],[P]],[[Q],[P,R]]] -> true
[[[],[P]],[[S],[]],[[R],[P]],[[U],[Q]],[[X],[R]],[[Q],[S]],[[],[P,U]],[[W],[Q,U]]] -> true
[[[],[P,Q]],[[Q,P],[]],[[P],[Q]],[[Q],[P]]] -> false
[[[P],[]],[[],[P,S]],[[P,T],[]],[[Q],[R]],[[],[R,S]],[[],[P,Q,R]],[[],[P]]] -> false
optional behavior (not mandatory, may be left undefined):
[] -> true (empty formula)
[[]] -> false (empty clause)
[[[],[]]] -> false (empty clause)
{{P,Q},{P,!Q},{!P,Q},{!P,!Q}}
(non in questo ordine) che può essere facilmente mostrato è una contraddizione. Per il 4): questa è banalmente una contraddizione perché è P AND ... AND (NOT P)
che non può ovviamente essere vero per qualsiasi valore di P.
(A OR B OR (NOT C)) AND (C OR A OR (NOT B)) AND (B OR (NOT A))
?