Skocz do zawartości
Komentator

Technika cyfrowa - #2 - algebra Boole'a w praktyce

Pomocna odpowiedź

(edytowany)
Cytat

W ramach ćwiczenia, rozwiąż poniższe równania, korzystając z zasad algebry Boole'a. Swoimi wynikami podziel się w komentarzu!

((0 + 1 + 0) · (0 NAND 1)) NOR 1 = ?

1 NAND 1 NAND (1 NOR 0) = ?

(~1 + 1 NOR 0) · (~(0 · 1) + (0 NOR 0)) = ?

Wydaje mi się, że w równaniu drugim jest błąd. Upraszczając je, poprzez obliczenie, że (1 NOR 0) = NOT (1 OR 0) = NOT 1 = 0 dostajemy 1 NAND 1 NAND 0, które w zależności od kolejności wykonania działań NAND daje sprzeczne wyniki, ponieważ zanegowany iloczyn (lub dysjunkcja 😉) nie posiada właściwości łączności, tzn. a NAND (b NAND c) ≠ (a NAND b) NAND c (źródło 1 lub źródło 2 na stronie 3).

Widać to na wspomnianym przykładzie:

1 NAND (1 NAND 0) = 1 NAND 1 = 0

(1 NAND 1) NAND 0 = 0 NAND 0 = 1

Zatem wyniki są sprzeczne i rozwiązania nie ma (lub jest w stanie nieustalonym, dopóki ktos nie spróbuje tego rozwiązać 😉).

Edytowano przez tomekpilat

Udostępnij ten post


Link to post
Share on other sites

@tomekpilat raczej nie może być tak, że takie równanie jest w stanie nieustalonym 😉 Dlaczego w Twoim założeniu pomijasz kolejność wykonywania działań? W normalnej matematyce, gdy operatory są "tak samo ważne" wykonuje się obliczenia od lewej do prawej. Tutaj po wykonaniu działania w nawiasach zostaje nam 1 NAND 1 NAND 0 i powinno się to traktować na jeden, konkretny sposób. Dlaczego rozbiłeś to na 2 wersje z różnie rozmieszczonymi nawiasami?

Udostępnij ten post


Link to post
Share on other sites

@Treker Często w szkołach spotyka się stwierdzenie, że działania należy wykonywać od lewej do prawej, jednak nie ma to poparcia w matematyce wyższej. Obowiązuje zasada, że nawiasy można opuszczać tylko jeśli ich usunięcie nie spowoduje braku jednoznaczności zapisu (nawet spotkałem się ze stwierdzeniem, że reguła od lewej do prawej to źle zrozumiana zasada opuszczania nawiasów). Dlatego w literaturze matematycznej używa się kreski poziomej jako operacji dzielenia lub ukośnik zawsze otacza się nawiasami, aby nikt się nie zastanawiał, czy a/bc to (a/b)c lub jednak a/(bc) (lub jak podaje angielska wiki ustala się to w tekście).

Rozważając jeden operator, tak jak w tym przypadku, możemy opuścić nawiasy, nie tracąc przy okazji jednoznaczności zapisu, tylko jeśli jest on łaczny. Działania mnożenia, dodawania, sumy lub iloczynu logicznego możemy zatem zapisać jako a*b*c, a + b + c, a OR b OR c i a AND b AND c, ponieważ sa one łączne i opuszczenie nawiasów nie zmieni ich znaczenia. Jednak działanie NAND (oraz NOR) nie spełnia już warunków łączności, ponieważ istnieją  a,b,c takie, że (a NAND b) NAND c ≠ a NAND (b NAND c) i z punktu widzenia matematyki jest tu pewien "syntax error" po opuszczeniu nawiasów.

Moim zdaniem warto dodać nawiasy, aby usunąć niejednoznaczność. Można też wspomnieć, że w przypadku NAND i NOR nawiasy jednak mają znaczenie. 😉

Udostępnij ten post


Link to post
Share on other sites
8 godzin temu, Elvis napisał:

Zamiast tej literatury matematycznej i matematyki wyższej proponuję powtórkę z podstawówki https://matematykawpodstawowce.pl/kolejnosc-wykonywania-dzialan/

Szedłem tym tropem, ale przyznam, że sam się tutaj zgubiłem. Według mnie zapis 1 NAND 1 NAND 0 powinno się rozwiązać analogicznie do (1 NAND 1) NAND 0, bo idziemy od lewej do prawej. Wbiłem jednak to równanie do Wolframa i tam nawiasy pojawiły się od prawej: https://www.wolframalpha.com/input/?i=1+NAND+1+NAND+0 Przyznam, że na ten moment nie rozumiem dlaczego, ale może jest zbyt wczesna pora i coś namieszałem 😉 Jakieś pomysły?

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@Treker Moim zdaniem zapis jest niejednoznaczny, bo nie wiadomo czy w pierwszym zapisie (bez nawiasów) chodzi o:

-----
1*1*0  

czy

------
---
1*1 *0  

Czyli niby zachowujemy kolejność działań od lewej do prawej. To na górze to kreska negacji. Czy dodając nawiasy miałeś na myśli mój drugi zapis z dwiema kreskami negacji? Przy czym w tym konkretnym przypadku wynik obu działań jest taki sam.

Edytowano przez grg0

Udostępnij ten post


Link to post
Share on other sites

