gdp-wired 0.19.0 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,8 +6,14 @@ export declare const self: {
6
6
  };
7
7
  export declare const natural: "nat";
8
8
  export declare const boolean: "bool";
9
- type FieldSort = 'nat' | 'self';
10
- export type Sort = 'nat' | 'bool' | Data;
9
+ export declare const integer: "int";
10
+ export type FieldSort = 'nat' | 'int' | {
11
+ data: string;
12
+ };
13
+ export type Sort = 'nat' | 'bool' | 'int' | Data;
14
+ export declare const isDataField: (s: FieldSort) => s is {
15
+ data: string;
16
+ };
11
17
  export type Ctor = {
12
18
  name: string;
13
19
  fields: {
@@ -29,6 +35,35 @@ export type X = {
29
35
  op: 'mul';
30
36
  k: number;
31
37
  a: X;
38
+ } | {
39
+ op: 'prod';
40
+ a: X;
41
+ b: X;
42
+ } | {
43
+ op: 'mod' | 'div';
44
+ k: number;
45
+ a: X;
46
+ } | {
47
+ op: 'int';
48
+ value: number;
49
+ } | {
50
+ op: 'iadd' | 'isub';
51
+ a: X;
52
+ b: X;
53
+ } | {
54
+ op: 'ineg';
55
+ a: X;
56
+ } | {
57
+ op: 'imul';
58
+ k: number;
59
+ a: X;
60
+ } | {
61
+ op: 'ofnat';
62
+ a: X;
63
+ } | {
64
+ op: 'imod' | 'idiv';
65
+ k: number;
66
+ a: X;
32
67
  } | {
33
68
  op: 'if';
34
69
  c: Y;
@@ -51,6 +86,12 @@ export type X = {
51
86
  binds: string[];
52
87
  body: X;
53
88
  }[];
89
+ } | {
90
+ op: 'natmatch';
91
+ of: X;
92
+ zero: X;
93
+ pred: string;
94
+ succ: X;
54
95
  } | {
55
96
  op: 'apply';
56
97
  param: string;
@@ -58,11 +99,19 @@ export type X = {
58
99
  } | {
59
100
  op: 'bool';
60
101
  c: Y;
102
+ } | {
103
+ op: 'size';
104
+ data: string;
105
+ of: X;
61
106
  };
62
107
  export type Y = {
63
108
  op: '<' | '<=' | '=';
64
109
  a: X;
65
110
  b: X;
111
+ } | {
112
+ op: 'i<' | 'i<=';
113
+ a: X;
114
+ b: X;
66
115
  } | {
67
116
  op: 'and' | 'or';
68
117
  xs: Y[];
@@ -78,20 +127,48 @@ export type Y = {
78
127
  op: 'holds';
79
128
  x: X;
80
129
  };
130
+ export declare const bindName: (field: string) => string;
81
131
  export declare class Nat {
82
132
  readonly x: X;
83
133
  constructor(x: X);
84
134
  plus(b: NatLike): Nat;
85
135
  minus(b: NatLike): Nat;
86
136
  times(k: number): Nat;
137
+ mul(b: NatLike): Nat;
138
+ modBy(k: number): Nat;
139
+ divBy(k: number): Nat;
140
+ toInt(): Integer;
87
141
  lt(b: NatLike): Bool;
88
142
  atMost(b: NatLike): Bool;
89
143
  gt(b: NatLike): Bool;
90
144
  atLeast(b: NatLike): Bool;
91
145
  eq(b: NatLike): Bool;
92
146
  ne(b: NatLike): Bool;
147
+ match(cases: {
148
+ zero: () => Nat | Bool | Val | Integer | number;
149
+ succ: (f: {
150
+ pred: Nat;
151
+ }) => Nat | Bool | Val | Integer | number;
152
+ }): any;
93
153
  }
94
154
  export type NatLike = Nat | number;
155
+ export declare class Integer {
156
+ readonly x: X;
157
+ constructor(x: X);
158
+ plus(b: IntegerLike): Integer;
159
+ minus(b: IntegerLike): Integer;
160
+ negate(): Integer;
161
+ times(k: number): Integer;
162
+ modBy(k: number): Integer;
163
+ divBy(k: number): Integer;
164
+ lt(b: IntegerLike): Bool;
165
+ atMost(b: IntegerLike): Bool;
166
+ gt(b: IntegerLike): Bool;
167
+ atLeast(b: IntegerLike): Bool;
168
+ eq(b: IntegerLike): Bool;
169
+ ne(b: IntegerLike): Bool;
170
+ }
171
+ export type IntegerLike = Integer | number;
95
172
  export declare class Bool {
96
173
  readonly y: Y;
97
174
  constructor(y: Y);
@@ -107,26 +184,40 @@ export declare class Val {
107
184
  readonly data: Data;
108
185
  readonly x: X;
109
186
  constructor(data: Data, x: X);
110
- match(cases: Record<string, (fields: Record<string, any>) => Nat | Bool | Val | number>): any;
187
+ match(cases: Record<string, (fields: Record<string, any>) => Nat | Bool | Val | Integer | number>): any;
111
188
  is(ctor: string): Bool;
189
+ size(): Nat;
112
190
  eq(b: Val): Bool;
113
191
  ne(b: Val): Bool;
114
192
  }
115
- export declare const wrap: (s: Sort, x: X) => Nat | Bool | Val;
116
- export declare function when<T extends Nat | Val | Bool | number>(c: Bool, a: T, b: T): T extends number ? Nat : T;
193
+ export declare const wrap: (s: Sort, x: X) => Nat | Bool | Val | Integer;
194
+ export declare function when<T extends Nat | Val | Bool | Integer | number>(c: Bool, a: T, b: T): T extends number ? Nat : T;
195
+ export declare const dataNamed: (name: string) => Data;
196
+ export declare const fieldSort: (f: {
197
+ sort: FieldSort;
198
+ }) => Sort;
199
+ export declare const inGroup: (d: Data, f: {
200
+ sort: FieldSort;
201
+ }) => boolean;
117
202
  export declare class Data {
118
203
  readonly name: string;
204
+ readonly group: string[];
119
205
  readonly ctors: Ctor[];
120
- constructor(name: string, decl: Record<string, Record<string, typeof self | 'nat' | {
121
- nat: true;
122
- }>>);
206
+ readonly seq: number;
207
+ constructor(name: string, decl: Record<string, Record<string, FieldSort>>, group?: string[]);
123
208
  index(ctor: string): number;
124
209
  get nullary(): number;
125
- make(ctor: string, ...args: (Val | NatLike)[]): Val;
210
+ make(ctor: string, ...args: (Val | NatLike | Integer)[]): Val;
211
+ ctorHeight(c: Ctor): number;
212
+ get height(): number;
126
213
  }
214
+ export declare function weakOrder(ds: Data[]): Map<string, number>;
127
215
  type Decl = Record<string, Record<string, unknown>>;
128
216
  export declare function data<const D extends Decl>(name: string, decl: D): Data & {
129
- [c in keyof D]: keyof D[c] extends never ? Val : (...args: (Val | NatLike)[]) => Val;
217
+ [c in keyof D]: keyof D[c] extends never ? Val : (...args: (Val | NatLike | Integer)[]) => Val;
218
+ };
219
+ export declare function mutual<const G extends Record<string, Decl>>(decls: G): {
220
+ [n in keyof G]: Data & Record<string, any>;
130
221
  };
131
222
  export type Fn = {
132
223
  name: string;
@@ -136,16 +227,44 @@ export type Fn = {
136
227
  }[];
137
228
  ret: Sort;
138
229
  body: () => X;
139
- decreases?: number;
230
+ readonly decreases?: number;
231
+ readonly ring: string[];
140
232
  paramFns: string[];
233
+ readonly measure?: Measure;
234
+ readonly termination?: Termination;
235
+ stated?: Measure;
141
236
  };
142
- export type Callable = ((...args: (Val | NatLike | Bool)[]) => any) & {
237
+ export type Callable = ((...args: (Val | NatLike | Bool | Integer)[]) => any) & {
143
238
  fn: Fn;
144
239
  };
145
- export declare function define(name: string, params: Record<string, Sort>, ret: Sort, body: (args: Record<string, any>) => Nat | Bool | Val | number): Callable;
240
+ export declare function define(name: string, params: Record<string, Sort>, ret: Sort, body: (args: Record<string, any>) => Nat | Bool | Val | Integer | number, opts?: {
241
+ measure?: (string | string[])[];
242
+ }): Callable;
146
243
  export declare const fnParam: (name: string) => ((x: NatLike) => Nat) & {
147
244
  param: string;
148
245
  };
246
+ export type Measure = {
247
+ comps: {
248
+ coef: number[];
249
+ c: number;
250
+ }[];
251
+ };
252
+ export type Termination = {
253
+ measure: Measure;
254
+ text: string;
255
+ obligations: {
256
+ law: DataLaw;
257
+ proof?: CyclicVerdict;
258
+ scheme?: string;
259
+ lemmas: string[];
260
+ }[];
261
+ ms: number;
262
+ };
263
+ export declare const terminationMs: {
264
+ ms: number;
265
+ };
266
+ export declare const showMeasure: (f: Pick<Fn, "params">, m: Measure) => string;
267
+ export declare function measureX(f: Pick<Fn, 'params'>, c: Measure['comps'][number], args: X[]): X;
149
268
  export type DataLaw = {
150
269
  name: string;
151
270
  vars: {
@@ -161,8 +280,16 @@ export type Value = number | {
161
280
  f: Value[];
162
281
  };
163
282
  type Env = Map<string, Value>;
164
- export declare function evalX(x: X, env: Env, params: Record<string, (n: number) => number>): Value;
165
- export declare function evalY(y: Y, env: Env, params: Record<string, (n: number) => number>): boolean;
283
+ export declare const fnNamed: (name: string) => Fn | undefined;
284
+ export declare class EvalLimit extends RangeError {
285
+ }
286
+ export declare const evalBounds: {
287
+ on: boolean;
288
+ depth: number;
289
+ calls: number;
290
+ };
291
+ export declare function evalX(x: X, env: Env, params: Record<string, (n: number) => number>, d?: number): Value;
292
+ export declare function evalY(y: Y, env: Env, params: Record<string, (n: number) => number>, d?: number): boolean;
166
293
  export declare const showValue: (d: Sort, v: Value) => string;
167
294
  type Rand = () => number;
168
295
  export declare const rng: (seed: number) => Rand;
@@ -177,6 +304,7 @@ export declare function samples(vars: {
177
304
  sort: Sort;
178
305
  }[], paramNames: string[], n: number, seed?: number): Sample[];
179
306
  export declare const keyOf: (args: E[]) => E;
307
+ export declare function argsOf(key: E, n: number): E[] | undefined;
180
308
  export declare const tagMap: (d: string) => string, sizeMap: (d: string) => string;
181
309
  export declare const fieldMap: (d: Data, j: number, i: number) => string;
182
310
  export declare const ctorMap: (d: Data, j: number) => string;
@@ -184,8 +312,14 @@ export type Program = {
184
312
  datas: Data[];
185
313
  fns: Fn[];
186
314
  params: string[];
315
+ divisors: number[];
316
+ ints: boolean;
187
317
  };
188
318
  export declare function programOf(laws: DataLaw[], extra?: Fn[]): Program;
319
+ export declare const divMap: (k: number) => string, modMap: (k: number) => string;
320
+ export declare const zig: (z: number) => number;
321
+ export declare const unzig: (c: number) => number;
322
+ export declare const posMap = "int$pos", negMap = "int$neg";
189
323
  export declare function encX(p: Program, x: X, env: Map<string, E>): E;
190
324
  export declare function encY(p: Program, y: Y, env: Map<string, E>): C;
191
325
  export type Facts = {
@@ -236,6 +370,7 @@ export type DataVerdict = {
236
370
  tried: number;
237
371
  program?: Program;
238
372
  node?: number;
373
+ through?: string[];
239
374
  };
240
375
  export type Options = {
241
376
  samples?: number;
@@ -245,14 +380,60 @@ export type Options = {
245
380
  induction?: boolean;
246
381
  seed?: number;
247
382
  patience?: number;
383
+ transfer?: boolean;
248
384
  };
249
385
  export declare function refute(l: DataLaw, n?: number, seed?: number): Record<string, string> | undefined;
386
+ type SchemeUse = {
387
+ subst: Record<string, E>;
388
+ guard: C;
389
+ member?: number;
390
+ };
391
+ type Scheme = {
392
+ name: string;
393
+ on?: {
394
+ v: string;
395
+ d: Data | 'nat';
396
+ };
397
+ uses: SchemeUse[];
398
+ companions?: Companion[];
399
+ rank?: E[];
400
+ shapes?: E[];
401
+ };
402
+ type Companion = {
403
+ law: DataLaw;
404
+ on: {
405
+ v: string;
406
+ d: Data;
407
+ };
408
+ uses: SchemeUse[];
409
+ };
410
+ export declare const schemesOf: (p: Program, l: DataLaw) => Scheme[];
411
+ export type Proven = {
412
+ law: DataLaw;
413
+ spec: NodeSpec;
414
+ nodes: NodeSpec[];
415
+ };
250
416
  export declare const attemptMs: {
251
417
  ms: number;
252
418
  };
419
+ export declare const lemmaCaps: {
420
+ perLemma: number;
421
+ total: number;
422
+ perCase: number;
423
+ };
253
424
  export declare function conjectures(p: Program, l: DataLaw, max?: number, maxSize?: number): DataLaw[];
254
425
  export declare const showX: (x: X) => string;
255
426
  export declare const showY: (y: Y) => string;
256
427
  export declare function proveData(l: DataLaw, opts?: Options): DataVerdict;
428
+ export type SearchCtx = {
429
+ p: Program;
430
+ fs: Facts;
431
+ base: Proven[];
432
+ level: number;
433
+ };
434
+ export declare function searchIn(l: DataLaw, opts: Options, until: number, ctx?: SearchCtx, phase?: 'all' | 'first' | 'rest'): {
435
+ verdict: DataVerdict;
436
+ out?: Proven;
437
+ };
257
438
  export declare const proveDataToday: (l: DataLaw) => DataVerdict;
258
439
  export {};