1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
;;; Copyright (c) 2026 Nicholas Vermeulen
;;; SPDX-License-Identifier: AGPL-3.0-or-later
;; synth-test.lisp — golden test for synth.lisp (sketch-based synthesis).
;; Deterministic: enumeration order is fixed, no randomness, no LLM.
;; ── Warm-up: synthesize max from a one-hole sketch ───────────────────────
;; ── abs: two interacting holes ───────────────────────────────────────────
;; ── The deliverable: sorting algorithms from spec ────────────────────────
;; Insertion sort: holes for the base case and the comparison. Wrong
;; fillings enumerate first — the tried/cexs counts show CEGIS working.
;; Quicksort: two partition holes; only complementary predicates keep every
;; element (perm? kills the rest — e.g. lo=<, hi=> drops duplicates of the
;; pivot, which is exactly what the (7 7 7) test list is there to catch).
;; ── The synthesized sorts actually sort ──────────────────────────────────
;; ── Proposer-driven loop (the LLM seat, scripted — no demos, no server) ──
;; Attempt 1 proposes a wrong comparison; the rejection (with its
;; counterexample) comes back as feedback; attempt 2 corrects it.
;; A failing proposer must exhaust attempts, not crash
;; ── The LLM-reply extractor, on canned prose (no server needed) ─────────
;; Models reason out loud and echo the sketch; the extractor must skip
;; every non-bindings sexp and keep the LAST valid bindings alist.