Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 15. 12. 2023 13:21 — Editoval Aleš13 (15. 12. 2023 13:31)

Aleš13
Příspěvky: 354
Reputace:   
 

Syntax výrazu s operandy typu Boolean

Díval jsem se takhle na různé programovací jazyky a některé dovolují a některé zase neumožňují zápis
výrazu

A > B > C

kde A, B, C jsou operandy (proměnné nebo výrazy) typu Boolean (přičemž platí, že True > False). Nadefinovat to v BNF oběma způsoby ani naprogramovat obě verze v zásadě není žádný problém, jde jen o to rozhodnout, jestli to má nějaký praktický smysl nebo ne. Případně některá z dalších podobných konstrukcí, jako třeba

A <= B <= C

kdy neostrá nerovnost A <= B implementuje implikaci [mathjax]A\Rightarrow B[/mathjax]. Všechny jazyky dovolují zápis ve tvaru

(A > B) > C

takže o nic nepřicházím, ale pořád nemůžu přijít na nějaký příklad, kde by byl takový výraz k něčemu užitečný. Nenapadlo by někoho něco?

Offline

 

#2 15. 12. 2023 21:08

check_drummer
Příspěvky: 4891
Reputace:   105 
 

Re: Syntax výrazu s operandy typu Boolean

Aleš13 napsal(a):

Všechny jazyky dovolují zápis ve tvaru

(A > B) > C

Ahoj, všechny určitě ne...


"Máte úhel beta." "No to nemám."

Offline

 

#3 15. 12. 2023 21:15

check_drummer
Příspěvky: 4891
Reputace:   105 
 

Re: Syntax výrazu s operandy typu Boolean

↑ Aleš13:
A co tedy znamená zápis A > B > C? Podle mě to půjde vyjádřit jen pomocí operátoru > a nějakých logických symbolů (a zároveň...), takže opravdu o nic nepřijdeme...

Ale jestli to chápu správně, tak A > B > C nebude nikdy pravdivé... resp, záleží na té interpretaci, ale většinou se taková nerovnost interpretuje jako (A>B) and (B>C).


"Máte úhel beta." "No to nemám."

Offline

 

#4 15. 12. 2023 22:06

Aleš13
Příspěvky: 354
Reputace:   
 

Re: Syntax výrazu s operandy typu Boolean

check_drummer napsal(a):

Ahoj, všechny určitě ne...

Ano, to jsem přehnal :D

check_drummer napsal(a):

↑ Aleš13:
A co tedy znamená zápis A > B > C? Podle mě to půjde vyjádřit jen pomocí operátoru > a nějakých logických symbolů (a zároveň...), takže opravdu o nic nepřijdeme...

Ale jestli to chápu správně, tak A > B > C nebude nikdy pravdivé... resp, záleží na té interpretaci, ale většinou se taková nerovnost interpretuje jako (A>B) and (B>C).

Dá se to přepsat jako A and not B and not C, takže to bude pravdivé pro A=true, B=false, C=false (postupně z výrazu A>B>C: A>B = true; (A>B)>C = true). Obecně pro libovolný počet proměnných to bude pravdivé právě když první z nich je true a všechny další false. Asi možná někdy taková podmínka vznikne, ale spíš bude ve tvaru toho přepisu A and not B and not C. A mně by zajímalo, jestli může existovat verze, kdy z logiky věci, z popisu čehosi pomocí výrokového počtu, bude pro popis i porozumění programu (míněno člověkem, parser rozumí všemu) vhodnější ten zápis A>B>C. Připadá mi, že ne, ale třeba se pletu a nějakou možnost nevidím.

Důvod proč to zkoumám je rozhodnout, jestli to má být v programovacím jazyce povolené protože je to užitečné nebo naopak zakázané, protože se to dá napsat leda omylem :-)

Offline

 

#5 16. 12. 2023 15:22

check_drummer
Příspěvky: 4891
Reputace:   105 
 

Re: Syntax výrazu s operandy typu Boolean

↑ Aleš13:
Aha, takže závorkujeme odleva, tj. (A>B)>C. Tak lze zavést pravidlo, že v případě operací se stejnou prioritou je vyhodnocujeme odleva, tak je to asi běžné, např. 15/5*3 je 9 a nikoli 1. Pak to bude legitimní zápis. Ale jak říkáš, otázka je, zda to má někdy smysl... Zamyslím se....


"Máte úhel beta." "No to nemám."

Offline

 

#6 17. 12. 2023 15:14

MichalAld
Moderátor
Příspěvky: 5043
Reputace:   126 
 

Re: Syntax výrazu s operandy typu Boolean

