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
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
Aleš13 napsal(a):
Všechny jazyky dovolují zápis ve tvaru
(A > B) > C
Ahoj, všechny určitě ne...
Offline
↑ 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).
Offline
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
↑ 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....
Offline
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
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
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
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