Skip to content

Commit 1430d42

Browse files
committed
Sequence functions (mostly tested)
1 parent dc132ba commit 1430d42

6 files changed

Lines changed: 72 additions & 2 deletions

File tree

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
(declare-term-types
2+
((Start 0))
3+
((($main))))
4+
5+
(define-funs-rec
6+
((Start.Sem ((Start_term_0 Start) (rq (Seq Int)) (x (_ BitVec 32))) Bool))
7+
8+
((match Start_term_0
9+
((($main)
10+
(exists ((rb (Seq String)) (ra (Seq String)))
11+
(and (= "Test" (seq.nth rb 7))
12+
(= rb (seq.++ ra (seq.unit "a")))
13+
(= rb (as seq.empty (Seq String)))
14+
(= rq (seq.rev rq)))))))))
15+
16+
17+
(synth-fun MyFunc () Start)
18+
19+
20+
(constraint (exists ((rq (Seq Int)) (y (_ BitVec 32))) (Start.Sem MyFunc rq y)))
21+
22+
(check-synth)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
--format
2+
json
3+
--mode
4+
batch
5+
--
6+
data/sequences.sem
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
[
2+
{"name":"Start","$event":"declare-term-type","$type":"semgus"},
3+
{"name":"Start","constructors":[{"name":"$main","children":[]}],"$event":"define-term-type","$type":"semgus"},
4+
{"name":"Start.Sem","rank":{"argumentSorts":["Start",{"kind":"Seq","params":["Int"]},["BitVec",32]],"returnSort":"Bool"},"$event":"declare-function","$type":"smt"},
5+
{"name":"Start.Sem","rank":{"argumentSorts":["Start",{"kind":"Seq","params":["Int"]},["BitVec",32]],"returnSort":"Bool"},"definition":{"arguments":["Start_term_0","rq","x"],"body":{"term":{"name":"Start_term_0","sort":"Start","$termType":"variable"},"binders":[{"operator":"$main","arguments":[],"child":{"bindings":[{"name":"rb","sort":{"kind":"Seq","params":["String"]},"$termType":"variable"},{"name":"ra","sort":{"kind":"Seq","params":["String"]},"$termType":"variable"}],"child":{"name":"and","returnSort":"Bool","argumentSorts":["Bool","Bool","Bool","Bool"],"arguments":[{"name":"=","returnSort":"Bool","argumentSorts":["String","String"],"arguments":["Test",{"name":"seq.nth","returnSort":"String","argumentSorts":[{"kind":"Seq","params":["String"]},"Int"],"arguments":[{"name":"rb","sort":{"kind":"Seq","params":["String"]},"$termType":"variable"},7],"$termType":"application"}],"$termType":"application"},{"name":"=","returnSort":"Bool","argumentSorts":[{"kind":"Seq","params":["String"]},{"kind":"Seq","params":["String"]}],"arguments":[{"name":"rb","sort":{"kind":"Seq","params":["String"]},"$termType":"variable"},{"name":"seq.++","returnSort":{"kind":"Seq","params":["String"]},"argumentSorts":[{"kind":"Seq","params":["String"]},{"kind":"Seq","params":["String"]}],"arguments":[{"name":"ra","sort":{"kind":"Seq","params":["String"]},"$termType":"variable"},{"name":"seq.unit","returnSort":{"kind":"Seq","params":["String"]},"argumentSorts":["String"],"arguments":["a"],"$termType":"application"}],"$termType":"application"}],"$termType":"application"},{"name":"=","returnSort":"Bool","argumentSorts":[{"kind":"Seq","params":["String"]},{"kind":"Seq","params":["String"]}],"arguments":[{"name":"rb","sort":{"kind":"Seq","params":["String"]},"$termType":"variable"},{"name":"seq.empty","returnSort":{"kind":"Seq","params":["String"]},"argumentSorts":[],"arguments":[],"$termType":"application"}],"$termType":"application"},{"name":"=","returnSort":"Bool","argumentSorts":[{"kind":"Seq","params":["Int"]},{"kind":"Seq","params":["Int"]}],"arguments":[{"name":"rq","sort":{"kind":"Seq","params":["Int"]},"$termType":"variable"},{"name":"seq.rev","returnSort":{"kind":"Seq","params":["Int"]},"argumentSorts":[{"kind":"Seq","params":["Int"]}],"arguments":[{"name":"rq","sort":{"kind":"Seq","params":["Int"]},"$termType":"variable"}],"$termType":"application"}],"$termType":"application"}],"$termType":"application"},"$termType":"exists"},"$termType":"binder"}],"$termType":"match"},"$termType":"lambda"},"$event":"define-function","$type":"smt"},
6+
{"id":"_CHC-$main-1","head":{"name":"Start.Sem","signature":["Start",{"kind":"Seq","params":["Int"]},["BitVec",32]],"arguments":["Start_term_0","rq","x"]},"bodyRelations":[],"inputVariables":null,"outputVariables":null,"variables":["Start_term_0","rq","x","rb","ra"],"constraint":{"name":"and","returnSort":"Bool","argumentSorts":["Bool","Bool","Bool","Bool"],"arguments":[{"name":"=","returnSort":"Bool","argumentSorts":["String","String"],"arguments":["Test",{"name":"seq.nth","returnSort":"String","argumentSorts":[{"kind":"Seq","params":["String"]},"Int"],"arguments":[{"name":"rb","sort":{"kind":"Seq","params":["String"]},"$termType":"variable"},7],"$termType":"application"}],"$termType":"application"},{"name":"=","returnSort":"Bool","argumentSorts":[{"kind":"Seq","params":["String"]},{"kind":"Seq","params":["String"]}],"arguments":[{"name":"rb","sort":{"kind":"Seq","params":["String"]},"$termType":"variable"},{"name":"seq.++","returnSort":{"kind":"Seq","params":["String"]},"argumentSorts":[{"kind":"Seq","params":["String"]},{"kind":"Seq","params":["String"]}],"arguments":[{"name":"ra","sort":{"kind":"Seq","params":["String"]},"$termType":"variable"},{"name":"seq.unit","returnSort":{"kind":"Seq","params":["String"]},"argumentSorts":["String"],"arguments":["a"],"$termType":"application"}],"$termType":"application"}],"$termType":"application"},{"name":"=","returnSort":"Bool","argumentSorts":[{"kind":"Seq","params":["String"]},{"kind":"Seq","params":["String"]}],"arguments":[{"name":"rb","sort":{"kind":"Seq","params":["String"]},"$termType":"variable"},{"name":"seq.empty","returnSort":{"kind":"Seq","params":["String"]},"argumentSorts":[],"arguments":[],"$termType":"application"}],"$termType":"application"},{"name":"=","returnSort":"Bool","argumentSorts":[{"kind":"Seq","params":["Int"]},{"kind":"Seq","params":["Int"]}],"arguments":[{"name":"rq","sort":{"kind":"Seq","params":["Int"]},"$termType":"variable"},{"name":"seq.rev","returnSort":{"kind":"Seq","params":["Int"]},"argumentSorts":[{"kind":"Seq","params":["Int"]}],"arguments":[{"name":"rq","sort":{"kind":"Seq","params":["Int"]},"$termType":"variable"}],"$termType":"application"}],"$termType":"application"}],"$termType":"application"},"constructor":{"name":"$main","arguments":[],"argumentSorts":[],"returnSort":"Start"},"symbols":{"inputs":[],"outputs":[],"term":{"id":"Start_term_0","sort":"Start","index":0},"unclassified":[{"id":"rq","sort":{"kind":"Seq","params":["Int"]},"index":1},{"id":"x","sort":["BitVec",32],"index":2}],"auxiliary":[{"id":"rb","sort":{"kind":"Seq","params":["String"]},"index":null},{"id":"ra","sort":{"kind":"Seq","params":["String"]},"index":null}],"children":[]},"$event":"chc","$type":"semgus"},
7+
{"name":"MyFunc","termType":"Start","grammar":{"nonTerminals":[{"name":"@Start__agtt","termType":"Start"}],"productions":[{"instance":"@Start__agtt","operator":"$main","occurrences":[]}]},"$event":"synth-fun","$type":"semgus"},
8+
{"constraint":{"bindings":[{"name":"rq","sort":{"kind":"Seq","params":["Int"]},"$termType":"variable"},{"name":"y","sort":["BitVec",32],"$termType":"variable"}],"child":{"name":"Start.Sem","returnSort":"Bool","argumentSorts":["Start",{"kind":"Seq","params":["Int"]},["BitVec",32]],"arguments":[{"name":"MyFunc","returnSort":"Start","argumentSorts":[],"arguments":[],"$termType":"application"},{"name":"rq","sort":{"kind":"Seq","params":["Int"]},"$termType":"variable"},{"name":"y","sort":["BitVec",32],"$termType":"variable"}],"$termType":"application"},"$termType":"exists"},"$event":"constraint","$type":"semgus"},
9+
{"$event":"check-synth","$type":"semgus"},
10+
{"$type":"meta","$event":"end-of-stream"}
11+
]
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
--format
2+
sexpr
3+
--
4+
data/sequences.sem
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2+
(declare-term-types (sort (identifier "Start")))
3+
(add-constructor (sort (identifier "Start")) :operator (identifier "$main") :children (list))
4+
(declare-function (identifier "Start.Sem") :rank (rank :argument-sorts (list (sort (identifier "Start")) (sort (identifier "Seq") (sort (identifier "Int"))) (sort (identifier "BitVec" 32))) :return-sort (sort (identifier "Bool"))))
5+
(define-function (identifier "Start.Sem") :rank (rank :argument-sorts (list (sort (identifier "Start")) (sort (identifier "Seq") (sort (identifier "Int"))) (sort (identifier "BitVec" 32))) :return-sort (sort (identifier "Bool"))) :definition (term (lambda :arguments (list (identifier "Start_term_0") (identifier "rq") (identifier "x")) :body (match :term (variable (identifier "Start_term_0") :sort (sort (identifier "Start"))) :binders (list (binder :operator (identifier "$main") :arguments (list) :child (exists :bindings (list (identifier "rb") (identifier "ra")) :binding-sorts (list (sort (identifier "Seq") (sort (identifier "String"))) (sort (identifier "Seq") (sort (identifier "String")))) :child (application (identifier "and") :argument-sorts (list (sort (identifier "Bool")) (sort (identifier "Bool")) (sort (identifier "Bool")) (sort (identifier "Bool"))) :arguments (list (application (identifier "=") :argument-sorts (list (sort (identifier "String")) (sort (identifier "String"))) :arguments (list "Test" (application (identifier "seq.nth") :argument-sorts (list (sort (identifier "Seq") (sort (identifier "String"))) (sort (identifier "Int"))) :arguments (list (variable (identifier "rb") :sort (sort (identifier "Seq") (sort (identifier "String")))) 7) :return-sort (sort (identifier "String")))) :return-sort (sort (identifier "Bool"))) (application (identifier "=") :argument-sorts (list (sort (identifier "Seq") (sort (identifier "String"))) (sort (identifier "Seq") (sort (identifier "String")))) :arguments (list (variable (identifier "rb") :sort (sort (identifier "Seq") (sort (identifier "String")))) (application (identifier "seq.++") :argument-sorts (list (sort (identifier "Seq") (sort (identifier "String"))) (sort (identifier "Seq") (sort (identifier "String")))) :arguments (list (variable (identifier "ra") :sort (sort (identifier "Seq") (sort (identifier "String")))) (application (identifier "seq.unit") :argument-sorts (list (sort (identifier "String"))) :arguments (list "a") :return-sort (sort (identifier "Seq") (sort (identifier "String"))))) :return-sort (sort (identifier "Seq") (sort (identifier "String"))))) :return-sort (sort (identifier "Bool"))) (application (identifier "=") :argument-sorts (list (sort (identifier "Seq") (sort (identifier "String"))) (sort (identifier "Seq") (sort (identifier "String")))) :arguments (list (variable (identifier "rb") :sort (sort (identifier "Seq") (sort (identifier "String")))) (application (identifier "seq.empty") :argument-sorts (list) :arguments (list) :return-sort (sort (identifier "Seq") (sort (identifier "String"))))) :return-sort (sort (identifier "Bool"))) (application (identifier "=") :argument-sorts (list (sort (identifier "Seq") (sort (identifier "Int"))) (sort (identifier "Seq") (sort (identifier "Int")))) :arguments (list (variable (identifier "rq") :sort (sort (identifier "Seq") (sort (identifier "Int")))) (application (identifier "seq.rev") :argument-sorts (list (sort (identifier "Seq") (sort (identifier "Int")))) :arguments (list (variable (identifier "rq") :sort (sort (identifier "Seq") (sort (identifier "Int"))))) :return-sort (sort (identifier "Seq") (sort (identifier "Int"))))) :return-sort (sort (identifier "Bool")))) :return-sort (sort (identifier "Bool"))))))))))
6+
(chc :id (identifier "_CHC-$main-1") :head (relation (identifier "Start.Sem") :signature (list (sort (identifier "Start")) (sort (identifier "Seq") (sort (identifier "Int"))) (sort (identifier "BitVec" 32))) :arguments (list (identifier "Start_term_0") (identifier "rq") (identifier "x"))) :body (list) :variables (list (identifier "Start_term_0") (identifier "rq") (identifier "x") (identifier "rb") (identifier "ra")) :symbols (symbol-table :term (symbol-entry (identifier "Start_term_0") :sort (sort (identifier "Start")) :index 0) :inputs (list) :outputs (list) :auxiliary (list (symbol-entry (identifier "rb") :sort (sort (identifier "Seq") (sort (identifier "String")))) (symbol-entry (identifier "ra") :sort (sort (identifier "Seq") (sort (identifier "String"))))) :children (list) :unclassified (list (symbol-entry (identifier "rq") :sort (sort (identifier "Seq") (sort (identifier "Int"))) :index 1) (symbol-entry (identifier "x") :sort (sort (identifier "BitVec" 32)) :index 2))) :constraint (term (application (identifier "and") :argument-sorts (list (sort (identifier "Bool")) (sort (identifier "Bool")) (sort (identifier "Bool")) (sort (identifier "Bool"))) :arguments (list (application (identifier "=") :argument-sorts (list (sort (identifier "String")) (sort (identifier "String"))) :arguments (list "Test" (application (identifier "seq.nth") :argument-sorts (list (sort (identifier "Seq") (sort (identifier "String"))) (sort (identifier "Int"))) :arguments (list (variable (identifier "rb") :sort (sort (identifier "Seq") (sort (identifier "String")))) 7) :return-sort (sort (identifier "String")))) :return-sort (sort (identifier "Bool"))) (application (identifier "=") :argument-sorts (list (sort (identifier "Seq") (sort (identifier "String"))) (sort (identifier "Seq") (sort (identifier "String")))) :arguments (list (variable (identifier "rb") :sort (sort (identifier "Seq") (sort (identifier "String")))) (application (identifier "seq.++") :argument-sorts (list (sort (identifier "Seq") (sort (identifier "String"))) (sort (identifier "Seq") (sort (identifier "String")))) :arguments (list (variable (identifier "ra") :sort (sort (identifier "Seq") (sort (identifier "String")))) (application (identifier "seq.unit") :argument-sorts (list (sort (identifier "String"))) :arguments (list "a") :return-sort (sort (identifier "Seq") (sort (identifier "String"))))) :return-sort (sort (identifier "Seq") (sort (identifier "String"))))) :return-sort (sort (identifier "Bool"))) (application (identifier "=") :argument-sorts (list (sort (identifier "Seq") (sort (identifier "String"))) (sort (identifier "Seq") (sort (identifier "String")))) :arguments (list (variable (identifier "rb") :sort (sort (identifier "Seq") (sort (identifier "String")))) (application (identifier "seq.empty") :argument-sorts (list) :arguments (list) :return-sort (sort (identifier "Seq") (sort (identifier "String"))))) :return-sort (sort (identifier "Bool"))) (application (identifier "=") :argument-sorts (list (sort (identifier "Seq") (sort (identifier "Int"))) (sort (identifier "Seq") (sort (identifier "Int")))) :arguments (list (variable (identifier "rq") :sort (sort (identifier "Seq") (sort (identifier "Int")))) (application (identifier "seq.rev") :argument-sorts (list (sort (identifier "Seq") (sort (identifier "Int")))) :arguments (list (variable (identifier "rq") :sort (sort (identifier "Seq") (sort (identifier "Int"))))) :return-sort (sort (identifier "Seq") (sort (identifier "Int"))))) :return-sort (sort (identifier "Bool")))) :return-sort (sort (identifier "Bool")))) :constructor (constructor (identifier "$main") :arguments (list) :argument-sorts (list) :return-sort (sort (identifier "Start"))))
7+
(synth-fun (identifier "MyFunc") :term-type (sort (identifier "Start")) :grammar (grammar :non-terminals (list (identifier "@Start__agtt")) :non-terminal-types (list (sort (identifier "Start"))) :productions (list (production :instance (identifier "@Start__agtt") :occurrences (list) :operator (identifier "$main")))))
8+
(constraint (term (exists :bindings (list (identifier "rq") (identifier "y")) :binding-sorts (list (sort (identifier "Seq") (sort (identifier "Int"))) (sort (identifier "BitVec" 32))) :child (application (identifier "Start.Sem") :argument-sorts (list (sort (identifier "Start")) (sort (identifier "Seq") (sort (identifier "Int"))) (sort (identifier "BitVec" 32))) :arguments (list (application (identifier "MyFunc") :argument-sorts (list) :arguments (list) :return-sort (sort (identifier "Start"))) (variable (identifier "rq") :sort (sort (identifier "Seq") (sort (identifier "Int")))) (variable (identifier "y") :sort (sort (identifier "BitVec" 32)))) :return-sort (sort (identifier "Bool"))))))
9+
(check-synth)

