domenica 8 ottobre 2017

Quesito con la Susi n. 945

Gianni porta Susi in un club molto esclusivo: il club dei bugiardi!

I soci del club, spiega Gianni alla Susi, non dicono mai la verità. Ma proprio mai: sono condannati a mentire in eterno.

«Ricordatelo quando ti presento Carlo e Lara» aggiunge.

Entrano nel club e incontrano un uomo e una donna, forse proprio Lara e Carlo… ma come possiamo esserne sicuri visto che tutti mentono sempre? Potrebbero aver mentito sulla loro identità!

Inoltre Susi dovrebbe farsi qualche domanda: Gianni è un socio del club? La loro amicizia, variegata al gusto amor, è forse tutta una bugia?

L'uomo che si presentò a Gianni come Carlo, ma che non può essere Carlo avendo sicuramente mentito sulla sua identità, dice di non avere più di 40 anni; la donna (che disse di essere Lara) sostiene di avere 38 anni. Ma Carlo la smentisce: Lara ha almeno 39 anni! Allora lei ci tiene a puntualizzare che comunque Carlo è più vecchio, come minimo di 5 anni.

Alla fine di questa presentazione, Gianni chiede a Susi la somma delle età dei due suoi amici mentitori.

I mentitori mentono

I mentitori “perfetti” sono un classico sempreverde e ci si può divertire un po' usandoli opportunamente. In questo caso però sono solo un espediente per dire che le affermazioni fatte da Lara e Carlo vanno negate:

  • Non è vero che Carlo non ha più di 40 anni: Carlo ha più di 40 anni;
  • non è vero che Lara ha 38 anni: Lara non ha 38 anni;
  • non è vero che Lara ha almeno 39 anni (39 anni o più): Lara ha meno di 39 anni;
  • non è vero che Carlo come minimo ha 5 anni più di Lara (non è vero che la differenza di età tra Lara e Carlo è ≥ 5): la differenza di età tra Lara e Carlo è minore di 5 anni.

Le “negazioni” di proposizioni non “semplici” possono presentare dei problemi di interpretazione; per esempio: non è vero che Carlo come minimo ha 5 anni più di Lara, infatti ne ha come minimo 5 di meno!

Nel contesto, però, l'interpretazione in cui Carlo è più vecchio di Lara è quella che viene in mente prima e probabilmente è quella a cui pensava chi ha escogitato il quesito.

Soluzione manuale

Un possibile modo di risolverlo è dato nella nota che non leggerete prima di aver provato voi stessi!1 Come al solito abbiamo a che fare con delle informazioni che pongono dei vincoli che ripeto di seguito come riempitivo, nella forma originale che bisogna prima negare:

  • Carlo non ha più di 40 anni;
  • Lara ha 38 anni;
  • Lara ha almeno 39 anni;
  • come minimo Carlo ha 5 anni più di Lara.

Tra un “vincolo” vero A e uno che sappiamo essere falso non c'è differenza, tranne che quest'ultimo deve potersi scrivere come ¬A. Perciò se vogliamo il nostro vincolo vero dobbiamo “calcolare” ¬¬A, che ci dà proprio A…

Soluzione automatica

È il solito: codifichiamo le condizioni e ricerchiamo esaustivamente la soluzione provando “tutti” i numeri possibili per le età dei due amici bugiardi. Non c'è niente di diverso da quanto già fatto per altri quesiti; non dobbiamo nemmeno sforzarci di negare le condizioni dateci prima di codificarle: possiamo farlo fare al computer usando l'apposito operatore unario di negazione logica (binaria).

Per esempio si può fare in Racket; in uno degli altri linguaggi lisposi non sarebbe molto diverso. Come tipico di questa serie di post, ho implementato una pura ricerca bruta2.

#lang racket/base

(define
  (carlo-1 age)
  (<= age 40))

(define
  (lara-1 age)
  (= age 38))

(define
  (lara-2 age)
  (>= age 39))

(define
  (carlo-lara age-carlo age-lara)
  (>= (- age-carlo age-lara) 5))

(define
  (age-check age-carlo age-lara)
  (and
   (not (carlo-1 age-carlo))
   (not (lara-1 age-lara))
   (not (lara-2 age-lara))
   (not (carlo-lara age-carlo age-lara))))


