Wer ist was?

Neue Frage »

laila49 Auf diesen Beitrag antworten »
Wer ist was?
habe eine nette Logelei gefunden, die mich nach einigen Stunden nach einem vermutlich unelegantem Weg zur Lösung geführt hat.

Es geht um einen Jungen, ein Mädchen, eine Katze und einen Hund.

1. Wenn Aki nicht der Junge ist und Bauzi nicht das Mädchen, dann ist Knirps der Hund.

2. Wenn Dicki nicht die Katze ist, dann ist, falls Aki nicht das Mädchen ist, Bauzi der Hund.

3. Mindestens eine der folgenden Angaben ist richtig: Knirps ist die Katze, Dicki ist der Junge, Aki ist der Hund.

4. Wenn weder Knirps noch Dicki das Mädchen ist, dann ist Bauzi der Hund.

Wie heißen Junge, Mädchen, Katze, Hund?
Elvis Auf diesen Beitrag antworten »

Teufel auch... Die Bedingung 3 reduziert die 24 Möglichkeiten auf 12. Danach muss man die Implikationen formal aufschreiben, sonst verwirren sich die Gehirnwindungen. Nach einer halben Stunde habe ich eine Lösung gefunden, war aber auch ein bisschen probieren dabei. Oje, mein Ergebnis ist keine Lösung, jetzt weiß ich, warum du ein paar Stunden gebraucht hast.
nichteuerernst Auf diesen Beitrag antworten »
RE: Wer ist was?
Fall 1: Der Junge heißt Aki.
Wegen (3) muss Knirps dann die Katze sein. Wegen (2) ist dann Bauzi der Hund. Übrig bleibt Dickie als Mädchen.
Eine Probe zeigt, dass alle Bedingungen erfüllt sind.

Unter der Annahme, dass die Verteilung der Namen auf die Kreaturen eindeutig ist, erspare ich mir eine Untersuchung der übrigen 3 Fälle.
Elvis Auf diesen Beitrag antworten »

Das erkennt man tatsächlich schon im zweiten Schritt nach Halbieren der Tabelle durch Bedingung 3. Danach muss man nur noch "schnell" beweisen, dass diese Lösung eindeutig ist, weil keine der anderen 10 Möglichkeiten alle Bedingungen erfüllt. Du machst es dir m.E. zu einfach.
Conny_1729 Auf diesen Beitrag antworten »

Zitat:
Original von Elvis
Das erkennt man tatsächlich schon im zweiten Schritt nach Halbieren der Tabelle durch Bedingung 3. Danach muss man nur noch "schnell" beweisen, dass diese Lösung eindeutig ist, weil keine der anderen 10 Möglichkeiten alle Bedingungen erfüllt. Du machst es dir m.E. zu einfach.


Wenn man sich das Original dieser Aufgabe anschaut, das einst von Thomas von Randow in seinen "99 Logeleien" beschrieben wurde, dann wird dort auf ernüchternder Weise auch nur die direkte Lösung angegeben. Fand ich eigentlich immer schade, aber vom Erfinder des Rätsels aus betrachtet scheint der Weg „über die Hintertür“ statthaft zu sein.

Zitat:
Original von Elvis
Danach muss man die Implikationen formal aufschreiben, sonst verwirren sich die Gehirnwindungen.



Ja. gerade diese benannten Implikationen führen bei den meisten in der "Alltagslogik" zu ganz besonderen Komplikationen, weil man gerne (fälschlicherweise) dazu verführt wird, eine Äquivalenz-Aussage daraus zu bilden. (Ich schließe mich da nicht aus)

Frage an laila49: Wolltest du auch einen Lösungsweg sehen/angeben?

Gruß Conny
laila49 Auf diesen Beitrag antworten »

ich habe nicht mit 3 begonnen, sondern durch 2 und 4 zusammen die Möglichkeiten auf 10 reduziert.

dann habe ich wüst gestrichen, bis nur noch die eine Möglichkeit übrig blieb. Elegant war das jedenfalls nicht.
Da, wo ich das gefunden habe, stand die Lösung nicht dabei,
 
 
Conny_1729 Auf diesen Beitrag antworten »

Zitat:
Original von laila49
ich habe nicht mit 3 begonnen, sondern durch 2 und 4 zusammen die Möglichkeiten auf 10 reduziert.

