Skip to content

Commit faf3201

Browse files
committed
Add bvugt and bvsub to SMT Extensions
1 parent 25f6d51 commit faf3201

1 file changed

Lines changed: 60 additions & 1 deletion

File tree

Semgus-Lib/Model/Smt/Extensions/SmtBitVectorsExtension.cs

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using Semgus.Model.Smt.Terms;
22
using Semgus.Model.Smt.Theories;
3-
3+
using System.Collections;
44
using System.Diagnostics.CodeAnalysis;
55

66
namespace Semgus.Model.Smt.Extensions
@@ -94,6 +94,65 @@ internal SmtBitVectorsExtension(SmtCoreTheory core, SmtBitVectorsTheory bv)
9494

9595
});
9696

97+
sb.AddFn(name: "bvugt",
98+
val: SmtSourceBuilder.CheckArgumentSortsEqual,
99+
valCmt: "Argument sorts must be of the same size",
100+
retCalc: SmtSourceBuilder.UseFirstArgumentSort,
101+
bv0,
102+
bv0,
103+
bv0)
104+
.DefinitionMissing((ctx, fn, rank) =>
105+
{
106+
SmtIdentifier bvult_id = new("bvult");
107+
108+
var a1_id = new SmtIdentifier("a1");
109+
var a2_id = new SmtIdentifier("a2");
110+
111+
SmtScope scope = new(default);
112+
scope.TryAddVariableBinding(a1_id, rank.ArgumentSorts[0], SmtVariableBindingType.Lambda, ctx, out var a1_binding, out _);
113+
scope.TryAddVariableBinding(a2_id, rank.ArgumentSorts[1], SmtVariableBindingType.Lambda, ctx, out var a2_binding, out _);
114+
115+
var a1 = new SmtVariable(a1_id, a1_binding!);
116+
var a2 = new SmtVariable(a2_id, a2_binding!);
117+
118+
var b = new SmtTermBuilder(ctx);
119+
return b.Lambda(scope,
120+
b.Apply(bvult_id, a2, a1));
121+
122+
});
123+
124+
sb.AddFn(name: "bvsub",
125+
val: SmtSourceBuilder.CheckArgumentSortsEqual,
126+
valCmt: "Argument sorts must be of the same size",
127+
retCalc: SmtSourceBuilder.UseFirstArgumentSort,
128+
bv0,
129+
bv0,
130+
bv0)
131+
.DefinitionMissing((ctx, fn, rank) =>
132+
{
133+
SmtIdentifier bvadd_id = new("bvadd");
134+
SmtIdentifier bvnot_id = new("bvnot");
135+
136+
var a1_id = new SmtIdentifier("a1");
137+
var a2_id = new SmtIdentifier("a2");
138+
var c1_id = new SmtIdentifier("c1");
139+
140+
SmtScope scope = new(default);
141+
scope.TryAddVariableBinding(a1_id, rank.ArgumentSorts[0], SmtVariableBindingType.Lambda, ctx, out var a1_binding, out _);
142+
scope.TryAddVariableBinding(a2_id, rank.ArgumentSorts[1], SmtVariableBindingType.Lambda, ctx, out var a2_binding, out _);
143+
144+
var a1 = new SmtVariable(a1_id, a1_binding!);
145+
var a2 = new SmtVariable(a2_id, a2_binding!);
146+
var c1 = new SmtBitVectorLiteral(ctx, new BitArray(new int[] { 1 }));
147+
148+
var b = new SmtTermBuilder(ctx);
149+
// 2's complement
150+
return b.Lambda(scope,
151+
b.Apply(bvadd_id, b.Apply(bvadd_id, a1, b.Apply(bvnot_id, a2)),
152+
c1));
153+
154+
});
155+
97156
Functions = sb.Functions;
98157
PrimaryFunctionSymbols = sb.PrimaryFunctionSymbols;
99158
}

0 commit comments

Comments
 (0)