Wg mnie rozpatrywanie kolejności "tych samych" działań jest bezcelowe.

Przynajmniej dla mnie oczywistym jest, że 2*3*5 = 2*5*3 = 5*3*2, (2*3)*2 = 2*(3*5) = 3*(5*2) itd.

Inaczej pisząc przy tych samych operatorach kolejność od lewej czy prawej, nie ma żadnego znaczenia.

Przykład z AND'ami hmm, to co bramka 3 wejściowa AND sprawdza "gdzie jest nawias" lub "czy lewa czy prawa strona" 🙂

Dywagacje na temat nawiasów i "od lewej czy prawej" poszły za daleko...

 

Udostępnij ten post


Link to post
Share on other sites
Przed chwilą, Zealota napisał:

Inaczej pisząc przy tych samych operatorach kolejność od lewej czy prawej, nie ma żadnego znaczenia.

Oczywiście. Przykładem jest operator potęgowania, prawda?

BTW to się nazywa "wiązanie" (ang. "associativity") a nie kolejność, trzymajmy się nomenklatury bo wymyślanie własnych terminów w miejsce ogólnie znanych prowadzi do mało ciekawych skutków.

 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
Cytat

Inaczej pisząc przy tych samych operatorach kolejność od lewej czy prawej, nie ma żadnego znaczenia.

@Zealota Nie ma znaczenia wtedy i tylko wtedy, gdy "operator" (w matematyce nazywa się to działanie algebriczne, a słowo operator ma kompletnie inne znaczenie) posiada właściwość łączności. Dlatego mnożenie czy dodawanie możemy wykonywać w dowolnej kolejności. Tak samo w algebrze Boole'a iloczyn (AND) lub suma (OR) też może być wykonywana w dowolnej kolejności. Jednak NAND i NOR już nie posiada tej właściwości. Spróbuj z 1 NAND 1 NAND 0, najpierw od lewej, czyli (1 NAND 1) NAND 0, a później od prawej, czyli 1 NAND (1 NAND 0) i zobacz jakie otrzymasz wyniki. Tak samo spróbuj z "1 NOR 0 NOR 0". Możesz też zmontować odpowiednie układy. 😉

Tak jak wspomniał @ethanak operator potęgowania też jest "pułapką".

Zwracanie uwagi na kolejność może pomóc w uniknięciu szukania, czemu nasz układ lub kod nie działa tak jak chcemy (np. załeżenie od lewej do prawej zawodzi, gdy spróbujemy potęgować w np. Pythonie, gdzie to działanie jest od "prawej do lewej"). Tak samo A*B nie zawsze się równa B*A. Kto zgadnie kiedy? 😉

@Treker Wyrażenie "a NAND b NAND c" to takie metametyczne "zachowanie niezdefiniowane" znane np. programistom C i C++ (legendarne i = i++ + ++i;), więc możliwe, że w ramach pewnej optymalizacji ustalili, że algorytm bierze "od prawej do lewej" i użytkownik będzie wpisywał jednoznacznie sformułowane działania (lub w podstawówkach za granicą mówią, że dodajemy od prawej do lewej). 😉

 

PS.: Pytanie o to co zrobić z takim "1 NAND 1 NAND 0" jest całkiem dobre do zadania na rozmowie o pracę kandydatowi na stanowisko programisty. 😁

Edytowano przez tomekpilat

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Moje wyniki:

1. 0

2. 0

3. 0

Edytowano przez ewgron
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@ewgron tak zgadza się, dobrze policzyłeś 🙂 w szczególności w przykładzie 3 jest ciekawa sytuacja gdyż jeden człon jest do samego końca 1 logiczną, ale ostatecznie przez iloczyn wynik jest zerowany.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Z góry uprzedzam że pytanie może się dla niektórych wydawać bez sensu.

15855756381551290694286785286017.thumb.jpg.ebc38298fa516f003d28e791c1de5cb7.jpg

Jeśli stan niski może mieć 0 v to dlaczego ten układ nie działa. Tam gdzie jest "0" podaliśmy stan niski tam gdzie jest "1" powinniśmy otrzymać stan wysoki .

Wiem że pytanie jest głupie ale chciałem zobaczyć odpowiedzi . Może coś przeoczyłem? Albo nie do końca rozumiem działanie prądu.

Edytowano przez jas123

Udostępnij ten post


Link to post
Share on other sites

A ten układ masz wymyślony czy z jakiegoś konkretnego przykładu/internetu? Nie spotkałem się z takim połączeniem.

Więcej o generatorach masz w 4 części kursu, więc już niedaleko 🙂 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
18 godzin temu, jas123 napisał:

Albo nie do końca rozumiem działanie prądu.

Na to bym stawiał, choć może nie tyle "prądu" co elementów których próbujesz używać. Kondensator naładuje się przez diodę LED (i przez diodę zabezpieczającą wejście bramki bo w środku scalaka zamiast trójkącika z kółkiem jest kilkanaście osobnych elementów - może warto dowiedzieć się jak taka bramka jest zrobiona?) przy pierwszym stanie wysokim na wyjściu i tyle. Zmiany stanu wyjściowego na niski nie spowodują już niczego więcej, bo LED będzie w stanie zaporowym. Układ działa w najlepszej wierze tak jak go zrobiono, nie wie przecież jaki był Twój zamiar. A jaki był?

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...