dann habe ich wüst gestrichen, bis nur noch die eine Möglichkeit übrig blieb. Elegant war das jedenfalls nicht.
Da, wo ich das gefunden habe, stand die Lösung nicht dabei,


Zuerst hatte ich mir auch einen pragmatischen Weg zurechtgelegt, indem ich die Aussagen 1. und. 2. zusammen betrachtet habe bzgl. der 4 Fallunterscheidungen bei den Hunde-Namen. Das reduziert die möglichen Lösungen auf sechs. Dann reduziert 3. weiter auf drei Lösungen und 4. macht die Lösung dann eindeutig.

Formal kann das auch gelöst werden, wenn man sich mal anschaut, wie eine Implikation in der Aussagenlogik auch umgeschrieben werden darf.

aus folgt bzw.

Wenn die Namen durch große Anfangsbuchstaben beschrieben werden und die Personen/Tiere mit kleinen Anfangsbuchstaben als Indizes gelten, dann ergeben sich folgende Aussagen:

1.

daraus folgt dann:


2.

daraus folgt dann:


3.


4.

daraus folgt dann:


insgesamt hat man dann:


Führt man das der Reihe nach aus (1. … 4.) nach "Schema F", dann reduzieren sich die 24 Möglichkeiten auf 13, dann auf 6, dann auf 3 und schließlich 1.
Mir gefällt aber eher die pragmatische Lösung, weil ich da nicht zu sehr den Bezug zu den Objekten verliere wie es dann beim formalen Lösungsweg wäre.

Gruß Conny
Finn_ Auf diesen Beitrag antworten »

Zur Umschiffung von Mühseligkeiten bietet sich hier ein SMT-Löser an, denke ich.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
from z3 import EnumSort, Consts, Distinct, Implies, And, Or, Solver, sat

preds = ("der Junge", "das Maedchen", "die Katze", "der Hund")
roles, (J, M, K, H) = EnumSort('roles', preds)
(a, b, c, d) = Consts('a b c d', roles)
names = ("Aki", "Bauzi", "Knirps", "Dicki")

s = Solver()
s.add([
    Implies(And(a != J, b != M), c == H),
    Implies(d != K, Implies(a != M, b == H)),
    Or(c == K, d == J, a == H),
    Implies(And(c != M, d != M), b == H),
    Distinct(a, b, c, d)
])

while s.check() == sat:
    m = s.model()
    for (name, x) in zip(names, [a, b, c, d]):
        print(f"{name} ist {m[x]}.")
    s.add(Or(a != m[a], b != m[b], c != m[c], d != m[d]))
Elvis Auf diesen Beitrag antworten »

Selbst machen finde ich für mich besser. Computer machen lassen ist eventuell auch eine Möglichkeit, dann hat man aber keinen Spaß an dem Lösungsweg, und die Lösung ist sowieso egal. Die schlechteste Lösung scheint mir immer noch eine KI zu sein, denn Gemini sagt:

