Colorless green mana sleeps furiously

The Magic: The Gathering card game has evolved its own strange and wonderful dialect. Although the rules on each card were originally written in standard informal English, the language has been shored up over time so that it is more technically precise and unambiguous—a kind of specialist, almost legalese, offshoot of English. The break with standard English grammar is striking and profound.

For example, Magic has a new determiner, "target", that standard English lacks (ex: Destroy target land) and the word permanent can be used as a noun but never as an adjective (ex: Permanents you control can't block).

And the differences go beyond mere tweaks to the lexicon, i.e. just adding new words or new ways of using words. These differences pervade the grammar at a deep level: Certain phrasings, while innocuous in English, sound wrong to anyone who has played Magic long enough to get the knack of it. Compare1:

  • All creatures have haste.
  • * Creatures have haste.
  • Red creatures have haste.
  • * All red creatures have haste.

These phrasing rules are—to my knowledge—not stated explicitly anywhere. They are learned apparently without direct instruction and without most players even noticing it. And while the lexicon was carefully put together by hand, the grammar appears to have emerged organically. Nonetheless, I claim that Magic players generally all acquire an ear for these rules, and generally have consistent judgments about what sounds strange.

I'm curious about what these rules are. This article is an attempt to do some linguistic investigative work to characterize the strange and wonderful dialect of Magic. I think it would be interesting to do a proper linguistics study; in lieu of this, I have surveyed my Magic-playing friends to corroborate my guesses. I have also made use of the fact that Magic has a de facto exhaustive corpus—namely, the text of all cards that have ever been printed. I use this corpus testimony to confirm that certain phrasings are allowable, and (although a productive grammatical system can produce an infinite variety of things to say) that when I label a phrasing as unallowable, it genuinely doesn't occur anywhere.

I start the linguistic investigation here in this article, but Magic's grammar is so complex, I can hardly cover everything. I hope that others might be inspired to take on some aspect of this work. There is much work to be done.

Static abilities

Scoping quantifiers: All creatures have haste.

Let's start with a simple static ability "All creatures have haste". Consider these variations:

  1. [?] All creatures have haste
  2. [?] Creatures have haste
  3. [?] Red creatures have haste
  4. [?] Creatures you control have haste
  5. [?] Red creatures you control have haste
  6. [?] All red creatures have haste
  7. [?] All creatures you control have haste.

If you're a fluent speaker of Magic, I suspect some of these sentences sound better—more correct—than others. Before reading further, feel free to take a moment to consider which of these sentences sounds a little off; we can see if our judgments agree.

Here are my judgments; in the case of positive judgments, I've attempted to find a card as supporting evidence. Although it was not always possible to find an exact match, the card is always a clear and compelling relative—one that merely uses White instead of Red, or flying instead of haste, for example.

  1. All creatures have haste (Concordant crossroads)
  2. * Creatures have haste
  3. Red creatures have haste (Aysen Highway)
  4. Creatures you control have haste. (Archetype of Imagination)
  5. Red creatures you control have haste. (Bloodmark Mentor)
  6. * All red creatures have haste.
  7. * All creatures you control have haste.

and the same variations with the subtype Sliver added:

  1. All Sliver creatures have haste. (Battering Sliver)
  2. * Sliver creatures have haste.
  3. Red Sliver creatures have haste.
  4. Sliver creatures you control have haste. (Belligerent Sliver)
  5. Red Sliver creatures you control have haste.
  6. * All red Sliver creatures you control have haste.
  7. * All Sliver creatures you control have haste.

What distinguishes the good-sounding cases from the bad-sounding ones? I suggest the following theory:

  • The main noun (creatures) must have some scoping quantifier attached to it. Intuitively, Creatures have haste doesn't sound specific enough---which creatures have haste?
  • The scoping quantifier can be any of these: The universal quantifier ("All"), a color ("Red"), a control status ("__ you control") or an ability clause ("__ with flying").
  • The quantifier "All" can't co-occur with any of the other qualifiers. Everything else can happily co-occur.
  • Type descriptors, such as "Sliver", are totally optional—they aren't a kind of scoping quantifier like "all" "red" or "you control". You can always include them and always leave them out.

Using the Python Natural Language Toolkit, you can define a feature-based grammar to account for these observations. (See the Appendix at the end of this section for file details.)

To codify the static-ability theory here, I introduce a binary feature +definite which is conferred by each of the scoping quantifiers and inherited upwards (so any phrase containing a +definite constituent is itself definite). The grammar thereby imposes the "scoping quantifier" requirement by requiring the overall sentence to be +definite. Finally, the word "All" confers definiteness, but can only be paired with a -definite (definite-lacking) phrase.

(I use an irritating contrivance to ensure that each of the quantifiers occurs at most once: the quantifiers are considered in the order "_ with/out [ability]", "_ [player] controls", "[color] __", "[type descriptor] __." As an unfortunate side effect, this makes the rules-list longer and more cumbersome than it needs to be. Perhaps I will rewrite it with a more elegant approach later.)

% start S
S -> StaticAbility

StaticAbility -> DefinedClause[num=?n, +definite] HasAbility[num=?n] Ability

DefinedClause[num=?n, +definite] -> 'all' WithAbilityClause[num=pl, -definite]
DefinedClause[num=?n, +definite] -> 'other' WithAbilityClause[num=pl]
DefinedClause[num=?n, definite=?d] -> WithAbilityClause[num=pl, definite=?d]

WithAbilityClause[num=?n, +definite] -> ControlledClause[num=?n] 'with' Ability | ControlledClause[num=?n] 'without' Ability 
WithAbilityClause[num=?n, definite=?d] -> ControlledClause[num=?n, definite=?d] 

ControlledClause[+definite, num=?n] -> ColorClause[num=?n] 'you' 'control'
ControlledClause[definite=?d, num=?n] -> ColorClause[definite=?d, num=?n]

ColorClause[+definite, num=?n] -> Color SubtypeClause[num=?n]
ColorClause[definite=?d, num=?n] -> SubtypeClause[num=?n, definite=?d]

# Subtypes don't confer definiteness 
SubtypeClause[definite=?d, num=?n] -> 'sliver' FinalClause[definite=?d, num=?n] | FinalClause[definite=?d, num=?n]

FinalClause[definite=?d, num=?n] -> Permanent[num=?n,definite=?d]

Permanent[num=sg] -> 'permanent'| 'land'| 'creature'| 'artifact'
Permanent[num=pl,-definite] -> 'permanents'| 'lands'| 'creatures'| 'artifacts'
Permanent[num=pl,-definite] -> 'slivers'

Ability -> 'haste' | 'flying' | 'vigilance' | 'reach' | 'defender' | 'lifelink' | 'deathtouch' | 'menace'

1.2 Negative polarity: Creatures can't block.

In the previous section, we showed how the "…have haste" static ability requires some sort of scoping quantifier such as "All" or "Red" or "_ you control". As we will see, the "…can't block" predicate has a different set of requirements:

  1. * All creatures can't block.
  2. Creatures can't block. (Bedlam)
  3. Red creatures can't block. (Awe for the Guilds, Flooded woodlands)
  4. Creatures you control can't block. (Blightbeetle, Cosmotronic wave)
  5. Red creatures you control can't block. (Deepchannel Mentor)
  6. * All red creatures can't block.
  7. * All creatures you control can't block.
  8. Slivers you control can't block (Doomed Artisan)
  9. Sliver creatures can't block (Ruthless invasion) (?)

In this context, apparently all scoping quantifiers are now optional—they can always be included or left out. The one exception is "All", which is completely forbidden.

Why should "All" be completely forbidden in this context? To my ear, "All" sounds wrong in the negative context created by "can't". In standard English, this happens with words like "somewhat" that are ungrammatical in a negative environment:

  • I liked the movie somewhat. (Standard English)
  • * I didn't like the movie somewhat. (Standard English)

In fact, we've got some evidence that Magic's "All" is a positive-polarity item. Contrast these two abilities:

  • All red creatures can block […] (Frenzied Saddlebrute)
  • * All red creatures can't block.

To accomodate this theory, we can introduce a new lexical feature +polarity. The "can't" phrase introduces negative polarity -polarity, while "All" is a word that must bind to a phrase with positive +polarity and (as already established) negative -definite-ness.

Here's the new rule for static abilities, updated accordingly:

StaticAbility -> DefinedClause[-polarity] "can't" "block"
StaticAbility -> DefinedClause[num=?n, +definite] HasAbility[num=?n] Ability

DefinedClause[num=?n,+definite, +polarity] -> 'all' WithAbilityClause[num=pl, -definite]

2 Appendix: Python nltk

The grammars in this article are written using the Python Natural Language Toolkit (nltk). In the general setup, I have a file containing the grammar mtg.fcfg which is written in a kind of context-free grammar syntax. I also have a python script that loads the grammar and uses it to test various sentences. For example:

import nltk

from nltk import grammar, parse
cp = parse.load_parser('mtg.fcfg')

sentences = [
    ("creatures have haste", False),
    ("all creatures have haste", True), # Concordant crossroads
    ("creatures you control have haste", True),
    ("red creatures have haste", True), # Aysen Highway
    ("all red creatures have haste", False), 
    ("all creatures you control have haste", False),
    ("red creatures you control have haste", True ), 
    ("sliver creatures have haste", False),
    ("all sliver creatures have haste", True),
    ("all red sliver creatures you control have haste", False),
    ("red sliver creatures you control have haste", True),
    ("other creatures have haste", True),
    ("slivers you control have haste", True),
    ("all slivers have haste", True),
    ("creatures with flying have haste", True), #Empyrean Eagle #Smog Elemental

    ("creatures can't block", True), # Bedlam
    ("all creatures can't block", False),
    ("other creatures can't block", True),
    ("red creatures can't block", True),
    ("slivers can't block", True)
]

for s,judgment in sentences:
    tokens = s.split()
    trees = cp.parse(tokens)

    has_parse = None
    for t in trees :
        has_parse = t
        break
    if has_parse :
        print(s)
        # print(t)
    else :
        print("*", s)

    if bool(has_parse) != bool(judgment) :
        print("\t\t<<<Unit test failed")
        ```

Footnotes:

1 In this article, following standard linguistic conventions, I mark sentences with an asterisk (*) when I think they sound strange (ungrammatical); unmarked sentences sound right.