Symboles logiques appris dans le mariage (et exemples d'implémentation en Python)

Humbles participants

Vous travaillez dur pour vous marier. Le revenu annuel que vous attendez de l'autre partie est supérieur à 8 millions de yens. J'aimerais assister à une fête de mariage, mais je ne pense pas qu'il soit logique d'y assister à moins que ** au moins l'un des participants ** ait un revenu annuel de 8 millions de yens ou plus. Étant donné la liste des participants et leur salaire annuel, ne répondez pas s'il est logique d'y assister.

Symbole logique

Supposons que l'ensemble des participants est de M $ M $ et que le revenu annuel est de 10 000 $ Y $. La condition ci-dessus utilise des symboles logiques,

\exists M[Y\geq800]

Peut être exprimé comme. $ \ existe $ signifie "il y a". Le point est ** "Si même une personne a un revenu annuel de 8 millions ou plus, tout va bien" **.

Exemple de programme

def main1(M):
    for Y in M:
        if Y >= 800:
            return "Présence"
    return "N'assiste pas"

print(main1([800,900,1000,1100]))#Présence
print(main1([500,600,700,800]))#Présence
print(main1([400,500,600,700]))#N'assiste pas

Vous pouvez regarder les participants dans l'ordre, et si vous trouvez une personne de 8 millions de yens, vous pouvez y arrêter la recherche. C'est la même chose quel que soit le nombre de personnes après une.

Participants gourmands

Vous êtes de plus en plus optimiste après avoir vécu de nombreuses expériences de mariage. J'en suis venu à penser qu'il ne sert à rien d'assister à moins que tous les participants ** aient un revenu annuel de 8 millions de yens ou plus.

Symbole logique

Dans ce cas,

\forall M[Y\geq800]

Peut être exprimé comme. $ \ Forall $ signifie «à propos de tout». Cependant, si vous essayez de l'implémenter dans le programme tel quel, ce sera un peu gênant, nous allons donc faire une petite conversion logique. La proposition ci-dessus est

\lnot(\lnot \forall M[Y\geq800])

Est la même valeur que. $ \ Lnot $ représente la négation. Pour une question à deux choix, ** "not'not A '" ** équivaut à ** "is A" **. ** $ \ lnot $ peut être déplacé vers la droite en échangeant $ \ forall $ et $ \ exists $ **

\lnot(\lnot \forall M[Y\geq800])\\
\Leftrightarrow \lnot(\exists M\lnot[Y\geq800])\\
\Leftrightarrow \lnot(\exists M[Y<800])

La conversion est établie. Le point est ** "Si même une personne a un revenu annuel inférieur à 800, elle sera immédiatement absente" **.

Exemple de programme

def main2(M):
    for Y in M:
        if Y < 800 :
            return "N'assiste pas"
    return "Présence"

print(main2([800,900,1000,1100]))#Présence
print(main2([500,600,700,800]))#N'assiste pas
print(main2([400,500,600,700]))#N'assiste pas

Le jugement de la fréquentation devient également strict.

Planificateur non motivé

Vous qui avez trop assisté à la fête de mariage vous êtes tourné vers la planification avant de le savoir. Nous avons décidé d'organiser plusieurs groupes pour répondre aux besoins des participants. Cependant, vous n'êtes pas motivé, alors j'ai pensé que ce serait bien s'il y avait ** au moins un ** groupe avec ** au moins un ** participant avec un revenu annuel de 8 millions de yens ou plus. Au pire, une seule personne suffit! Quel planificateur sans motivation! Les participants ne sont pas une collection.

Soit l'ensemble des groupes $ G $

\exists G \exists M[Y\geq800]

Ce sera. Cette mise en œuvre est facile et il n'y a pas de changement en disant que même une personne devrait avoir un revenu annuel de 8 millions ou plus.

def main3(G):
    for M in G:
        for Y in M:
            if Y >= 800:
                return "Passer"
    return "échec"   

print(main3([[400,500,600,700],[500,600,700,800]]))#Passer
print(main3([[400,500,600,800],[500,600,700,800]]))#Passer
print(main3([[300,400,500,600],[800,900,1000,1100]]))#Passer
print(main3([[800,900,1000,1100],[900,1000,1100,1200]]))#Passer

Planificateur parfait

Après avoir reçu des plaintes concernant trop de texte, vous avez décidé de préparer une programmation parfaite cette fois. ** Tous les participants de tous les groupes gagnent plus de 8 millions de yens par an **.

\forall G \forall M[Y \geq 800]\\
\Leftrightarrow \lnot(\lnot \forall G \forall M[Y \geq 800])\\
\Leftrightarrow \lnot(\exists G \lnot(\forall M[Y \geq 800]))\\
\Leftrightarrow \lnot(\exists G \exists M[Y < 800])\\

Si même une personne a un revenu annuel inférieur à 800, il sera immédiatement éliminé. La mise en œuvre est tout aussi simple.

def main4(G):
    for M in G:
        for Y in M:
            if Y < 800:
                return "échec"
    return "Passer"   

print(main4([[400,500,600,700],[500,600,700,800]]))#échec
print(main4([[400,500,600,800],[500,600,700,800]]))#échec
print(main4([[300,400,500,600],[800,900,1000,1100]]))#échec
print(main4([[800,900,1000,1100],[900,1000,1100,1200]]))#Passer

Planificateur réaliste partie 1

La composition parfaite a été bien accueillie, mais il était trop difficile de rassembler les gens et a rapidement atteint sa limite. Cette fois, j'ai pensé à un tel plan.

"Il y a au moins une ** équipe de rêve ** dans le groupe avec tous les membres qui gagnent plus de 8 millions par an."

\exists G \forall M[Y \geq 800]\\
\Leftrightarrow \exists G \lnot(\lnot \forall M[Y \geq 800])\\
\Leftrightarrow \exists G \lnot(\exists M[Y < 800])\\

Il est difficile de l'implémenter en une seule boucle comme c'était le cas auparavant, mais cela peut être implémenté simplement en divisant la fonction.

def main5(M):
    for Y in M:
        if Y < 800:
            return False
    return True

def main6(G):
    for M in G:
        if main5(M):
            return "Passer"
    return "échec"

print(main6([[400,500,600,700],[500,600,700,800]]))#échec
print(main6([[400,500,600,800],[500,600,700,800]]))#échec
print(main6([[300,400,500,600],[800,900,1000,1100]]))#Passer
print(main6([[800,900,1000,1100],[900,1000,1100,1200]]))#Passer

Planificateur réaliste partie 2

Avec ce plan d'équipe de rêve, les participants qui ont été attirés par Baba ont commencé à se plaindre naturellement. Vous avez donc proposé le prochain plan.

"Nous garantissons que chaque équipe a au moins une personne avec un revenu annuel de 8 millions ou plus."

\forall G \exists M[Y \geq 800]\\
\Leftrightarrow \lnot ( \lnot \forall G \exists M[Y \geq 800])\\
\Leftrightarrow \lnot (\exists G \lnot(\exists M[Y \geq 800]))\\
def main7(M):
    for Y in M:
        if Y >= 800:
            return False
    return True

def main8(G):
    for M in G:
        if main7(M):
            return "échec"
    return "Passer"

print(main8([[400,500,600,700],[500,600,700,800]]))#échec
print(main8([[400,500,600,800],[500,600,700,800]]))#Passer
print(main8([[300,400,500,600],[800,900,1000,1100]]))#échec
print(main8([[800,900,1000,1100],[900,1000,1100,1200]]))#Passer

Avec cela, un fonctionnement stable était enfin possible. Je suis heureux.

prime

Si vous voulez compléter les deux derniers cas en une seule fonction, vous devez préparer une variable bool distincte pour l'indicateur.

\exists G \forall M[Y \geq 800]\\
\Leftrightarrow \exists G \lnot(\lnot \forall M[Y \geq 800])\\
\Leftrightarrow \exists G \lnot(\exists M[Y < 800])\\
def main9(G):
    for M in G:
        fail_at_least = 0
        for Y in M:
            if Y < 800:
                fail_at_least = 1
        if not fail_at_least:
            return "Passer"
    return "échec" 
\forall G \exists M[Y \geq 800]\\
\Leftrightarrow \lnot ( \lnot \forall G \exists M[Y \geq 800])\\
\Leftrightarrow \lnot (\exists G \lnot ( \exists M[Y \geq 800]))\\
def main10(G):
    for M in G:
        success_at_least = 0
        for Y in M:
            if Y >= 800:
                success_at_least = 1
        if not success_at_least:
            return "échec"
    return "Passer" 

Comme la condition du drapeau est facile à confondre, j'essaie personnellement de donner un nom de variable tel que fail_at_least (échoué au moins une fois) même si le nom est long.

Recommended Posts

Symboles logiques appris dans le mariage (et exemples d'implémentation en Python)
Algorithme de tri et implémentation en Python
Module d'implémentation de file d'attente et Python "deque"
Apprentissage profond à partir de zéro - Conseils du chapitre 4 pour la théorie de l'apprentissage profond et la mise en œuvre apprise en Python
Variables Python et types de données appris avec la chimio-automatique
Explication de la distance d'édition et de l'implémentation en Python
Implémentation RNN en python
Implémentation ValueObject en Python
Implémentation SVM en python
Fusion de la mise en œuvre du tri / analyse du montant du calcul et de l'expérimentation en Python
Refactoring appris avec Python (Basic)
Classe Python pour apprendre avec la chimioinfomatique
Pile et file d'attente en Python
Implémentation de réseau neuronal en python
Unittest et CI en Python
Description et implémentation de Maxout (Python)
Implémentation du tri rapide en Python
Ce que j'ai appris en Python
Code de caractère appris en Python
Fonctions Python apprises avec la chimioinfomatique
Paquets qui gèrent le MIDI avec Python midi et pretty_midi
Différence entre == et est en python
Afficher les photos en Python et html
Implémentation de l'estimation des paramètres HMM en python
Implémentation de distribution normale mixte en python
Manipuler des fichiers et des dossiers en Python
À propos de Python et Cython dtype
Implémentation du jeu de vie en Python
Vérifiez et déplacez le répertoire en Python
Chiffrement avec Python: IND-CCA2 et RSA-OAEP
Hashing de données en R et Python
J'ai essayé d'étudier le processus avec Python
Synthèse de fonctions et application en Python
Utilisation élémentaire d'ITK apprise avec Python
Exporter et exporter des fichiers en Python
Implémentation du tri original en Python
Inverser le pseudonyme plat et le katakana en Python2.7
Lire et écrire du texte en Python
[GUI en Python] Menu PyQt5 et barre d'outils-
Créer et lire des paquets de messages en Python
Implémentation du filtre à particules par Python et application au modèle d'espace d'états
Chevauchement d'expressions régulières en Python et Java
Différence d'authenticité entre Python et JavaScript
Les modules et packages en Python sont des "espaces de noms"
Évitez les boucles imbriquées en PHP et Python
Modulation et démodulation AM avec Python Partie 2
différence entre les instructions (instructions) et les expressions (expressions) en Python
Valeurs authentiques et vecteurs propres: Algèbre linéaire en Python <7>
Graphique à lignes pliées et ligne d'échelle en python
Implémenter le filtre FIR en langage Python et C
Différences entre la syntaxe Python et Java
Vérifier et recevoir le port série en Python (vérification du port)
Rechercher et lire des vidéos YouTube avec Python
Différence entre @classmethod et @staticmethod en Python
Structure de données Python et implémentation interne ~ Liste ~
Différence entre append et + = dans la liste Python
Différence entre non local et global en Python
Ecrire le fichier O_SYNC en C et Python
Gérer les "années et mois" en Python