Dieses logische Rätsel lässt sich wunderbar Schritt für Schritt durch das Ausschlussverfahren lösen. Wir haben vier Namen (Aki, Bauzi, Dicki, Knirps) und vier Rollen (Junge, Mädchen, Katze, Hund). Jede Rolle ist genau einem Namen zugeordnet.Hier ist die schrittweise Lösung:Schritt 1: Analyse von Hinweis 4„Wenn weder Knirps noch Dicki das Mädchen ist, dann ist Bauzi der Hund.“Wir können hier eine Gegenprobe machen: Was wäre, wenn Bauzi nicht der Hund ist?Wenn Bauzi nicht der Hund ist, muss die Bedingung davor falsch sein. Das bedeutet, das Mädchen muss entweder Knirps oder Dicki sein.Wenn Bauzi nicht der Hund ist, scheidet er für diese Rolle aus.Schritt 2: Analyse von Hinweis 2 und die Rolle von Bauzi„Wenn Dicki nicht die Katze ist, dann ist, falls Aki nicht das Mädchen ist, Bauzi der Hund.“Schauen wir uns an, was passiert, wenn Bauzi der Hund wäre.Wenn Bauzi der Hund ist, können wir zu Hinweis 1 springen: „Wenn Aki nicht der Junge ist und Bauzi nicht das Mädchen, dann ist Knirps der Hund.“ Da Bauzi der Hund ist, ist er automatisch nicht das Mädchen. Wenn Knirps aber nicht der Hund sein kann (weil es ja schon Bauzi ist), darf die Bedingung „Aki ist nicht der Junge“ nicht erfüllt sein. Aki müsste also der Junge sein.Das führt jedoch bei den anderen Hinweisen zu Widersprüchen.Probieren wir also den umgekehrten, logisch zwingenden Weg: Bauzi ist NICHT der Hund.Aus Schritt 1 wissen wir dadurch sofort:Knirps oder Dicki ist das Mädchen. (Daher: Aki und Bauzi sind definitiv nicht das Mädchen).Wenn wir nun Hinweis 2 betrachten, wissen wir bereits, dass Aki nicht das Mädchen ist. Damit der Satz „...dann ist, falls Aki nicht das Mädchen ist, Bauzi der Hund“ nicht wahr wird (denn Bauzi ist ja nicht der Hund), darf die allererste Bedingung nicht erfüllt sein.Das bedeutet: Dicki MUSS die Katze sein.Zwischenstand:Katze: DickiMädchen: Knirps (da Dicki die Katze ist und nur Knirps oder Dicki das Mädchen sein konnten)Schritt 3: Die restlichen Rollen (Junge und Hund) zuordnenDa Dicki die Katze und Knirps das Mädchen ist, bleiben für Aki und Bauzi nur noch die Rollen Junge und Hund übrig.Da wir in Schritt 2 festgelegt haben, dass Bauzi nicht der Hund ist, bleibt für Bauzi nur noch eine Rolle übrig:Bauzi ist der Junge.Damit bleibt für die letzte Person und die letzte Rolle nur noch:Aki ist der Hund.Schritt 4: Überprüfung mit Hinweis 3Sehen wir nach, ob unser Ergebnis die Bedingung 3 erfüllt:„Mindestens eine der folgenden Angaben ist richtig: Knirps ist die Katze, Dicki ist der Junge, Aki ist der Hund.“Knirps ist die Katze? Nein (Knirps ist das Mädchen).Dicki ist der Junge? Nein (Dicki ist die Katze).Aki ist der Hund? Ja!Da Aki der Hund ist, ist Hinweis 3 wahr. Alle Bedingungen sind perfekt erfüllt.Das Endergebnis:NameRolleBauziJungeKnirpsMädchenDickiKatzeAkiHund
Conny_1729 Auf diesen Beitrag antworten »

Zitat:
Original von Elvis
... denn Gemini sagt:

Dieses logische Rätsel lässt sich wunderbar Schritt für Schritt durch das Ausschlussverfahren lösen. Wir haben vier Namen (Aki, Bauzi, Dicki, Knirps) und vier Rollen (Junge, Mädchen, Katze, Hund). Jede Rolle ist genau einem Namen zugeordnet.Hier ist die schrittweise Lösung:Schritt 1: Analyse von Hinweis 4„Wenn weder Knirps noch Dicki das Mädchen ist, dann ist Bauzi der Hund.“Wir können hier eine Gegenprobe machen: Was wäre, wenn Bauzi nicht der Hund ist?Wenn Bauzi nicht der Hund ist, muss die Bedingung davor falsch sein. Das bedeutet, das Mädchen muss entweder Knirps oder Dicki sein.Wenn Bauzi nicht der Hund ist, scheidet er für diese Rolle aus.Schritt 2: Analyse von Hinweis 2 und die Rolle von Bauzi„Wenn Dicki nicht die Katze ist, dann ist, falls Aki nicht das Mädchen ist, Bauzi der Hund. ...


Ach du lieber Himmel! Und da verlassen sie einen ... Hammer ... bzw. irgendwann beginnt auch der Wahnsinn.

Ein Freund stellte mal die Frage:
Unter der Voraussetzung, dass es weder Inzucht in seiner Familie noch eine Person gibt, die mehrfach verheiratet gewesen ist, wäre dann seine Schwester oder seine Tochter die Nichte des Schwippschwagers des Vetters der Cousine des Bruders der Schwiegermutter seines Schwagers?

Am Ende habe ich fast schon selbst geglaubt, ich wäre die vollbärtige Tochter von der halbschwangeren Schwester meines Freundes. Augenzwinkern



Abschließend sei gesagt, diese "Wer ist was?"-Logelei war ein sehr nettes und kurzweiliges Rätsel zum Wochenausklang!!! - Danke!

Gruß Conny
Finn_ Auf diesen Beitrag antworten »

