Facts and questions in AGISystem2 are expressed exclusively through Sys2DSL, not as “free” text lines. Every fact or question is an instruction of the form @var ACTION ... inside a session or a theory file.

Facts in Sys2DSL (ASSERT)

A fact is a Sys2DSL instruction that binds a variable to a canonical triple Subject REL Object and inserts it into the active theory.

General form:

@f1 ASSERT subject REL object

Examples of basic facts:

@f1 ASSERT Dog IS_A Animal
@f2 ASSERT Water BOILS_AT Celsius100
@f3 ASSERT Celsius100 IS_A temperature
@f4 ASSERT surgery_x REQUIRES consent
@f5 ASSERT export_data PROHIBITED_BY GDPR

Note: Properties like boiling point are expressed using specific relations (e.g., BOILS_AT) that connect subjects to value concepts (e.g., Celsius100). This keeps values as first-class concepts that can be reasoned about independently.

Conventions for tokens in the parameter list:

ASSERT instructions are the only ones that introduce new facts into the session theory; there is no implicit ingestion of “bare” lines. You may have multiple instructions in the same script; each @ marks the start of a new statement, even if they appear on the same line.

Yes/No Questions (ASK)

Questions are also Sys2DSL instructions, but instead of modifying the theory they bind a variable to a “truth object” that holds the result of reasoning. The form is:

@q1 ASK "question-text?"

question-text is a string that follows the constrained grammar. For natural language it usually ends in ?, but for canonical triples the trailing ? is optional because the ASK action already marks the statement as a question.

In all cases, the result is stored in the variable @qN and can be read or combined by other instructions (for example in more complex Sys2DSL programmes). There is no separate sugar mode: questions always go through @var ASK ....

Counterfactual Questions (CF)

Counterfactuals use a dedicated action but remain a single Sys2DSL instruction. General form:

@cfVar CF "question-text" | Fact1 ; Fact2 ; ...

Simple example (asking "what if water boiled at 50°C?"):

@cf CF "Water BOILS_AT Celsius50"
     | Water BOILS_AT Celsius50

The list of assumptions after | uses the same “Subject REL Object” grammar as ASSERT, separated by ; when there are multiple facts. Internally, the engine treats these facts as a temporary theory layer for the given question, without modifying the session’s base theory.

Combining Facts and Questions in One Script

A typical Sys2DSL script that mixes facts and questions looks like this:

@f1 ASSERT Dog IS_A Animal
@f2 ASSERT Water BOILS_AT Celsius100
@f3 ASSERT Celsius100 IS_A temperature
@q1 ASK "Is Dog an Animal?"
@q2 ASK "Water BOILS_AT Celsius100"

You can write the same instructions on a single line, for example:

@f1 ASSERT Dog IS_A Animal @q1 ASK "Is Dog an Animal?"

The interpreter splits the script at each @, builds the dependency graph between variables and executes the instructions in a topological order so that $ references are resolved correctly even if they appear “earlier” in the text.

Summary

In the new syntax, facts and questions never appear as independent lines; they are always expressed as Sys2DSL instructions of the form @var ASSERT ..., @var ASK ... or @var CF .... This guarantees a single, analyzable interaction form that is easy to compose into theory programmes.

References

For implementation details, see the relevant design specifications (referenced by ID):