(for* ([carlo-age (in-range 0 100)]
       [lara-age (in-range 0 100)]
       #:when (age-check carlo-age lara-age)
       #:final (age-check carlo-age lara-age))
  (printf "~a + ~a = ~a\n"
          carlo-age
          lara-age
          (+ carlo-age lara-age)))

Non sono particolarmente appassionato dei linguaggi dalle parentesi tonde e in particolare non sono un esperto del Racket, perciò — come al solito — sono sicuro che esiste un modo più bello di implementare persino una siffatta ricerca bruta.

Soluzione “grafica”

In realtà abbiamo un sistema di disequazioni in due incognite.

\[ \begin{cases} C > 40 \\ C - L < 5 \\ L \neq 38 \\ L < 39 \\ \end{cases} \]

Che possiamo semplificare ancora, visto che le età sono interi, e per lo stesso motivo cambiare C > 40 in C ≥ 41, et c.3:

\[ \begin{cases} C \geq 41 \\ C - L \leq 4 \\ L \leq 37 \\ \end{cases} \]

Possiamo usare le disequazioni per delimitare aree del piano certesiano. Visto che trattiamo solo interi, invece di aree abbiamo dei punti “accesi”.

L'unica disequazione che lega C a L e viceversa è C − L < 5. Le altre due stabiliscono solo l'intervallo di valori validi per le rispettive variabili4.

Mettendo tutte queste cose insieme:

I “pixel” sono leggermente spostati rispetto al centro dei punti della “griglia”, giusto per poterli vedere. Ciascun colore rappresenta i punti validi secondo una delle equazioni: blu per C ≥ 41, rosso per L ≤ 37 e infine verde per C − L ≤ 4.

C'è un solo punto “bianco”, cioè che ha tutte e tre le componenti accese. Nel grafico dovrebbe essere identificabile facilmente grazie al fatto che ho etichettato dei valori a caso sugli assi.

Questo orrore grafico5 ha ispirato a sua volta il primo orrore grafico di questo post6.


  1. L'immagine di questo post vi dovrebbe aver dato un'idea… Ma vediamo a parole che si può fare. Siano C e L le età di Carlo e Lara rispettivamente. Abbiamo quattro “vincoli”: C > 40, L ≠ 38, L < 39, C − L < 5. Proviamo con C=41. Lara è più giovane di 4, 3, 2 o 1 anno, allora potrebbe avere 37, 38, 39 o 40 anni. Gli anni segnati vengono scartati per via di uno degli altri vincoli. Con C=42 vediamo subito che non abbiamo possibilità perché 42-4 ci dà 38 (Lara afferma di avere 38 anni, ma sta mentendo) e 42-3 e i successivi sono chiaramente maggiori o uguali a 39. Insomma, Carlo deve avere 41 anni e Lara 37. La difficoltà del quesito non è in questi conti, e in realtà nemmeno nella negazione logica delle affermazioni dei due bugiardi perfetti…

  2. Il codice è evidenziato con la sintassi dello scheme perché highlighting-kate (quanto usa pandoc) non conosce il Racket.

  3. Non è necessario, naturalmente, però rende più immediato vedere i confini inclusi: avendo valori discreti usare delle rette limite (che sarebbero state solo dei punti da escludere) mi sembra fuorviante, a differenza del caso dei reali, dove ovviamente non possiamo passare da C > 40 a C ≥ 41 senza alterare di fatto l'insieme dei punti validi per C.

  4. Trattandosi di età e supponendo che gli amici di Gianni siano maggiorenni o che almeno non abbiano età negative, possiamo usare intervalli finiti. Ma questo è irrilevante per poter risolvere il problema, anche se graficamente, per ovvi motivi, sembrerà che l'intervallo considerato sia solo [1, 50].

  5. Per la cronaca generato con Metapost. Non è un'informazione interessante. È più interessante che nel codice, escluse le stringhe per le etichette, compaiano nei cicli i numeri magici 41, 37, 4.

  6. Che metto affinché la condivisione automatica sui social network abbia sempre un'immagine da usare al posto di quella del profilo, ché sparata così accanto al post fa un certo (brutto) effetto. Basterebbe questa per evitarlo, ma è meno artistica — si fa per dire, visto che nessuna delle due lo è!

Nessun commento:

Posta un commento

Sii educato, costruisci con cura le frasi, rifletti prima di pubblicare, evita parolacce e offese dirette, non uscire dal tema, cerca di non omettere la punteggiatura, evita errori ortografici, rileggi quel che hai scritto.