Co to má vlastně znamenat, to A > B > C ? Má to být ekvivalent (A > B) > C, nebo to má být (A > B) and (B > C) ?

Offline

 

#7 17. 12. 2023 15:31

Aleš13
Příspěvky: 354
Reputace:   
 

Re: Syntax výrazu s operandy typu Boolean

Mám na mysli ekvivalent (A > B) > C.

Tak chápe výraz A > B > C překladač céčka a vyplývá to i z definice Pascalu.
Ale třeba Ada mě s tím vyhodí a bude akceptovat jen závorkovou verzi (A > B) > C.

Offline

 

#8 17. 12. 2023 16:41

MichalAld
Moderátor
Příspěvky: 5043
Reputace:   126 
 

Re: Syntax výrazu s operandy typu Boolean

Céčko přeloží kdejakou "ptákovinu". Ale v tomhle případě je to jasné, protože céčko nezná typ bool a používá místo něj typ int, a operátory porovnávání tedy dávají výsledek int stejně jako třeba sčítání. Akorát si nevzpomínám, že bych se někdy setkal s tou definicí asociativity u takovéhoto výrazu, tedy jestli a > b > c je (a > b) > c nebo a > (b > c).

Podle mě je nesmysl, aby jazyk takovýto syntax umožňoval, když to nedává žádný rozumný výsledek, ale jak říkám, céčko přeloží kde co. Je to takovej divnojazyk.

Offline

 

#9 17. 12. 2023 21:54

Aleš13
Příspěvky: 354
Reputace:   
 

Re: Syntax výrazu s operandy typu Boolean

Dík. Ono mi jde hlavně o jakési důsledky, asi vcelku marginální, toho která varianta definice výrazu je použitá. Ostatní jazyky (céčko pomíjím, protože to je fakt zvěrstvo) mají syntax nejčastěji založenou na jedné ze dvou variant výrazů. Starší pojetí, použité třeba v Pascalu je

Výraz ::=  Jednoduchý výraz { ( ">" | ">=" | "<" | "<=" | "=" | "<>" ) Jednoduchý výraz }
Jednoduchý výraz ::= Člen { ( "+" | "-" | "or" ) Člen }
Člen := Prvek { ( "*" | "/" | "and" ) Prvek }
Prvek ::= Přímá hodnota | Proměnná  | "(" Výraz ")"

a novější, snad odolnější proti programátorským chybám, například v Adě je

Výraz ::=  Relace { ( "and" | "or" ) Relace }
Relace ::= Jednoduchý výraz [ ( ">" | ">=" | "<" | "<=" | "=" | "<>" ) Jednoduchý výraz ]
Jednoduchý výraz ::= Člen { ( "+" | "-" ) Člen }
Člen ::= Prvek { ( "*" | "/" ) Prvek }
Prvek ::= Přímá hodnota | Proměnná  | "(" Výraz ")"

Tam už jsou logické operátory postavené zvlášť a ta složená relace se tam nedá napsat. Ale jednotlivě se logické hodnoty porovnávat dají, protože je zpravidla dodefinované uspořádání true > false. Ta asociativita se bere z definice vždycky zleva doprava (zatím jsem nenarazil na nic jiného), i když pro rekurzivní parser by to bylo jednodušší naopak :-)

Offline

 

#10 17. 12. 2023 22:25

MichalAld
Moderátor
Příspěvky: 5043
Reputace:   126 
 

Re: Syntax výrazu s operandy typu Boolean

Aleš13 napsal(a):

Ale jednotlivě se logické hodnoty porovnávat dají, protože je zpravidla dodefinované uspořádání true > false.

Ale zrovna v céčku tohle podle mě neplatí. Tam je "true" definována jako nenulová hodnota, a myslím, že jsem se už setkal s tím, že to byla -1.

Podle mě by tyhle věci neměly jít (jako porovnávání true a false), protože to nedává žádný rozumný smysl.

Mě teda ani moc smysl nedává třeba výraz a/b/c/d/e/f.

Offline

 

#11 17. 12. 2023 23:06 — Editoval Aleš13 (17. 12. 2023 23:07)

Aleš13
Příspěvky: 354
Reputace:   
 

Re: Syntax výrazu s operandy typu Boolean

Obecně bych se porovnání True a False úplně nevzdával, třeba A<>B je A xor B, který se jinak rozepisuje zdlouhavě (A and not B) or (not A and B), ale pro cokoliv jiného (ještě kromě identity) je to zřejmě opravdu zbytné. Ale teď koukám, že v tom céčku by ani tohle nemuselo platit :D

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson