if et booléens

Les exercices de cette page vous demanderont un peu plus de réflexion sur les booléens.

Le roi cruel.

Un roi cruel avait pour habitude de proposer le marché suivant à ses condamnés :

  • Tout prisonnier doit choisir entre deux cellules. Chaque cellule peut contenir une corde ou une clef (un seul objet par cellule).
  • Si le prisonnier choisit une cellule avec corde, il sera pendu.
  • Si le prisonnier choisit une cellule avec clef, il sera libéré.

Les cellules contiennent parfois toutes deux une corde ou parfois toutes deux une clef. Parfois l'une contient une clef et l'autre une corde.

Un condamné se présente devant les deux cellules.

  • Sur la porte de la cellule 1 est inscrite l'affirmation A1 suivante : " il y une clef dans cette cellule et une corde dans la cellule d'à côté."
  • Sur la porte de la cellule 2 est inscrite l'affirmation A2 suivante : "il y a une clef dans l'une des cellules et une corde dans l'autre."

Le roi, magnanime, donne une indication (exacte) au prisonnier : "Seule l'une des deux portes porte une indication vraie."

Vous saurez, sans doute, mener le raisonnement simple permettant de découvrir la porte conduisant à la liberté. Mais l'objectif de l'exercice est de passer par une petite programmation.

  1. On note
    • L1 : " la cellule 1 contient une clef."
    • L2 : "la cellule 2 contient une clef."
    Traduire les affirmations A1 et A2 à l'aide des propositions L1 et L2 et des connecteurs logiques et, ou, non.
  2. Ecrire un programme python affichant la table de vérité de A1 et A2 en fonction des valeurs possibles de L1 et L2.
  3. En déduire le choix qui doit être fait par le condamné.

Une solution de l'exercice "Le roi cruel".

Expression de A1 et A2

A1 = L1 et non(L2)

A2 = ( L1 et non(L2) ) ou ( non(L1) et L2 )

Table de vérité de A1 et A2


print("L1\tL2\tA1\tA2")
for L1 in (False, True) :
	for L2 in (False, True) :
		A1 = L1 and not(L2)
		A2 = (L1 and not(L2)) or (not(L1) and L2)
		print("{}\t{}\t{}\t{}".format(L1,L2,A1,A2))

On obtient :

L1	L2	A1	A2
False	False	False	False
False	True	False	True
True	False	True	True
True	True	False	False

Conclusion.

On constate qu'une seule ligne correspond à l'indication "une seule des deux affirmations A1, A2" est vraie.
Il s'agit de la ligne L1=False, L2=True, A1=False, A2=True.
L2 étant vraie, il faut choisir la porte 2.

On peut améliorer le programme en n'affichant que les lignes respectant l'indication du roi :


print("L1\tL2\tA1\tA2")
for L1 in (False, True) :
	for L2 in (False, True) :
		A1 = L1 and not(L2)
		A2 = (L1 and not(L2)) or (not(L1) and L2)
		if ( A1 and not(A2) )  or  ( A2 and not(A1) ):
			print("{}\t{}\t{}\t{}".format(L1,L2,A1,A2))

ce qui donne :

L1	L2	A1	A2
False	True	False	True

Le retour du roi cruel.

On retrouve notre roi cruel.

Un condamné se présente devant les deux cellules.

  • Sur la porte de la cellule 1 est inscrite l'affirmation A1 suivante : "Au moins l'une des deux cellules contient une clef."
  • Sur la porte de la cellule 2 est inscrite l'affirmation A2 suivante : "L'autre cellule contient une corde."

Le roi, magnanime, donne une indication (exacte) au prisonnier : "Les deux inscriptions sont soit toutes deux vraies, soient toutes deux fausses."

Déterminer la réponse à donner en suivant la démarche de l'exercice précédent.

Une solution de l'exercice "Le retour du roi cruel".


print("L1\tL2\tA1\tA2")
for L1 in (False, True) :
	for L2 in (False, True) :
		A1 = L1 or L2
		A2 = not(L1)
		if ( not(A1) and not(A2) )  or  ( A1 and  A2 ):
			print("{}\t{}\t{}\t{}".format(L1,L2,A1,A2))
L1	L2	A1	A2
False	True	True	True

Une seule ligne de la table de vérité correspond donc à l'indication du roi. L2 est vraie dans ce cas : il faut choisir la cellule 2.

Politiques et naïfs.

Dans un pays, il y a deux sortes d'habitants :

  • Les politiques, qui mentent toujours.
  • Les naïfs, qui disent toujours la vérité.

Je croise deux habitants A et B.

A affirme : "Au moins l'un de nous deux est un politique."

On note :

  • a : " A est naïf. "
  • b : " B est naïf. "

A l'aide d'une table de vérité

ab...
.........

que vous obtiendrez à l'aide d'un programme python, déterminer les qualités de A et B.

Une solution de l'exercice "Politiques et naïfs".

La phrase prononcée par A est : "not(a) or not(b)".

On ajoute que la valeur de vérité de cette phrase doit être en accord avec la nature de A :

  • Si A est naïf, la phrase est vraie.
  • Si A est politique, la phrase est fausse.

En d'autres termes ( a and phrase_de_A ) or ( not(a) and not(phrase_de_A) ) doit valoir True.


print("a\tb")
for a in (False, True) :
	for b in (False, True) :
		phrase_de_A = ( not(a) or not(b) )
		accord = ( a and phrase_de_A ) or ( not(a) and not(phrase_de_A) )
		if accord :
			print("{}\t{}".format(a,b))

On obtient :

a	b
True	False

A est donc un naïf et B un politique.

Politiques et naïfs (2).

Un peu plus loin, je croise deux autres personnes A et B.

A affirme : "Je suis politicien ou B est naïf."

Déterminer les qualités de A et B à l'aide d'une démarche analogue à celle utilisée dans l'exercice précédent.

Une solution de l'exercice "Politiques et naïfs (2)".

On note :

  • a : " A est naïf. "
  • b : " B est naïf. "

La phrase prononcée par A est : "not(a) or b".

On ajoute que la valeur de vérité de cette phrase doit être en accord avec la nature de A :

  • Si A est naïf, la phrase est vraie.
  • Si A est politique, la phrase est fausse.

En d'autres termes ( a and phrase_de_A ) or ( not(a) and not(phrase_de_A) ) doit valoir True.


print("a\tb")
for a in (False, True) :
	for b in (False, True) :
		phrase_de_A = ( not(a) or b )
		accord = ( a and phrase_de_A ) or ( not(a) and not(phrase_de_A) )
		if accord :
			print("{}\t{}".format(a,b))

On obtient :

a	b
True	True

A et B sont donc tous deux naïfs.