Consider the deductive argument “All cats are mammals and a tiger is a cat, so a tiger is a mammal.” Is this argument valid?
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
# Each argument: (inner set, outer set, individual, which premise 2 we were given)
# "member of inner" pins the individual inside the small circle; "member of outer"
# only pins it inside the big one, which leaves room for doubt.
ARGUMENTS = [
("cats", "mammals", "a tiger",
"All cats are mammals.", "A tiger is a cat.", "A tiger is a mammal.", True),
("firefighters", "people who know CPR", "Jill",
"All firefighters know CPR.", "Jill knows CPR.", "Jill is a firefighter.", False),
]
fig, axes = plt.subplots(1, len(ARGUMENTS), figsize=(10.5, 5.0))
for ax, (inner, outer, who, prem1, prem2, conclusion, pinned) in zip(axes, ARGUMENTS):
ax.add_patch(Circle((0, 0), 1.05, alpha=0.18, fc="tab:blue", ec="black", lw=1.6))
ax.add_patch(Circle((0, -0.32), 0.58, alpha=0.30, fc="tab:orange", ec="black", lw=1.6))
ax.text(0, 0.82, outer, ha="center", fontsize=11)
ax.text(0, -0.32, inner, ha="center", fontsize=11)
if pinned:
ax.plot([0], [-0.62], "ko"); ax.text(0.06, -0.64, who, fontsize=11)
else:
ax.plot([0], [-0.62], "ko"); ax.text(0.06, -0.64, who + " ?", fontsize=11)
ax.plot([0.45], [0.45], "ko"); ax.text(0.51, 0.43, who + " ?", fontsize=11)
ax.set_xlim(-1.35, 1.35); ax.set_ylim(-1.35, 1.35)
ax.set_aspect("equal"); ax.axis("off")
ax.set_title(("VALID" if pinned else "INVALID") + f"\n{conclusion}", fontsize=12)
plt.tight_layout(); plt.show()
print("the same two arguments, checked by listing every world the premises allow\n")
for inner, outer, who, prem1, prem2, conclusion, pinned in ARGUMENTS:
print(f"Premise: {prem1}")
print(f"Premise: {prem2}")
print(f"Conclusion: {conclusion}")
# A world says where the individual sits. Premise 1 forbids inner-but-not-outer.
worlds = [(i, o) for i in (True, False) for o in (True, False) if o or not i]
worlds = [w for w in worlds if (w[0] if pinned else w[1])]
counter = [w for w in worlds if not (w[1] if pinned else w[0])]
for i, o in worlds:
print(f" world: in {inner}? {str(i):<5} in {outer}? {str(o):<5}"
f" conclusion holds? {(o if pinned else i)}")
if counter:
print(f" {len(counter)} of the {len(worlds)} allowed worlds leave the "
f"conclusion FALSE -> INVALID\n")
else:
word = "world" if len(worlds) == 1 else "worlds"
print(f" all {len(worlds)} allowed {word} make the conclusion true -> VALID\n")
print("the rule: an argument is invalid if you can draw the diagram so the premises")
print("hold and the conclusion fails. Whether Jill really is a firefighter is beside")
print("the point - validity is about whether the premises FORCE the conclusion.")