Semgus-Lib/Model/Smt/Theories/SmtSequencesTheory.cs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ internal class SmtSequencesTheory : ISmtTheory
2020
/// <summary>
2121
/// A singleton theory instance
2222
/// </summary>
23-
public static SmtSequencesTheory Instance { get; } = new();
23+
public static SmtSequencesTheory Instance { get; } = new(SmtCoreTheory.Instance, SmtIntsTheory.Instance);
2424

2525
/// <summary>
2626
/// Underlying sequence sort
@@ -127,12 +127,30 @@ public override void UpdateForResolvedParameters(IList<SmtSort> resolved)
127127
/// Constructs an instance of the theory of sequences
128128
/// </summary>
129129
/// <param name="core">Reference to the core theory</param>
130-
private SmtSequencesTheory()
130+
private SmtSequencesTheory(SmtCoreTheory core, SmtIntsTheory ints)
131131
{
132+
SmtSort b = core.Sorts[BoolSortId.Name];
133+
SmtSort i = ints.Sorts[IntSortId.Name];
134+
132135
SmtSourceBuilder sb = new(this);
133136
var usf = new SmtSort.UniqueSortFactory();
134137
var elementSort = usf.Next();
135138
var seqSort = new SeqSort(elementSort);
139+
sb.AddFn("seq.empty", seqSort);
140+
sb.AddFn("seq.unit", seqSort, elementSort);
141+
sb.AddFn("seq.len", i, seqSort);
142+
sb.AddFn("seq.nth", elementSort, seqSort, i);
143+
sb.AddFn("seq.update", seqSort, seqSort, i, seqSort);
144+
sb.AddFn("seq.extract", seqSort, seqSort, i, i);
145+
sb.AddFn("seq.++", seqSort, seqSort, seqSort);
146+
sb.AddFn("seq.at", seqSort, seqSort, i);
147+
sb.AddFn("seq.contains", b, seqSort, seqSort);
148+
sb.AddFn("seq.indexof", i, seqSort, seqSort, i);
149+
sb.AddFn("seq.replace", seqSort, seqSort, seqSort, seqSort);
150+
sb.AddFn("seq.replace_all", seqSort, seqSort, seqSort, seqSort);
151+
sb.AddFn("seq.rev", seqSort, seqSort);
152+
sb.AddFn("seq.prefixof", b, seqSort, seqSort);
153+
sb.AddFn("seq.suffixof", b, seqSort, seqSort);
136154

137155
Functions = sb.Functions;
138156
PrimaryFunctionSymbols = sb.PrimaryFunctionSymbols;

0 commit comments

Comments
 (0)