import { Expression, Metadata, Type } from "../ir"; import { State } from "../vm"; import { Effect } from "./effect"; import { Tree } from "./tree"; import { Pattern, UnificationEnvironment } from "./unification"; export declare abstract class Predicate { abstract search(state: State, env: UnificationEnvironment): UnificationEnvironment[]; } export declare class ConstrainedPredicate extends Predicate { readonly predicate: Predicate; readonly constraint: Expression; constructor(predicate: Predicate, constraint: Expression); search(state: State, env: UnificationEnvironment): UnificationEnvironment[]; } export declare class AndPredicate extends Predicate { readonly left: Predicate; readonly right: Predicate; constructor(left: Predicate, right: Predicate); search(state: State, env: UnificationEnvironment): UnificationEnvironment[]; } export declare class OrPredicate extends Predicate { readonly left: Predicate; readonly right: Predicate; constructor(left: Predicate, right: Predicate); search(state: State, env: UnificationEnvironment): UnificationEnvironment[]; } export declare class HasRelation extends Predicate { readonly name: string; readonly patterns: Pattern[]; constructor(name: string, patterns: Pattern[]); search(state: State, env: UnificationEnvironment): UnificationEnvironment[]; } export declare class NotPredicate extends Predicate { readonly predicate: Predicate; constructor(predicate: Predicate); search(state: State, env: UnificationEnvironment): UnificationEnvironment[]; } export declare class AlwaysPredicate extends Predicate { search(state: State, env: UnificationEnvironment): UnificationEnvironment[]; } export declare class LetPredicate extends Predicate { readonly name: string; readonly expr: Expression; constructor(name: string, expr: Expression); search(state: State, env: UnificationEnvironment): UnificationEnvironment[]; } export declare class TypePredicate extends Predicate { readonly name: string; readonly type: Type; constructor(name: string, type: Type); search(state: State, env: UnificationEnvironment): UnificationEnvironment[]; } export declare class SamplePredicate extends Predicate { readonly size: number; readonly pool: SamplingPool; constructor(size: number, pool: SamplingPool); search(state: State, env: UnificationEnvironment): UnificationEnvironment[]; } export declare abstract class SamplingPool { abstract sample(size: number, state: State, env: UnificationEnvironment): UnificationEnvironment[]; } export declare class SamplingRelation extends SamplingPool { readonly name: string; readonly patterns: Pattern[]; constructor(name: string, patterns: Pattern[]); sample(size: number, state: State, env: UnificationEnvironment): UnificationEnvironment[]; } export declare class SamplingType extends SamplingPool { readonly name: string; readonly type: Type; constructor(name: string, type: Type); sample(size: number, state: State, env: UnificationEnvironment): UnificationEnvironment[]; } export declare abstract class MappedRelation { abstract search(state: State, env: UnificationEnvironment, patterns: Pattern[]): UnificationEnvironment[]; sample(size: number, state: State, env: UnificationEnvironment, patterns: Pattern[]): UnificationEnvironment[]; } export declare class ConcreteRelation extends MappedRelation { readonly meta: Metadata; readonly name: string; readonly tree: Tree; constructor(meta: Metadata, name: string, tree: Tree); search(state: State, env: UnificationEnvironment, patterns: Pattern[]): UnificationEnvironment[]; sample(size: number, state: State, env: UnificationEnvironment, patterns: Pattern[]): UnificationEnvironment[]; } export declare type FunctionRelationFn = (state: State, env: UnificationEnvironment, patterns: Pattern[]) => UnificationEnvironment[]; export declare class FunctionRelation extends MappedRelation { readonly name: string; readonly code: FunctionRelationFn; constructor(name: string, code: FunctionRelationFn); search(state: State, env: UnificationEnvironment, patterns: Pattern[]): UnificationEnvironment[]; } export declare class PredicateProcedure extends MappedRelation { readonly name: string; readonly parameters: string[]; readonly clauses: PredicateClause[]; readonly metadata: Metadata; constructor(name: string, parameters: string[], clauses: PredicateClause[]); set_metadata(metadata: Metadata): void; search(state: State, env: UnificationEnvironment, patterns: Pattern[]): UnificationEnvironment[]; } export declare class PredicateClause { readonly predicate: Predicate; readonly effect: Effect; constructor(predicate: Predicate, effect: Effect); evaluate(state: State, env: UnificationEnvironment, bindings: [string, Pattern][]): UnificationEnvironment[]; }