Skip to content

Commit 8956eeb

Browse files
authored
Merge pull request #116 from SemGuS-git/kjcjohnson/theory-of-sequences
Add the (experimental cvc5) theory of sequences
2 parents 78de212 + 00b36b9 commit 8956eeb

17 files changed

Lines changed: 329 additions & 17 deletions

File tree

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
(declare-term-types
2+
((Start 0))
3+
((($main))))
4+
5+
(declare-const X (Seq Int))
6+
7+
(define-funs-rec
8+
((Start.Sem ((Start_term_0 Start) (rq (Seq Int)) (x (_ BitVec 32))) Bool))
9+
10+
((match Start_term_0
11+
((($main)
12+
(exists ((rb (Seq String)) (ra (Seq String)))
13+
(and (= "Test" (seq.nth rb 7))
14+
(= rb (seq.++ ra (seq.unit "a")))
15+
(= rb (as seq.empty (Seq String)))
16+
(= rq (seq.rev rq))
17+
(= (seq.len ra) (seq.nth rq 1))
18+
(= (seq.update ra 7 rb) rb)
19+
(= ra (seq.extract rb 3 5))
20+
(= (seq.at rb 4) (seq.at ra 3))
21+
(seq.contains ra rb)
22+
(= 12 (seq.indexof ra rb 7))
23+
(= ra (seq.replace ra ra rb))
24+
(= (seq.replace_all ra ra rb) rb)
25+
(seq.prefixof ra rb)
26+
(seq.suffixof rb ra))))))))
27+
28+
29+
(synth-fun MyFunc () Start)
30+
31+
32+
(constraint (exists ((rq (Seq Int)) (y (_ BitVec 32))) (Start.Sem MyFunc rq y)))
33+
34+
(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

IntegrationTests/tests/test-json-sequences.txt

Lines changed: 12 additions & 0 deletions
Large diffs are not rendered by default.
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

IntegrationTests/tests/test-sexpr-sequences.txt

Lines changed: 10 additions & 0 deletions
Large diffs are not rendered by default.

ParserLibrary/Commands/GrammarBlockHelper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ public static (SemgusGrammar, IReadOnlyList<SemgusTermType>, SemgusTermType, Smt
192192
semDatum.InputVariables.Where(v => v.Name == identifier).First());
193193
}
194194
else if (ctx.TryGetFunctionDeclaration(identifier, out var constant)
195-
&& constant.TryResolveRank(out var rank, default))
195+
&& constant.TryResolveRank(ctx, out var rank, default))
196196
{
197197
constructor = new(GensymUtils.Gensym("_SyProd", identifier.Symbol));
198198
newProds.Add(new(ttDatum.NonTerminal, constructor, Enumerable.Empty<SemgusGrammar.NonTerminal>()));

ParserLibrary/Reader/Converters/TermConverter.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public override bool TryConvertImpl(Type tFrom, Type tTo, object from, [NotNullW
7676
}
7777
else if (_contextProvider.Context.TryGetFunctionDeclaration(qid.Id, out var defn))
7878
{
79-
if (defn.TryResolveRank(out var rank, GetSortOrDie(qid.Sort) /* No arguments */))
79+
if (defn.TryResolveRank(_contextProvider.Context, out var rank, GetSortOrDie(qid.Sort) /* No arguments */))
8080
{
8181
to = new SmtFunctionApplication(defn, rank, new List<SmtTerm>());
8282
}
@@ -362,7 +362,7 @@ public override bool TryConvertImpl(Type tFrom, Type tTo, object from, [NotNullW
362362
return true;
363363
}
364364

365-
if (!orf!.TryResolveRank(out var rank, boolsort, Enumerable.Repeat(boolsort, convTerms.Count).ToArray()))
365+
if (!orf!.TryResolveRank(_contextProvider.Context, out var rank, boolsort, Enumerable.Repeat(boolsort, convTerms.Count).ToArray()))
366366
{
367367
throw new InvalidOperationException("Too many terms to match pattern.");
368368
}
@@ -434,7 +434,7 @@ public override bool TryConvertImpl(Type tFrom, Type tTo, object from, [NotNullW
434434
return true;
435435
}
436436

437-
if (defn.TryResolveRank(out var rank, GetSortOrDie(af.Id.Sort), argSorts))
437+
if (defn.TryResolveRank(_contextProvider.Context, out var rank, GetSortOrDie(af.Id.Sort), argSorts))
438438
{
439439
to = new SmtFunctionApplication(defn, rank, args);
440440
}

ParserTests/BitVectors/ExtractTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,13 @@ public void CanResolve(long i, long j, long m)
9090
var retSort = SmtBitVectorsTheory.BitVectorsSort.GetSort(n);
9191

9292
// First, try without specifying the return sort
93-
AssertTrue(function.TryResolveRank(out var rank, default, argSort));
93+
AssertTrue(function.TryResolveRank(ctx, out var rank, default, argSort));
9494
Assert.Single(rank.ArgumentSorts);
9595
Assert.Equal(argSort, rank.ArgumentSorts[0]);
9696
Assert.Equal(retSort, rank.ReturnSort);
9797

9898
// Then, with specifying the return sort
99-
AssertTrue(function.TryResolveRank(out rank, retSort, argSort));
99+
AssertTrue(function.TryResolveRank(ctx, out rank, retSort, argSort));
100100
Assert.Single(rank.ArgumentSorts);
101101
Assert.Equal(argSort, rank.ArgumentSorts[0]);
102102
Assert.Equal(retSort, rank.ReturnSort);
@@ -119,10 +119,10 @@ public void CannotResolve(long i, long j, long m, long? np = default)
119119
var retSort = SmtBitVectorsTheory.BitVectorsSort.GetSort(n);
120120

121121
// First, try without specifying the return sort
122-
AssertFalse(function.TryResolveRank(out var _, default, argSort));
122+
AssertFalse(function.TryResolveRank(ctx, out var _, default, argSort));
123123

124124
// Then, with specifying the return sort
125-
AssertFalse(function.TryResolveRank(out _, retSort, argSort));
125+
AssertFalse(function.TryResolveRank(ctx, out _, retSort, argSort));
126126
}
127127
}
128128
}

ParserTests/Issues/Issue43.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public void DoesNotThrowParseExceptionForBool()
7474
{
7575
SmtContext ctx = new();
7676
Assert.True(ctx.TryGetFunctionDeclaration(new("true"), out var truefn));
77-
Assert.True(truefn!.TryResolveRank(out var rank, default));
77+
Assert.True(truefn!.TryResolveRank(ctx, out var rank, default));
7878

7979
SemgusToken testToken = new SymbolToken("test", default);
8080
SmtTerm testTerm = new SmtFunctionApplication(truefn, rank!, new List<SmtTerm>());

Semgus-Lib/Model/Smt/IApplicable.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,12 @@ public interface IApplicable
2525
/// <summary>
2626
/// Tries to get an appropriate rank for the given parameter and return sorts
2727
/// </summary>
28+
/// <param name="ctx">The SMT context</param>
2829
/// <param name="rank">The resolved rank</param>
2930
/// <param name="returnSort">The return sort, if known</param>
3031
/// <param name="argumentSorts">The argument sorts</param>
3132
/// <returns>True if successfully resolved the rank</returns>
32-
public bool TryResolveRank([NotNullWhen(true)] out SmtFunctionRank? rank, SmtSort? returnSort, params SmtSort[] argumentSorts);
33+
public bool TryResolveRank(SmtContext ctx, [NotNullWhen(true)] out SmtFunctionRank? rank, SmtSort? returnSort, params SmtSort[] argumentSorts);
3334

3435
/// <summary>
3536
/// Gets an informative string about available ranks

0 commit comments

Comments
 (0)