Antes, é preciso salientar que o texto pede para que o código se limite ao que é proposto no exercício e, portanto, os códigos que serão apresentados abaixo não irão contar com validação de dados ou tratamento de erros/exceções.
Assim, é necessário preencher corretamente os parâmetros da função com True ou False ou será retornado valores/respostas incorretos.
Vamos começar montando a tabela verdade para o condicional de 3 expressões. Note que não será objetivo dessa resolução a explicação do operador lógico em questão, portanto, caso ainda não esteja familiarizado com o assunto, sugiro que pause a leitura aqui e volte depois que tiver estudado a matéria.
[tex]\begin{array}{|c|c|c|c|c|}\sf p&\sf q&\sf p\rightarrow q&\sf r&\sf p\rightarrow q\rightarrow r\\-&-&--&-&----\\F&F&V&F&F\\F&V&V&F&F\\V&F&F&F&V\\V&V&V&F&F\\&&&&\\F&F&V&V&V\\F&V&V&V&V\\V&F&F&V&V\\V&V&V&V&V\end{array}[/tex]
Nesse ponto, vamos apresentar algumas alternativas de implementação dessa tabela verdade em Python e, é importante que seja ressaltado, há outras tantas possibilidades de faze-la, incluindo com bibliotecas específicas.
1) A primeira alternativa que será reproduzir a tabela verdade inteira através de uma estrutura condicional (if/elif).
[tex]\sf de f ~cond(p,~q,~r):\\ ~~~~if~ p==False ~and ~q==False~ and~ r==False:\\ ~~~~~~~~ return~False\\~~~~ elif~ p==False~ and~ q==True ~and~ r==False:\\~~~~~~~~ return ~False\\ ~~~~ elif~ p==True~ and~ q==False ~and~ r==False:\\~~~~~~~~ return~ True\\ ~~~~elif~ p==True~ and ~q==True~ and ~r==False:\\~~~~~~~~ return~ False[/tex]
[tex]\sf .\!~~~elif~ p==False~ and ~q==False ~and ~r==True:\\~~~~~~~~ return~ True\\~~~~ elif~ p==False~ and ~q==True ~and~ r==True:\\~~~~~~~~ return~ True\\~~~~ elif~ p==True ~and ~q==False~ and~ r==True:\\~~~~~~~~ return ~True\\~~~~ elif ~p==True ~and ~q==True ~and ~r==True:\\ ~~~~~~~~ return ~True[/tex]
(2) e (3) Como pudemos ver acima, transcrever a tabela, embora efetivo e legível, é uma opção trabalhosa.
Nessas 2ª e 3ª implementações vamos agora extrair da tabela a expressão booleana correspondente ao operador condicional de 3 entradas (p, q e r). A expressão booleana pode ser escrita como soma de produtos (SOP) utilizando-se as linhas que nos retornaram resultado Verdadeiro ou como produto de somas (POS) utilizando-se as linhas que nos retornaram resultado Falso.
[tex]\sf \underline{SOP}:~~p\rightarrow q\rightarrow r~=~p\overline{q}\,\overline{r}~+~\overline{p}\,\overline{q}r~+~\overline{p}qr~+~p\overline{q}r~+~pqr\\\\\\\sf \underline{POS}:~~p\rightarrow q\rightarrow r~=~(p+q+r)\cdot(p+\overline{q}+r)\cdot(\overline{p}+\overline{q}+r)[/tex]
Vamos implementa-las:
SOP:
[tex]\sf de f~ cond(p,~ q,~ r):\\ ~~~~ return~ (p~ and~ not~ q~ and~ not~ r )~ or~ (not~ p~ and ~ not~ q~ and~ r~ ) ~ or~ (not~ p~ and\\~~~~ q~ and~ r )~ or~ (p~ and~ not~ q~ and~ r )~ or~ (p~ and~ q~ and~ r )[/tex]
POS:
[tex]\sf de f~cond(p,~q,~r):\\~~~~return~(p~ or~q~or~r)~and~(p~or~not~ q~or~r)~and~(not~ p~ or~not ~q~or~r)[/tex]
4) Estes dois códigos (2 e 3) já parecem boas opções em relação à primeira implementação, no entanto, se quisermos, podemos deixa-los ainda mais simples.
Utilizando algebra booleana ou um mapa de Karnaugh, as expressões de SOP e POS podem ser simplificadas.
Aqui vou deixar a implementação utilizando SOP simplificada pelo mapa de Karnaugh (anexado).
[tex]\sf \underline{SOP~simplificado}:~~p\rightarrow q\rightarrow r~=~p\overline{q}+r[/tex]
[tex]\sf de f~ cond(p,~q,~r):\\~~~~ return~ (p~ and~ not~ q)~ or~ r[/tex]
[tex]\Huge{\begin{array}{c}\Delta \tt{\!\!\!\!\!\!\,\,o}\!\!\!\!\!\!\!\!\:\,\perp\end{array}}Qualquer~d\acute{u}vida,~deixe~ um~coment\acute{a}rio[/tex]