BNF Definition of Cocoa Predicates
This article defines Cocoa predicates in Backus-Naur Form notation. 
NSPredicate
| NSPredicate ::= NSComparisonPredicate | NSCompoundPredicate | 
|     | "(" NSPredicate ")" | TRUEPREDICATE | FALSEPREDICATE  | 
NSCompoundPredicate
| NSCompoundPredicate ::= NSPredicate "AND" NSPredicate | 
|     | NSPredicate "OR" NSPredicate | 
|     | "NOT" NSPredicate | 
NSComparisonPredicate
| NSComparisonPredicate ::= expression operation expression | 
|     | aggregate_qualifier NSComparisonPredicate | 
Operations
CONTAINS and IN serve both as aggregate operators and string operators, depending on the types of their arguments.
| operation ::= "=" | "!=" | "<" | ">" | "<=" | ">=" | 
|     | BETWEEN | 
|     | aggregate_operations [ "[" string_options "]" ] | 
|   | 
| aggregate_operations ::= CONTAINS | IN | string_operations | 
|   | 
| string_operations ::= BEGINSWITH | ENDSWITH | LIKE | MATCHES | 
|   | 
| string_options ::= c | d | cd | 
Aggregate Qualifier
| aggregate_qualifier ::= ANY | ALL | NONE | SOME | 
Expression
| expression ::= "(" expression ")" | 
|     | binary_expression | 
|     | function_expression | 
|     | assignment_expression | 
|     | index_expression | 
|     | keypath_expression | 
|     | value_expression | 
|   | 
Value Expression
| value_expression ::= literal_value | literal_aggregate | 
Literal Value
| literal_value ::= string_value | 
|     | numeric_value | 
|     | predicate_argument | 
|     | predicate_variable | 
|     | NULL | 
|     | TRUE | 
|     | FALSE | 
|     | SELF | 
String Value
| string_value ::= "text" | 'text' | 
Predicate Argument
| predicate_argument ::= "%" format_argument | 
Format Argument
| format_argument ::= "@" | "%" | "K" | 
|     printf style conversion character | 
Predicate Variable
| predicate_variable ::= "$" identifier | 
Keypath Expression
| keypath_expression ::= identifier | "@" identifier | 
|     | expression "." expression | 
Literal Aggregate
| literal_aggregate ::= "{" [ expression [ "," expression ... ] ] "}" | 
Index Expression
| index_expression ::= array_expression "[" integer_expression "]" | 
|     | dictionary_expression   "[" expression "]" | 
|     | aggregate_expression "[" FIRST "]"  | 
|     | aggregate_expression "[" LAST "]"  | 
|     | aggregate_expression "[" SIZE "]"  | 
Aggregate Expression
| aggregate_expression ::= array_expression | dictionary_expression | 
Assignment Expression
| assignment_expression ::= predicate_variable ":=" expression | 
Binary Expression
| binary_expression ::= expression binary_operator expression | 
|     | "-" expression | 
Binary Operator
| binary_operator ::= "+" | "-" | "*" | "/" | "**" | 
Function Expression
| function_expression ::= function_name "(" [ expression [ "," expression ... ] ] ")" | 
Function Name
| function_name ::= "sum" | "count" | "min" | "max" | 
|     | "average" | "median" | "mode" | "stddev" | 
|     | "sqrt" | "log" | "ln" | "exp" | 
|     | "floor" | "ceiling" | "abs" | "trunc" | 
|     | "random" | "randomn" | "now" | 
Array Expression
| array_expression ::= any expression that evaluates to an NSArray object | 
Dictionary Expression
| dictionary_expression ::= any expression that evaluates to an NSDictionary object | 
Integer Expression
| integer_expression ::= any expression that evaluates to an integral value | 
Numeric Value
| numeric_value ::= C style numeric constant | 
Identifier
| identifier ::= C style identifier | "#" reserved_word |