Zitat:
Original von Elvis
Die schlechteste Lösung scheint mir immer noch eine KI zu sein, denn Gemini sagt: [...]

Ganz so plakativ schlecht ist es um die KI dann doch nicht bestellt, finde ich. Also da LLMs jetzt wieder explizit aufgeworfen wurden, will ich mal noch posten, was bei mir rauskommt. Nach ca. 1 min 20 s brüten liefert mir Gemini zumindest den folgenden Beweis samt Formalisierung ab, die von Rocq (Beweisverlauf wäre wie immer in CoqIDE zu betrachten) als korrekt durchgewunken wird. Bemerkenswert finde ich den virtuosen Umgang mit den Taktiken, und vor allem, dass es die Entwicklung des Beweiszustands mental durchspielen kann.

Prompt: Gelingt es Dir, dieses Rätsel (siehe die vier Bedingungen zzgl. Verschiedenheit von a, b, c, d) so elegant wie möglich zu lösen, und den manuellen Beweis anschließend in Coq zu formalisieren? Statt den Namen sollten lediglich die Kürzel J, M, K, H sowie a, b, c, d genutzt werden.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
from itertools import permutations

implies = lambda A, B: not A or B
X = ("Aki", "Bauzi", "Knirps", "Dicki")
(a, b, c, d) = X
for (J, M, K, H) in permutations(X):
    if (implies(a!=J and b!=M, c==H) and
        implies(d!=K, implies(a!=M, b==H)) and
        (c==K or d==J or a==H) and
        implies(c!=M and d!=M, b==H)):
        print(f"Junge: {J}.\nMädchen: {M}.\nKatze: {K}.\nHund: {H}.")

Antwort von Gemini 3.1 Pro (via AI Studio)

Hier ist eine sehr elegante und logisch flüssige Lösung des Rätsels, gefolgt von einer sauberen und exakt analogen Formalisierung in Coq.

Wir übersetzen zunächst die Vorgaben aus dem Python-Code in klare logische Aussagen. Wir wissen, dass paarweise verschieden sind und eine Permutation der Menge bilden.

Die vier Bedingungen lauten:
1.
2.
3.
4.

Der elegante manuelle Beweis

Der Schlüssel zu einer eleganten Lösung – ohne blindes Ausprobieren – liegt in Bedingung (4). Da zwingend einen der Werte annehmen muss, ist die Aussage "" logisch gleichbedeutend mit "".

Schritt 1: Der Widerspruchsbeweis für
Wir nehmen für einen Moment an, dass gilt.
  • Aus Bedingung (4) folgt direkt: Wäre oder , müsste sein. Da wir angenommen haben, wissen wir sofort: und .
  • Betrachten wir nun Bedingung (2): Da gilt, die Konsequenz aber falsch ist, ist die Teil-Implikation falsch (Wahr Falsch). Damit die gesamte Implikation (2) trotzdem wahr bleibt, muss ihre Prämisse falsch sein. Also ist die Aussage falsch, was bedeutet.
  • Schauen wir auf Bedingung (3): Wegen ist . Da alle Variablen verschiedene Werte haben müssen, folgt aus auch, dass . Die ersten beiden Bestandteile der Oder-Verknüpfung sind somit falsch. Es bleibt zwingend .
  • Wir haben nun und . Für und bleiben nur noch die Werte übrig. Da wir oben bereits festgestellt haben, muss sein. Für bleibt dann nur .
  • Der Widerspruch: Prüfen wir dieses Zwischenergebnis mit Bedingung (1): Die Prämisse "" ist wahr ( und ). Also müsste als Schlussfolgerung gelten. Wir haben aber . Ein Widerspruch!
  • Fazit: Unsere anfängliche Annahme war falsch. Es gilt zwingend .

Schritt 2: Die restlichen Zuweisungen fallen wie Dominosteine
  • Da ist, gilt . Damit in Bedingung (1) kein Widerspruch entsteht, muss deren Prämisse falsch sein. Es muss also gelten, was entspricht. Da schon den Wert hat, kann nicht sein. Es bleibt zwingend .
  • Betrachten wir erneut Bedingung (3): Da , ist . Da , ist . Die letzten beiden Optionen der Oder-Verknüpfung fallen weg. Es bleibt zwingend .
  • Für bleibt als einzige noch freie Variable aus nur noch .

