**Optional:** elements that would generate a `<br/>` element such as lists, double newlines, and other blocks may create *anonymous entities* which have no title (but do have a synthetic ID) and must have a `parent` property whose value must recursively resolve to the synthetic ID of the containing note (to support arbitrary nesting). The `file` property should be the same as the note.
## Formatted Reference
A *formatted reference* is a wikilink-style link using `[[name]]` syntax *or* a `((entity-id))` formatted block reference (syntax stolen from [[Logseq]]) if block references are supported.
## Properties
Properties are references to either a symbol, a [[D-Log#Formatted Reference]], a collection of properties, or a literal value such as a string, number, or boolean.
## Symbol
A symbol is an unquoted utf-8 sequence that starts with a non-numeric or any of the following characters: `{}(),`.
## Operators
*Operators* are a subset of [[D-Log#Properties]] that only allow [[D-Log#Formatted Reference]]s and symbols.
## Unary Assertions
Any *entity* maybe have a unary assertion made using the `{{target property}}` / `{{property}}` syntax. With the latter syntax, the `target` may be omitted in which case `note` is assumed.
Tags using the `#tag` syntax are automatically unary assertions for the enclosing *note* but are restricted in their syntax.
# Binary Assertions
Binary assertions use the `{{left-property operator right-property}}` syntax. Both targets and the operand must all be specified.
Frontmatter formatted properties are automatically converted into binary assertions with the `left-property` being set to the current note.
Wikilink and block property references automatically using the `refderences` operator.
Binary assertions are equivalent to facts in most prologs.
## Special Properties
- `note` is an alias for the current note
- Equivalent to a wikilink reference
- `self` the current block if block properties are supported or the same as `note`
- `parent` is automatically generated for block properties if available
- `file` is only allowed for binary assertions on notes and block references and may not be overriden
- `name` when used as an operator always has the url decoded name of a note in the right operand and the filename in the left
- `body` when used as an operator always has the full UTF-8 contents of a note as the right operand and the note identity as the left
# Rules
Rules are defined as in other prologs using the special `{$ assertion assertion ... $}` syntax. Symbols that start with a question mark may be used as placeholders. Any character that is a valid symbol name may follow the `?` to create a named placeholder. When a placeholder appears multiple times in an expression, the same value will be bound to the placeholder.
# Queries
Queries follow traditional prolog semantics and use the `{? assertion ?}` syntax wrap the query. A `!` may prefix a query to embed the result of the query virtually in a note (similar to the `![[wikilink]]` embeded reference): `!{? assertion ?}`.
- [ ] formatting for embedded query results
# Examples
## Task management
*Assumes block properties are available.*
Task management could be implemented like so:
*tasks.md*
```
{$ {{? task}} {{? status TODO }} $}
{$ {{? task}} {{? status DOING }} $}
{$ {{? task}} {{? status DONE }} $}
{$ {{? task}} {{? status NOW }} $}
{$ {{? task}} {{? status LATER }} $}
```
# Test Cases
(([[NPC]] is (? [[Hit Points]] ?) and (? [[Attack]] ?) and not (? [[Player]] ?)))
(([[Janet]] [[Attack]] 1)) (([[Janet]] [[Hit Points]] 10)) (([[Rust]] [[Hit Points]] 100)) (([[Rust]] [[Attack]] 1))
((? is [[NPC]]))
```base
filter:
- file.hasProperty("damage")
```