Page 1 sur 3

Problème de test logique

Publié : ven. 11/févr./2011 12:43
par kelebrindae
Bonjour,

Je vous soumets le truc que je viens de rencontrer, car je ne sais pas si c'est un bug ou non.
J'ai l'impression qu'il y a un truc qui cloche dans les tests logiques de PB.

Voici le code:

Code : Tout sélectionner

If Not #False And Not #True
  Debug "Faux"
Else
  Debug "Vrai"
endif
Ce "if...", selon moi, est équivalent à:

Code : Tout sélectionner

If #True And #False
et devrait donc afficher "Faux". J'ai fait le test dans d'autres langages, et c'est effectivement le cas.

Pourtant, PB affiche "Vrai". En fait, il traite la ligne comme si c'était:

Code : Tout sélectionner

If Not (#False And Not #True)
ce qui, toujours selon moi, n'est pas du tout la même chose... :?
(et je le répète, les autres langages avec lesquels j'ai essayé ne fonctionne pas comme ça)

Bref: vous en pensez quoi, vous ?

Re: Problème de test logique

Publié : ven. 11/févr./2011 13:38
par Backup
kelebrindae a écrit : (et je le répète, les autres langages avec lesquels j'ai essayé ne fonctionne pas comme ça)

Bref: vous en pensez quoi, vous ?

oui mais dans les autres langages fait :

Code : Tout sélectionner

Debug  #False
Debug #True
purebasic considere #False comme etant = 0
et #true =1

dans bien des languages #false c'est =-1
et donc #true=0 ;)


lorsque tu fais :

Code : Tout sélectionner

If #True And #False
  Debug "Faux"
Else
  Debug "Vrai"
EndIf
ça reviens a faire : 1 and 0
et ça fait bien 0 donc faux (#false ) :)

Re: Problème de test logique

Publié : ven. 11/févr./2011 13:56
par flaith
On est presque dans un état "qbit" :mrgreen:

Re: Problème de test logique

Publié : ven. 11/févr./2011 14:59
par Ollivier
@Kele

N'oublie pas que le programme en Pure est compilé en ASM. Il y a une "logique" bien huilée.

Dans ton code:

Code : Tout sélectionner

If Not #False And Not #True
  Debug "Faux"
Else
  Debug "Vrai"
endif
Je ne vois pas pourquoi, tu as mis "Faux" dans la partie "Si condition vraie" et "Vrai" dans la partie "Si condition fausse"... C'est une grossière erreur...

Aussi le principe est simple: If attend une réponse logique:
- Soit Reponse = 0 (faux ou #False)
- Soit Reponse <> 0 (vrai ou #True)

Not #False And Not #True
c'est égal à #True And #False
qui est égal à #False
ce qui affichera "Vrai" puisque tu as mis le message vrai dans la zone #False...

Enfin bref, ça sent le week-end anticipé...

Re: Problème de test logique

Publié : ven. 11/févr./2011 15:14
par SPH
Je pense qu'une chose est soit vrai soit fausse. Donc, demander a un ordi de faire une action si la chose est vrai ET fausse est un contre sens absolu :idea:

Re: Problème de test logique

Publié : ven. 11/févr./2011 15:26
par Ar-S
J'ai adoré lire ce topic Image

Re: Problème de test logique

Publié : ven. 11/févr./2011 15:26
par kelebrindae
@Dobro et Ollivier:
Ok, mauvais exemple; j'ai voulu trop simplifier et je me suis planté.

@SPH:je suis d'accord, ça n'a pas de sens "utile". Mais du point de vue de la logique formelle, le test n'en est pas moins valide.

Je recommence avec un autre exemple:
Le cas dans lequel je me suis trouvé ressemble plus à:

Code : Tout sélectionner

x=1

; Condition 1 (vraie)
If Not (x=0 And x=1) 
  Debug "Vrai"
Else
  Debug "Faux"
EndIf

; Condition 2 (fausse)
If Not (x=1 Or x=0)
  Debug "Vrai"
Else
  Debug "Faux"
EndIf


; Condition 1 AND condition 2
If Not (x=0 And x=1) And Not (x=1 Or x=0)
  Debug "Vrai"
Else
  Debug "Faux"
EndIf
La condition 1 donne "vrai", ce qui est correct.
La condition 2 donne "faux", ce qui est toujours correct.
Quand je mets les deux dans un seul "if" avec juste un "and" au milieu, ça me donne "vrai".
Et là, je ne suis plus d'accord: [vrai] And [faux], ça devrait donner "faux".

En isolant un peu plus le soucis, on obtient ceci:

Code : Tout sélectionner

x=1

; Condition 1 AND condition 2 avec parenthèses
If Not (x=0)  And Not (x=1)
  Debug "Vrai"
Else
  Debug "Faux"
EndIf

; Condition 1 AND condition 2 sans parenthèses
If Not x=0  And Not x=1
  Debug "Vrai"
Else
  Debug "Faux"
EndIf
Selon moi, les parenthèses ne devraient rien changer. Et pourtant les deux tests renvoient des résultats différents.

Où est l'erreur ?

Re: Problème de test logique

Publié : ven. 11/févr./2011 15:54
par Cls
kelebrindae a écrit :

Code : Tout sélectionner

If Not #False And Not #True
  Debug "Faux"
Else
  Debug "Vrai"
endif
Ce "if...", selon moi, est équivalent à:

Code : Tout sélectionner

If #True And #False
et devrait donc afficher "Faux".
Heu en logique, ce code doit afficher True et pas False.

Il faut revoir son ET logique (0 = false, 1 = true) :
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

Tu confonds avec le OU logique :
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1

Re: Problème de test logique

Publié : ven. 11/févr./2011 15:55
par Backup
@kelebrindae : en fait , je suis d'accord avec toi :D

Re: Problème de test logique

Publié : ven. 11/févr./2011 15:56
par Backup
Cls a écrit : Heu en logique, ce code doit afficher True et pas False.

Il faut revoir son ET logique (0 = false, 1 = true) :
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0 ; c'est ce que dit kelebrindae !!! (=0 =#false)
1 & 1 = 1

Tu confonds avec le OU logique :
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1

Re: Problème de test logique

Publié : ven. 11/févr./2011 16:03
par Cls
Non Dobro, il y confusion entre le résultat du test et les valeurs affichées par kelebrindae.

1 & 0 = 0 donc le test est false, donc son code affiche vrai ! :D

Re: Problème de test logique

Publié : ven. 11/févr./2011 16:04
par kelebrindae
@Cls: en fait, comme l'a dit Ollivier, dans mon premier exemple j'avais inversé l'affichage entre le "if" et le "else", ce qui n'arrangeait rien... :oops:
Regarde plutôt le second exemple, qui est plus clair.

Re: Problème de test logique

Publié : ven. 11/févr./2011 16:04
par Backup
Cls a écrit :Non Dobro, il y confusion entre le résultat du test et les valeurs affichées par kelebrindae.

1 & 0 = 0 donc le test est false, donc son code affiche vrai ! :D
arg !! il va ficnir par me faire perdre la tete ce kelebrindae :lol:

Re: Problème de test logique

Publié : ven. 11/févr./2011 16:07
par kelebrindae
Désolé! Désolé! :P

Au final, mon problème, c'est plutôt que
"If Not (x=0) And Not (x=1)"
et
"If Not x=0 And Not x=1"

ne donnent pas le même résultat.

Re: Problème de test logique

Publié : ven. 11/févr./2011 16:10
par Backup
kelebrindae a écrit :Désolé! Désolé! :P

Au final, mon problème, c'est plutôt que
"If Not (x=0) And Not (x=1)"
et
"If Not x=0 And Not x=1"

ne donnent pas le même résultat.
les parentheses sont évaluées en premier ! :)

If Not x=0 egale : If (Not x)=0 et pas If Not (x=0) qui est egale a If 1

enfin... je crois ... je deviens chevre là :lol: