Make a decision model you own in hours. Reason over it token-free in milliseconds. Get evidence for each decision.
Rae takes knowledge sources, and creates a decision model that can answers any question within the model's scope; deterministically, with an evidence tree for each answer.
A model is a reusable knowledge representation in a logic language called Raelog. The Raelog Reasoner is the engine that then reasons at runtime. Rae uses language models to help write Raelog, but no language model sits in the reasoning.
Your knowledge sources
A Rae model is built from regulation, policy and institutional knowledge.
A model, in Raelog
The build process turns knowledge into a model: concepts, relationships, facts and rules.
Tested and refined
Every expected outcome checked before the model is released.
Raelog is a complete expressive logic language for knowledge representation: Readable, testable, versioned.
A Rae model is written in a logic language called Raelog. The build process encodes regulation, policy and institutional knowledge as a model comprising concepts, relationships, facts and rules, in plain text you can read, test and change. It describes a domain and knowledge but it does not need to describe how to reach a decision. The engine works that out.
A language of five elements
A model is made of concepts (the kinds of thing: a transaction, a wallet, a tier), the relationships between them, instances, facts and rules. A rule is an independent declarative statement that says: if these hold, then this holds. There is no procedure to write and no logic to chain by hand.
Asks when it needs to
If a rule needs a fact that is neither stated nor derivable, and the relationship is marked askable, Rae asks for it. Supply every fact and the model is a headless decision service. If data is missing, the same model becomes an interactive advisor that asks only for what the decision needs, and only when it needs it.
One model, many questions
A model is not built to answer a single question. It describes a domain: the things in it, how they relate, and the rules that connect them. Ask it anything within the model's scope and the engine starts from your question and works backwards, touching only the rules and facts that question needs. The same model can decide an outcome, list the duties that follow from it, or assess the whole position, each from the same model. A new question requires no new code.
Yours to read and change
Rae's builder writes Raelog from the sources you give it, with opportunities for experts to review both the model and test design. Raelog is plain text: so you can read it, diff it, version it, and when policy changes, edit it. The model is tested and remains yours. We provide a VS Code extension for model inspection and if you so choose, editing.
<!-- Should I take an umbrella today. A tiny example of a Rae model. -->
<!-- Rain bands follow the US National Weather Service wording: 30 to 50
percent is a chance of rain, 60 percent and above is rain likely. -->
<!-- The wind limit follows the Beaufort scale: at Force 6, 25 mph and
above, umbrellas are used with difficulty. -->
<!-- Concepts. -->
<concept name="Person" type="string"/>
<concept name="Rain Gear" type="string"/>
<concept name="Going Outside" type="truth"/>
<concept name="Chance Of Rain" type="number"/>
<concept name="Wind Speed" type="number"/>
<!-- Questions Rae may ask. Each one allows an I do not know answer. -->
<rel name="is going outside today" subject="Person" object="Going Outside"
plural="false" askable="secondFormObject" allowUnknown="true">
<secondFormObject>Is %S going outside today?</secondFormObject>
</rel>
<rel name="has chance of rain" subject="Person" object="Chance Of Rain"
plural="false" askable="secondFormObject" allowUnknown="true">
<secondFormObject>What is the forecast chance of rain today where %S is
going, as a percentage from 0 to 100?</secondFormObject>
</rel>
<rel name="has wind speed" subject="Person" object="Wind Speed"
plural="false" askable="secondFormObject" allowUnknown="true">
<secondFormObject>What is the forecast wind speed today where %S is
going, in miles per hour?</secondFormObject>
</rel>
<!-- The answer. Query this relationship. -->
<rel name="should take" subject="Person" object="Rain Gear" plural="false"
askable="none"/>
<!-- The three possible answers. -->
<concinst name="Umbrella" type="Rain Gear"/>
<concinst name="Raincoat" type="Rain Gear"/>
<concinst name="No rain gear" type="Rain Gear"/>
<!-- REQ-01. Staying in. Asked first, so nobody staying in is asked about
the weather. -->
<relinst type="should take" object="No rain gear" cf="100"
name="REQ-01 staying indoors needs no rain gear"
alt="{{%S}} is staying indoors today, so no rain gear is needed">
<condition rel="is going outside today" subject="%S" object="false"/>
</relinst>
<!-- REQ-04. Rain unlikely. The wind does not matter, so it is not
consulted. -->
<relinst type="should take" object="No rain gear" cf="85"
name="REQ-04 going out with rain unlikely needs no rain gear"
alt="Rain is unlikely, so {{%S}} does not need rain gear">
<condition rel="is going outside today" subject="%S" object="true"/>
<condition rel="has chance of rain" subject="%S" object="%RAIN"/>
<condition expression="(%RAIN is greater than or equal to 0) and (%RAIN
is less than 30)"
alt="The chance of rain is {{%RAIN}} percent, below 30 percent, so
rain is unlikely"/>
</relinst>
<!-- The wind rules below are marked top-down-strict: they check their
conditions strictly in order, so the wind question is only asked once
the rain band has matched. -->
<!-- REQ-06. Rain likely and calm enough for an umbrella. -->
<relinst type="should take" object="Umbrella" behaviour="top-down-strict"
cf="95"
name="REQ-06 going out with rain likely and calm wind take an umbrella"
alt="Rain is likely and it is calm enough for an umbrella, so {{%S}}
should take one">
<condition rel="is going outside today" subject="%S" object="true"/>
<condition rel="has chance of rain" subject="%S" object="%RAIN"/>
<condition expression="(%RAIN is greater than or equal to 60) and (%RAIN
is less than or equal to 100)"
alt="The chance of rain is {{%RAIN}} percent, 60 percent or more, so
rain is likely"/>
<condition rel="has wind speed" subject="%S" object="%WIND"/>
<condition expression="(%WIND is greater than or equal to 0) and (%WIND
is less than 25)"
alt="The wind is {{%WIND}} mph, under 25 mph, so an umbrella can be
used"/>
</relinst>
<!-- REQ-07. A chance of rain and calm: an umbrella just in case, with
less certainty. -->
<relinst type="should take" object="Umbrella" behaviour="top-down-strict"
cf="70"
name="REQ-07 going out with a chance of rain and calm wind take an
umbrella just in case"
alt="There is a chance of rain and it is calm enough for an umbrella, so
{{%S}} should take one just in case">
<condition rel="is going outside today" subject="%S" object="true"/>
<condition rel="has chance of rain" subject="%S" object="%RAIN"/>
<condition expression="(%RAIN is greater than or equal to 30) and (%RAIN
is less than 60)"
alt="The chance of rain is {{%RAIN}} percent, from 30 to under 60
percent, so there is a chance of rain"/>
<condition rel="has wind speed" subject="%S" object="%WIND"/>
<condition expression="(%WIND is greater than or equal to 0) and (%WIND
is less than 25)"
alt="The wind is {{%WIND}} mph, under 25 mph, so an umbrella can be
used"/>
</relinst>
<!-- REQ-08. The exception. Rain possible or likely but too windy for an
umbrella. -->
<relinst type="should take" object="Raincoat" behaviour="top-down-strict"
cf="90"
name="REQ-08 going out with rain possible and strong wind take a
raincoat instead of an umbrella"
alt="Rain is possible but it is too windy for an umbrella, so {{%S}}
should take a raincoat instead">
<condition rel="is going outside today" subject="%S" object="true"/>
<condition rel="has chance of rain" subject="%S" object="%RAIN"/>
<condition expression="(%RAIN is greater than or equal to 30) and (%RAIN
is less than or equal to 100)"
alt="The chance of rain is {{%RAIN}} percent, 30 percent or more, so
rain is possible"/>
<condition rel="has wind speed" subject="%S" object="%WIND"/>
<condition expression="%WIND is greater than or equal to 25"
alt="The wind is {{%WIND}} mph, 25 mph or more, too windy to use an
umbrella"/>
</relinst>
<!-- REQ-09. Rain possible or likely but the wind is unknown: an umbrella,
with lower certainty. -->
<relinst type="should take" object="Umbrella" behaviour="top-down-strict"
cf="60"
name="REQ-09 going out with rain possible and wind unknown take an
umbrella with less certainty"
alt="Rain is possible and the wind is not known, so {{%S}} should take
an umbrella, though it may be too windy to use">
<condition rel="is going outside today" subject="%S" object="true"/>
<condition rel="has chance of rain" subject="%S" object="%RAIN"/>
<condition expression="(%RAIN is greater than or equal to 30) and (%RAIN
is less than or equal to 100)"
alt="The chance of rain is {{%RAIN}} percent, 30 percent or more, so
rain is possible"/>
<condition
expression="countRelationshipInstances(%S,'has wind speed',*) is equal
to 0"
alt="The wind speed is not known, so it might be too windy for an
umbrella"/>
</relinst>Raelog Reasoner makes system 2 decision in milliseconds. Each with an auditable proof.
Raelog Reasoner is the engine. When you ask a question and inject the facts, it chains back from the goal through the model, solving each step once and touching only the rules and data the question requires. The answer comes back with its certainty and an evidence tree, in milliseconds, with no language model in the path. No black box, just deterministic inference over a model you own.
It starts from the goal
It takes the question, finds the rules that could answer it and works back through their conditions.
Compile once
A model is compiled once per version and shared read-only by every session.
Same in, same out
No part of the reasoning is generative, so the same facts and the same version of the model always give the same decision and the same evidence.
The tree comes with it
The evidence tree is a product of the inference process: every rule that fired, the facts it matched, and the evidence for those facts in turn, down to what was stated.
Targetted
When a model asks a person for missing data, the engine raises the question at the point the reasoning reaches it.