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.
- package/README.md +37 -6
- package/dist/core/cycles.d.ts +35 -2
- package/dist/core/cycles.js +458 -51
- package/dist/core/cyclic.d.ts +18 -4
- package/dist/core/cyclic.js +319 -263
- package/dist/core/data.d.ts +196 -15
- package/dist/core/data.js +1284 -213
- package/dist/core/discover.js +54 -33
- package/dist/core/dsl.d.ts +31 -3
- package/dist/core/dsl.js +168 -38
- package/dist/core/exists.d.ts +26 -0
- package/dist/core/exists.js +625 -0
- package/dist/core/infer.d.ts +13 -0
- package/dist/core/infer.js +258 -41
- package/dist/core/machine.d.ts +27 -0
- package/dist/core/machine.js +45 -0
- package/dist/core/solver.d.ts +3 -0
- package/dist/core/solver.js +5 -0
- package/dist/core/transfer.d.ts +17 -0
- package/dist/core/transfer.js +468 -0
- package/dist/core/translate.js +10 -4
- package/dist/core/watch.js +5 -1
- package/dist/kernel/prove.d.ts +8 -1
- package/dist/kernel/prove.js +106 -55
- package/dist/lean-kernel/emit.d.ts +4 -1
- package/dist/lean-kernel/emit.js +336 -69
- package/dist/lean-kernel/library.js +2 -2
- package/package.json +2 -2
package/dist/core/data.d.ts
CHANGED
|
@@ -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
|
-
|
|
10
|
-
export type
|
|
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
|
-
|
|
121
|
-
|
|
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
|
|
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
|
|
165
|
-
export declare
|
|
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 {};
|