Die eindeutige Lösung lautet somit: , , , .

Formalisierung in Coq

Dieser manuelle Beweis zeichnet sich dadurch aus, dass er das Prinzip der Ausschlussverfahrens (Verschiedenheit der Entitäten) nutzt. In Coq lässt sich das mit der mächtigen Taktik congruence wunderschön abbilden, da diese Konstruktor-Ungleichungen automatisch löst. Das Skript folgt exakt der Struktur des manuellen Beweises:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
(* Definition der 4 Entitäten als induktiver Typ *)
Inductive Entity: Type := a | b | c | d.

Section Puzzle.

Variables J M K H: Entity.

(* Alle 4 Variablen sind paarweise verschieden (Permutation) *)
Hypothesis dist_JM: J <> M.
Hypothesis dist_JK: J <> K.
Hypothesis dist_JH: J <> H.
Hypothesis dist_MK: M <> K.
Hypothesis dist_MH: M <> H.
Hypothesis dist_KH: K <> H.

(* Die 4 Bedingungen aus dem Python-Code *)
Hypothesis cond1: J <> a /\ M <> b -> H = c.
Hypothesis cond2: K <> d -> M <> a -> H = b.
Hypothesis cond3: K = c \/ J = d \/ H = a.
Hypothesis cond4: M <> c /\ M <> d -> H = b.

(* Zwei triviale Hilfslemmata für den Beweisfluss *)
Lemma entity_cases (x: Entity): x = a \/ x = b \/ x = c \/ x = d.
Proof. destruct x; auto. Qed.

Lemma eq_dec (x y: Entity): x = y \/ x <> y.
Proof. decide equality. Qed.

(* Schritt 1: Beweis, dass H = b, per Widerspruch *)
Lemma H_is_b: H = b.
Proof.
  destruct (eq_dec H b) as [Hb | Hnb]; [exact Hb |].
  
  (* Wenn H <> b, folgt M <> a und M <> b aus cond4 *)
  assert (M_not_a: M <> a) by
    (intro; apply Hnb, cond4; split; congruence).
  assert (M_not_b: M <> b) by
    (intro; apply Hnb, cond4; split; congruence).
  
  (* Aus cond2 folgt dann zwingend K = d *)
  assert (K_is_d: K = d). {
    destruct (eq_dec K d); [assumption |].
    assert (H = b) by (apply cond2; assumption).
    congruence.
  }
  
  (* Aus cond3 folgt dann zwingend H = a *)
  assert (H_is_a: H = a) by (destruct cond3 as [|[|]]; congruence).
  
  (* Für M und J bleiben nur c und b *)
  assert (M_is_c: M = c) by
    (destruct (entity_cases M) as [|[|[|]]]; congruence).
  assert (J_is_b: J = b) by
    (destruct (entity_cases J) as [|[|[|]]]; congruence).
  
  (* Das führt durch cond1 zum Widerspruch *)
  assert (Hc : H = c) by (apply cond1; split; congruence).
  
  (* congruence erkennt, dass H=a und H=c nicht *)
  (* gleichzeitig gelten können *)
  congruence.
Qed.

(* Schritt 2: Der restliche Beweis schließt das Puzzle ab *)
Theorem solve_puzzle: J = a /\ M = d /\ K = c /\ H = b.
Proof.
  assert (Hb: H = b) by apply H_is_b.
  assert (Ja: J = a). {
    destruct (eq_dec J a); [assumption |].
    assert (H = c) by (apply cond1; split; congruence).
    congruence.
  }
  assert (Kc: K = c) by (destruct cond3 as [|[|]]; congruence).
  assert (Md: M = d) by
    (destruct (entity_cases M) as
      [|[|[|]]]; congruence).
  auto.
Qed.

End Puzzle.

Warum ist dieses Coq-Skript so elegant?
Die Syntax [|[|[|]]]; congruence weist Coq an, alle vier Möglichkeiten einer Variablen (a, b, c, d) durchzugehen und Äste sofort zu verwerfen, die aufgrund der Verschiedenheits-Hypothesen (dist_...) oder der bisherigen deduktiven Einschränkungen zu einem direkten Widerspruch führen. Dadurch wird der Beweisbaum kurz gehalten und repräsentiert 1:1 die menschliche Intuition („M kann nicht d sein, weil K schon d ist…“).
Elvis Auf diesen Beitrag antworten »

