Documentation
¶
Overview ¶
Package builtin contains functions for evaluating built-in predicates.
Index ¶
- Variables
- func Decide(atom ast.Atom, subst *unionfind.UnionFind) (bool, []*unionfind.UnionFind, error)
- func DecideTemporalPredicate(atom ast.Atom, subst *unionfind.UnionFind) (bool, []*unionfind.UnionFind, error)
- func GetBuiltinFunctionType(sym ast.FunctionSym) (ast.BaseTerm, bool)
- func IsBuiltinFunction(sym ast.FunctionSym) bool
- func IsReducerFunction(sym ast.FunctionSym) bool
- func IsTemporalPredicate(pred ast.PredicateSym) bool
- type TypeChecker
Constants ¶
This section is empty.
Variables ¶
var ( // Predicates has all built-in predicates. Predicates = map[ast.PredicateSym]ast.Mode{ symbols.MatchPrefix: {ast.ArgModeInput, ast.ArgModeInput}, symbols.StartsWith: {ast.ArgModeInput, ast.ArgModeInput}, symbols.EndsWith: {ast.ArgModeInput, ast.ArgModeInput}, symbols.Contains: {ast.ArgModeInput, ast.ArgModeInput}, symbols.Filter: {ast.ArgModeInput}, symbols.Lt: {ast.ArgModeInput, ast.ArgModeInput}, symbols.Le: {ast.ArgModeInput, ast.ArgModeInput}, symbols.Gt: {ast.ArgModeInput, ast.ArgModeInput}, symbols.Ge: {ast.ArgModeInput, ast.ArgModeInput}, symbols.TimeLt: {ast.ArgModeInput, ast.ArgModeInput}, symbols.TimeLe: {ast.ArgModeInput, ast.ArgModeInput}, symbols.TimeGt: {ast.ArgModeInput, ast.ArgModeInput}, symbols.TimeGe: {ast.ArgModeInput, ast.ArgModeInput}, symbols.DurationLt: {ast.ArgModeInput, ast.ArgModeInput}, symbols.DurationLe: {ast.ArgModeInput, ast.ArgModeInput}, symbols.DurationGt: {ast.ArgModeInput, ast.ArgModeInput}, symbols.DurationGe: {ast.ArgModeInput, ast.ArgModeInput}, symbols.ListMember: {ast.ArgModeOutput, ast.ArgModeInput}, symbols.WithinDistance: {ast.ArgModeInput, ast.ArgModeInput, ast.ArgModeInput}, symbols.MatchPair: {ast.ArgModeInput, ast.ArgModeOutput, ast.ArgModeOutput}, symbols.MatchCons: {ast.ArgModeInput, ast.ArgModeOutput, ast.ArgModeOutput}, symbols.MatchNil: {ast.ArgModeInput}, symbols.MatchField: {ast.ArgModeInput, ast.ArgModeInput, ast.ArgModeOutput}, symbols.MatchEntry: {ast.ArgModeInput, ast.ArgModeInput, ast.ArgModeOutput}, symbols.IntervalBefore: {ast.ArgModeInput, ast.ArgModeInput}, symbols.IntervalAfter: {ast.ArgModeInput, ast.ArgModeInput}, symbols.IntervalMeets: {ast.ArgModeInput, ast.ArgModeInput}, symbols.IntervalOverlaps: {ast.ArgModeInput, ast.ArgModeInput}, symbols.IntervalDuring: {ast.ArgModeInput, ast.ArgModeInput}, symbols.IntervalContains: {ast.ArgModeInput, ast.ArgModeInput}, symbols.IntervalStarts: {ast.ArgModeInput, ast.ArgModeInput}, symbols.IntervalFinishes: {ast.ArgModeInput, ast.ArgModeInput}, symbols.IntervalEquals: {ast.ArgModeInput, ast.ArgModeInput}, } // Functions has all built-in functions. Functions = map[ast.FunctionSym]ast.BaseTerm{ symbols.Div: emptyType, symbols.FloatDiv: emptyType, symbols.FloatMult: emptyType, symbols.FloatPlus: emptyType, symbols.Mult: emptyType, symbols.Plus: emptyType, symbols.Minus: emptyType, symbols.Sqrt: emptyType, symbols.GroupBy: emptyType, symbols.ListGet: symbols.NewFunType(symbols.NewOptionType(varX), listOfX, ast.NumberBound), symbols.ListContains: symbols.NewFunType(symbols.BoolType(), listOfX, varX), symbols.Append: symbols.NewFunType(listOfX, listOfX, varX), symbols.Cons: symbols.NewFunType(listOfX, varX, listOfX), symbols.Len: symbols.NewFunType(ast.NumberBound, listOfX), symbols.Pair: symbols.NewFunType(symbols.NewPairType(varX, varY), varX, varY), symbols.Some: symbols.NewFunType(symbols.NewOptionType(varX), varX), symbols.StringConcatenate: symbols.NewFunType( ast.StringBound, ast.AnyBound), symbols.StringReplace: symbols.NewFunType( ast.StringBound, ast.StringBound), symbols.StructGet: symbols.NewFunType(ast.AnyBound, ast.AnyBound, ast.NameBound), symbols.NumberToString: symbols.NewFunType(ast.StringBound, ast.NumberBound), symbols.Float64ToString: symbols.NewFunType(ast.StringBound, ast.Float64Bound), symbols.NameToString: symbols.NewFunType(ast.StringBound, ast.NameBound), symbols.NameRoot: symbols.NewFunType(ast.NameBound, ast.NameBound), symbols.NameTip: symbols.NewFunType(ast.NameBound, ast.NameBound), symbols.NameList: symbols.NewFunType(symbols.NewListType(ast.NameBound), ast.NameBound), symbols.List: symbols.NewFunType(symbols.NewListType(varX), varX), symbols.Map: emptyType, symbols.Tuple: emptyType, symbols.Struct: emptyType, symbols.TimeNow: symbols.NewFunType(ast.TimeBound), symbols.TimeAdd: symbols.NewFunType(ast.TimeBound, ast.TimeBound, ast.DurationBound), symbols.TimeSub: symbols.NewFunType(ast.DurationBound, ast.TimeBound, ast.TimeBound), symbols.TimeFormat: symbols.NewFunType(ast.StringBound, ast.TimeBound, ast.NameBound), symbols.TimeFormatCivil: symbols.NewFunType(ast.StringBound, ast.TimeBound, ast.StringBound, ast.NameBound), symbols.TimeParseRFC3339: symbols.NewFunType(ast.TimeBound, ast.StringBound), symbols.TimeParseCivil: symbols.NewFunType(ast.TimeBound, ast.StringBound, ast.StringBound), symbols.TimeYear: symbols.NewFunType(ast.NumberBound, ast.TimeBound), symbols.TimeMonth: symbols.NewFunType(ast.NumberBound, ast.TimeBound), symbols.TimeDay: symbols.NewFunType(ast.NumberBound, ast.TimeBound), symbols.TimeHour: symbols.NewFunType(ast.NumberBound, ast.TimeBound), symbols.TimeMinute: symbols.NewFunType(ast.NumberBound, ast.TimeBound), symbols.TimeSecond: symbols.NewFunType(ast.NumberBound, ast.TimeBound), symbols.TimeFromUnixNanos: symbols.NewFunType(ast.TimeBound, ast.NumberBound), symbols.TimeToUnixNanos: symbols.NewFunType(ast.NumberBound, ast.TimeBound), symbols.TimeTrunc: symbols.NewFunType(ast.TimeBound, ast.TimeBound, ast.NameBound), symbols.DurationAdd: symbols.NewFunType(ast.DurationBound, ast.DurationBound, ast.DurationBound), symbols.DurationMult: symbols.NewFunType(ast.DurationBound, ast.DurationBound, ast.NumberBound), symbols.DurationHours: symbols.NewFunType(ast.Float64Bound, ast.DurationBound), symbols.DurationMinutes: symbols.NewFunType(ast.Float64Bound, ast.DurationBound), symbols.DurationSeconds: symbols.NewFunType(ast.Float64Bound, ast.DurationBound), symbols.DurationNanos: symbols.NewFunType(ast.NumberBound, ast.DurationBound), symbols.DurationFromNanos: symbols.NewFunType(ast.DurationBound, ast.NumberBound), symbols.DurationFromHours: symbols.NewFunType(ast.DurationBound, ast.Float64Bound), symbols.DurationFromMinutes: symbols.NewFunType(ast.DurationBound, ast.Float64Bound), symbols.DurationFromSeconds: symbols.NewFunType(ast.DurationBound, ast.Float64Bound), symbols.DurationParse: symbols.NewFunType(ast.DurationBound, ast.StringBound), symbols.IntervalStart: symbols.NewFunType(ast.TimeBound, symbols.NewPairType(ast.TimeBound, ast.TimeBound)), symbols.IntervalEnd: symbols.NewFunType(ast.TimeBound, symbols.NewPairType(ast.TimeBound, ast.TimeBound)), symbols.IntervalDuration: symbols.NewFunType(ast.DurationBound, symbols.NewPairType(ast.TimeBound, ast.TimeBound)), } // ReducerFunctions has those built-in functions with are reducers. ReducerFunctions = map[ast.FunctionSym]ast.BaseTerm{ symbols.Collect: symbols.NewFunType(listOfX, listOfX), symbols.CollectDistinct: symbols.NewFunType(listOfX, listOfX), symbols.CollectToMap: symbols.NewFunType(mapOfXY, varX, varY), symbols.PickAny: symbols.NewFunType(varX, listOfX), symbols.Max: symbols.NewFunType(ast.NumberBound, listOfNum), symbols.Min: symbols.NewFunType(ast.NumberBound, listOfNum), symbols.Sum: symbols.NewFunType(ast.NumberBound, listOfNum), symbols.FloatMax: symbols.NewFunType(ast.Float64Bound, listOfFloats), symbols.FloatMin: symbols.NewFunType(ast.Float64Bound, listOfFloats), symbols.FloatSum: symbols.NewFunType(ast.Float64Bound, listOfNumOrFloats), symbols.Count: symbols.NewFunType(ast.NumberBound, listOfX), symbols.Avg: symbols.NewFunType(ast.Float64Bound, listOfFloats), } )
Functions ¶
func Decide ¶
Decide evaluates an atom of a built-in predicate. The atom must no longer contain any apply-expressions or variables.
func DecideTemporalPredicate ¶
func DecideTemporalPredicate(atom ast.Atom, subst *unionfind.UnionFind) (bool, []*unionfind.UnionFind, error)
DecideTemporalPredicate evaluates temporal interval predicates. Returns (ok, substitions, error). If ok is false with no error, the predicate failed.
func GetBuiltinFunctionType ¶
func GetBuiltinFunctionType(sym ast.FunctionSym) (ast.BaseTerm, bool)
GetBuiltinFunctionType returns the type of a builtin function. The type may contain type variables.
func IsBuiltinFunction ¶
func IsBuiltinFunction(sym ast.FunctionSym) bool
IsBuiltinFunction returns true if sym is a builtin function.
func IsReducerFunction ¶
func IsReducerFunction(sym ast.FunctionSym) bool
IsReducerFunction returns true if sym is a reducer function.
func IsTemporalPredicate ¶
func IsTemporalPredicate(pred ast.PredicateSym) bool
IsTemporalPredicate returns true if the predicate is a temporal interval predicate.
Types ¶
type TypeChecker ¶
type TypeChecker struct {
// contains filtered or unexported fields
}
TypeChecker checks the type of constant (run-time type).
func NewTypeChecker ¶
func NewTypeChecker(decls map[ast.PredicateSym]ast.Decl) (*TypeChecker, error)
NewTypeChecker returns a new TypeChecker. The decls must be desugared so they only contain type bounds.
func NewTypeCheckerFromDesugared ¶
func NewTypeCheckerFromDesugared(decls map[ast.PredicateSym]*ast.Decl) *TypeChecker
NewTypeCheckerFromDesugared returns a new TypeChecker. The declarations must be in desugared form.
func (TypeChecker) CheckOneBoundDecl ¶
CheckOneBoundDecl checks whether a fact is consistent with a given type bounds tuple.
func (TypeChecker) CheckTypeBounds ¶
func (t TypeChecker) CheckTypeBounds(fact ast.Atom) error
CheckTypeBounds checks whether there fact is consistent with at least one of the bound decls.