Als ich Gemini gesagt habe, dass seine Antwort falsch ist, und dass er es mal mit Aussagenlogik versuchen soll, kam die richtige Antwort mit einer vollständigen Berechnung. Er verhält sich oft wie ein Mensch und redet erst einmal drauflos bevor er nachdenkt. Augenzwinkern
Finn_ Auf diesen Beitrag antworten »

Als alternativen Weg würde ich hier gern noch eine zahlentheoretische Deutung des logischen Rätsels aufzeigen. Man glaubt es nicht, aber auf diesem Weg lässt sich die gesuchte Lösung in einem Rutsch zahlentheoretisch-arithmetisch ausrechnen; ohne Denkarbeit, und ohne mühselig alle 24 Möglichkeiten durchprobieren zu müssen. Zudem handelt es sich im Ansatz um eine allgemeine Erwägung mit Anwendbarkeit auf viele andere logische Probleme. Natürlich ist das ein dummer Scherz; es gibt einen oder zwei Haken, aber Kaito will Aoko was vorführen; die Welt verlöre ihren Zauber, wenn wir alles so genau verstünden.

Es verhält sich dergestalt, dass der Teilerverband einer Zahl eine Heyting-Algebra bzgl. ggT als Meet (UND) und kgV als Join (ODER) bildet. Ist die Zahl zudem quadratfrei, liegt sogar eine boolesche Algebra vor. Wir kodieren demnach nun jedes der 24 Modelle durch eine Primzahl und multiplizieren alle zu einem Produkt. Das Bottom-Element ist die 1, das Top-Element das Produkt. Das Komplement (NICHT) einer Zahl ist Top dividiert durch die Zahl, sofern Top quadratfrei ist. Multipliziert man verschiedene Primzahlen (bzw. bestimmt deren kgV), deutet sich dies als Superposition der Modelle bzw. Welten. Zu einer atomaren Formel wie "Aki ist der Junge" gibt es nun eine Zahl, die die Superposition aller Modelle ist, die diese erfüllen. Die benötigten sind zu bestimmen. Nun rechnet man die Konjunktion der vier Bedingungen aus, und erhält wieder eine Zahl, deren Primfaktorzerlegung die Modelle aufzeigt, in der alle vier Bedingungen erfüllt sind.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
from math import gcd, lcm, prod
from itertools import islice, count, permutations

def is_prime(n):
    if n < 2: return False
    k = 2
    while k*k <= n:
        if n%k == 0: return False
        k += 1
    return True

(a, b, c, d) = (0, 1, 2, 3)
perms = list(permutations("JMKH"))
model_count = len(perms)

prime_iterator = (n for n in count(2) if is_prime(n))
prime_list = list(islice(prime_iterator, model_count))

BOTTOM = 1
TOP = prod(prime_list)
AND = lambda x, y: gcd(x, y)
OR = lambda x, y: lcm(x, y)
NOT = lambda x: TOP//x
IMPLIES = lambda x, y: OR(NOT(x), y)

# Superpostion der Modelle, die P(x) erfüllen.
def sp(P, x):
    acc = 1
    for (index, perm) in enumerate(perms):
        if perm[x] == P:
            acc *= prime_list[index]
    return acc

Ja = sp("J", a); Jd = sp("J", d)
Ma = sp("M", a); Mb = sp("M", b)
Mc = sp("M", c); Md = sp("M", d)
Ha = sp("H", a); Hb = sp("H", b)
Hc = sp("H", c); Hd = sp("H", d)
Kc = sp("K", c); Kd = sp("K", d)

C1 = IMPLIES(AND(NOT(Ja), NOT(Mb)), Hc)
C2 = IMPLIES(NOT(Kd), IMPLIES(NOT(Ma), Hb))
C3 = OR(OR(Kc, Jd), Ha)
C4 = IMPLIES(AND(NOT(Mc), NOT(Md)), Hb)

S = AND(AND(AND(C1, C2), C3), C4)
index = prime_list.index(S)
perm = perms[index]

display = {
    "J": "der Junge",
    "M": "das Mädchen",
    "K": "die Katze",
    "H": "der Hund"
}
names = ("Aki", "Bauzi", "Knirps", "Dicki")

for (name, x) in zip(names, (a, b, c, d)):
    print(f"{name} ist {display[perm[x]]}.")
Neue Frage »
Antworten »



Verwandte Themen