mirror of
https://github.com/Z3Prover/z3
synced 2026-01-21 17:44:43 +00:00
Add RCF (Real Closed Field) bindings to C++, Java, C#, and TypeScript (#8171)
* Initial plan * Add RCF (Real Closed Field) bindings to C++ API Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * Add RCF (Real Closed Field) bindings to Java API Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * Add RCF (Real Closed Field) bindings to C# (.NET) API Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * Add RCF (Real Closed Field) example for TypeScript/JavaScript API Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> * Add comprehensive RCF implementation summary documentation Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>
This commit is contained in:
parent
cfd40d2588
commit
bd0eba812d
8 changed files with 1874 additions and 0 deletions
119
examples/c++/rcf_example.cpp
Normal file
119
examples/c++/rcf_example.cpp
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
/**
|
||||
\brief Example demonstrating the RCF (Real Closed Field) API in C++.
|
||||
|
||||
This example shows how to use RCF numerals to work with:
|
||||
- Transcendental numbers (pi, e)
|
||||
- Algebraic numbers (roots of polynomials)
|
||||
- Infinitesimals
|
||||
- Exact real arithmetic
|
||||
*/
|
||||
#include <iostream>
|
||||
#include "z3++.h"
|
||||
|
||||
using namespace z3;
|
||||
|
||||
void rcf_basic_example() {
|
||||
std::cout << "RCF Basic Example\n";
|
||||
std::cout << "=================\n";
|
||||
|
||||
context c;
|
||||
|
||||
// Create pi and e
|
||||
rcf_num pi = rcf_pi(c);
|
||||
rcf_num e = rcf_e(c);
|
||||
|
||||
std::cout << "pi = " << pi << "\n";
|
||||
std::cout << "e = " << e << "\n";
|
||||
|
||||
// Arithmetic operations
|
||||
rcf_num sum = pi + e;
|
||||
rcf_num prod = pi * e;
|
||||
|
||||
std::cout << "pi + e = " << sum << "\n";
|
||||
std::cout << "pi * e = " << prod << "\n";
|
||||
|
||||
// Decimal approximations
|
||||
std::cout << "pi (10 decimals) = " << pi.to_decimal(10) << "\n";
|
||||
std::cout << "e (10 decimals) = " << e.to_decimal(10) << "\n";
|
||||
|
||||
// Comparisons
|
||||
std::cout << "pi < e? " << (pi < e ? "yes" : "no") << "\n";
|
||||
std::cout << "pi > e? " << (pi > e ? "yes" : "no") << "\n";
|
||||
}
|
||||
|
||||
void rcf_rational_example() {
|
||||
std::cout << "\nRCF Rational Example\n";
|
||||
std::cout << "====================\n";
|
||||
|
||||
context c;
|
||||
|
||||
// Create rational numbers
|
||||
rcf_num half(c, "1/2");
|
||||
rcf_num third(c, "1/3");
|
||||
|
||||
std::cout << "1/2 = " << half << "\n";
|
||||
std::cout << "1/3 = " << third << "\n";
|
||||
|
||||
// Arithmetic
|
||||
rcf_num sum = half + third;
|
||||
std::cout << "1/2 + 1/3 = " << sum << "\n";
|
||||
|
||||
// Type queries
|
||||
std::cout << "Is 1/2 rational? " << (half.is_rational() ? "yes" : "no") << "\n";
|
||||
std::cout << "Is 1/2 algebraic? " << (half.is_algebraic() ? "yes" : "no") << "\n";
|
||||
}
|
||||
|
||||
void rcf_roots_example() {
|
||||
std::cout << "\nRCF Roots Example\n";
|
||||
std::cout << "=================\n";
|
||||
|
||||
context c;
|
||||
|
||||
// Find roots of x^2 - 2 = 0
|
||||
// Polynomial: -2 + 0*x + 1*x^2
|
||||
std::vector<rcf_num> coeffs;
|
||||
coeffs.push_back(rcf_num(c, -2)); // constant term
|
||||
coeffs.push_back(rcf_num(c, 0)); // x coefficient
|
||||
coeffs.push_back(rcf_num(c, 1)); // x^2 coefficient
|
||||
|
||||
std::vector<rcf_num> roots = rcf_roots(c, coeffs);
|
||||
|
||||
std::cout << "Roots of x^2 - 2 = 0:\n";
|
||||
for (size_t i = 0; i < roots.size(); i++) {
|
||||
std::cout << " root[" << i << "] = " << roots[i] << "\n";
|
||||
std::cout << " decimal = " << roots[i].to_decimal(15) << "\n";
|
||||
std::cout << " is_algebraic = " << (roots[i].is_algebraic() ? "yes" : "no") << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
void rcf_infinitesimal_example() {
|
||||
std::cout << "\nRCF Infinitesimal Example\n";
|
||||
std::cout << "=========================\n";
|
||||
|
||||
context c;
|
||||
|
||||
// Create an infinitesimal
|
||||
rcf_num eps = rcf_infinitesimal(c);
|
||||
std::cout << "eps = " << eps << "\n";
|
||||
std::cout << "Is eps infinitesimal? " << (eps.is_infinitesimal() ? "yes" : "no") << "\n";
|
||||
|
||||
// Infinitesimals are smaller than any positive real number
|
||||
rcf_num tiny(c, "1/1000000000");
|
||||
std::cout << "eps < 1/1000000000? " << (eps < tiny ? "yes" : "no") << "\n";
|
||||
}
|
||||
|
||||
int main() {
|
||||
try {
|
||||
rcf_basic_example();
|
||||
rcf_rational_example();
|
||||
rcf_roots_example();
|
||||
rcf_infinitesimal_example();
|
||||
|
||||
std::cout << "\nAll RCF examples completed successfully!\n";
|
||||
return 0;
|
||||
}
|
||||
catch (exception& e) {
|
||||
std::cerr << "Z3 exception: " << e << "\n";
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
133
examples/dotnet/RCFExample.cs
Normal file
133
examples/dotnet/RCFExample.cs
Normal file
|
|
@ -0,0 +1,133 @@
|
|||
/**
|
||||
Example demonstrating the RCF (Real Closed Field) API in C#.
|
||||
|
||||
This example shows how to use RCF numerals to work with:
|
||||
- Transcendental numbers (pi, e)
|
||||
- Algebraic numbers (roots of polynomials)
|
||||
- Infinitesimals
|
||||
- Exact real arithmetic
|
||||
*/
|
||||
|
||||
using Microsoft.Z3;
|
||||
using System;
|
||||
|
||||
class RCFExample
|
||||
{
|
||||
static void RcfBasicExample()
|
||||
{
|
||||
Console.WriteLine("RCF Basic Example");
|
||||
Console.WriteLine("=================");
|
||||
|
||||
using (Context ctx = new Context())
|
||||
{
|
||||
// Create pi and e
|
||||
RCFNum pi = RCFNum.MkPi(ctx);
|
||||
RCFNum e = RCFNum.MkE(ctx);
|
||||
|
||||
Console.WriteLine("pi = " + pi);
|
||||
Console.WriteLine("e = " + e);
|
||||
|
||||
// Arithmetic operations
|
||||
RCFNum sum = pi + e;
|
||||
RCFNum prod = pi * e;
|
||||
|
||||
Console.WriteLine("pi + e = " + sum);
|
||||
Console.WriteLine("pi * e = " + prod);
|
||||
|
||||
// Decimal approximations
|
||||
Console.WriteLine("pi (10 decimals) = " + pi.ToDecimal(10));
|
||||
Console.WriteLine("e (10 decimals) = " + e.ToDecimal(10));
|
||||
|
||||
// Comparisons
|
||||
Console.WriteLine("pi < e? " + (pi < e ? "yes" : "no"));
|
||||
Console.WriteLine("pi > e? " + (pi > e ? "yes" : "no"));
|
||||
}
|
||||
}
|
||||
|
||||
static void RcfRationalExample()
|
||||
{
|
||||
Console.WriteLine("\nRCF Rational Example");
|
||||
Console.WriteLine("====================");
|
||||
|
||||
using (Context ctx = new Context())
|
||||
{
|
||||
// Create rational numbers
|
||||
RCFNum half = new RCFNum(ctx, "1/2");
|
||||
RCFNum third = new RCFNum(ctx, "1/3");
|
||||
|
||||
Console.WriteLine("1/2 = " + half);
|
||||
Console.WriteLine("1/3 = " + third);
|
||||
|
||||
// Arithmetic
|
||||
RCFNum sum = half + third;
|
||||
Console.WriteLine("1/2 + 1/3 = " + sum);
|
||||
|
||||
// Type queries
|
||||
Console.WriteLine("Is 1/2 rational? " + (half.IsRational() ? "yes" : "no"));
|
||||
Console.WriteLine("Is 1/2 algebraic? " + (half.IsAlgebraic() ? "yes" : "no"));
|
||||
}
|
||||
}
|
||||
|
||||
static void RcfRootsExample()
|
||||
{
|
||||
Console.WriteLine("\nRCF Roots Example");
|
||||
Console.WriteLine("=================");
|
||||
|
||||
using (Context ctx = new Context())
|
||||
{
|
||||
// Find roots of x^2 - 2 = 0
|
||||
// Polynomial: -2 + 0*x + 1*x^2
|
||||
RCFNum[] coeffs = new RCFNum[] {
|
||||
new RCFNum(ctx, -2), // constant term
|
||||
new RCFNum(ctx, 0), // x coefficient
|
||||
new RCFNum(ctx, 1) // x^2 coefficient
|
||||
};
|
||||
|
||||
RCFNum[] roots = RCFNum.MkRoots(ctx, coeffs);
|
||||
|
||||
Console.WriteLine("Roots of x^2 - 2 = 0:");
|
||||
for (int i = 0; i < roots.Length; i++)
|
||||
{
|
||||
Console.WriteLine(" root[" + i + "] = " + roots[i]);
|
||||
Console.WriteLine(" decimal = " + roots[i].ToDecimal(15));
|
||||
Console.WriteLine(" is_algebraic = " + (roots[i].IsAlgebraic() ? "yes" : "no"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void RcfInfinitesimalExample()
|
||||
{
|
||||
Console.WriteLine("\nRCF Infinitesimal Example");
|
||||
Console.WriteLine("=========================");
|
||||
|
||||
using (Context ctx = new Context())
|
||||
{
|
||||
// Create an infinitesimal
|
||||
RCFNum eps = RCFNum.MkInfinitesimal(ctx);
|
||||
Console.WriteLine("eps = " + eps);
|
||||
Console.WriteLine("Is eps infinitesimal? " + (eps.IsInfinitesimal() ? "yes" : "no"));
|
||||
|
||||
// Infinitesimals are smaller than any positive real number
|
||||
RCFNum tiny = new RCFNum(ctx, "1/1000000000");
|
||||
Console.WriteLine("eps < 1/1000000000? " + (eps < tiny ? "yes" : "no"));
|
||||
}
|
||||
}
|
||||
|
||||
static void Main(string[] args)
|
||||
{
|
||||
try
|
||||
{
|
||||
RcfBasicExample();
|
||||
RcfRationalExample();
|
||||
RcfRootsExample();
|
||||
RcfInfinitesimalExample();
|
||||
|
||||
Console.WriteLine("\nAll RCF examples completed successfully!");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.Error.WriteLine("Error: " + ex.Message);
|
||||
Console.Error.WriteLine(ex.StackTrace);
|
||||
}
|
||||
}
|
||||
}
|
||||
119
examples/java/RCFExample.java
Normal file
119
examples/java/RCFExample.java
Normal file
|
|
@ -0,0 +1,119 @@
|
|||
/**
|
||||
Example demonstrating the RCF (Real Closed Field) API in Java.
|
||||
|
||||
This example shows how to use RCF numerals to work with:
|
||||
- Transcendental numbers (pi, e)
|
||||
- Algebraic numbers (roots of polynomials)
|
||||
- Infinitesimals
|
||||
- Exact real arithmetic
|
||||
*/
|
||||
|
||||
package com.microsoft.z3;
|
||||
|
||||
public class RCFExample {
|
||||
|
||||
public static void rcfBasicExample() {
|
||||
System.out.println("RCF Basic Example");
|
||||
System.out.println("=================");
|
||||
|
||||
try (Context ctx = new Context()) {
|
||||
// Create pi and e
|
||||
RCFNum pi = RCFNum.mkPi(ctx);
|
||||
RCFNum e = RCFNum.mkE(ctx);
|
||||
|
||||
System.out.println("pi = " + pi);
|
||||
System.out.println("e = " + e);
|
||||
|
||||
// Arithmetic operations
|
||||
RCFNum sum = pi.add(e);
|
||||
RCFNum prod = pi.mul(e);
|
||||
|
||||
System.out.println("pi + e = " + sum);
|
||||
System.out.println("pi * e = " + prod);
|
||||
|
||||
// Decimal approximations
|
||||
System.out.println("pi (10 decimals) = " + pi.toDecimal(10));
|
||||
System.out.println("e (10 decimals) = " + e.toDecimal(10));
|
||||
|
||||
// Comparisons
|
||||
System.out.println("pi < e? " + (pi.lt(e) ? "yes" : "no"));
|
||||
System.out.println("pi > e? " + (pi.gt(e) ? "yes" : "no"));
|
||||
}
|
||||
}
|
||||
|
||||
public static void rcfRationalExample() {
|
||||
System.out.println("\nRCF Rational Example");
|
||||
System.out.println("====================");
|
||||
|
||||
try (Context ctx = new Context()) {
|
||||
// Create rational numbers
|
||||
RCFNum half = new RCFNum(ctx, "1/2");
|
||||
RCFNum third = new RCFNum(ctx, "1/3");
|
||||
|
||||
System.out.println("1/2 = " + half);
|
||||
System.out.println("1/3 = " + third);
|
||||
|
||||
// Arithmetic
|
||||
RCFNum sum = half.add(third);
|
||||
System.out.println("1/2 + 1/3 = " + sum);
|
||||
|
||||
// Type queries
|
||||
System.out.println("Is 1/2 rational? " + (half.isRational() ? "yes" : "no"));
|
||||
System.out.println("Is 1/2 algebraic? " + (half.isAlgebraic() ? "yes" : "no"));
|
||||
}
|
||||
}
|
||||
|
||||
public static void rcfRootsExample() {
|
||||
System.out.println("\nRCF Roots Example");
|
||||
System.out.println("=================");
|
||||
|
||||
try (Context ctx = new Context()) {
|
||||
// Find roots of x^2 - 2 = 0
|
||||
// Polynomial: -2 + 0*x + 1*x^2
|
||||
RCFNum[] coeffs = new RCFNum[] {
|
||||
new RCFNum(ctx, -2), // constant term
|
||||
new RCFNum(ctx, 0), // x coefficient
|
||||
new RCFNum(ctx, 1) // x^2 coefficient
|
||||
};
|
||||
|
||||
RCFNum[] roots = RCFNum.mkRoots(ctx, coeffs);
|
||||
|
||||
System.out.println("Roots of x^2 - 2 = 0:");
|
||||
for (int i = 0; i < roots.length; i++) {
|
||||
System.out.println(" root[" + i + "] = " + roots[i]);
|
||||
System.out.println(" decimal = " + roots[i].toDecimal(15));
|
||||
System.out.println(" is_algebraic = " + (roots[i].isAlgebraic() ? "yes" : "no"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void rcfInfinitesimalExample() {
|
||||
System.out.println("\nRCF Infinitesimal Example");
|
||||
System.out.println("=========================");
|
||||
|
||||
try (Context ctx = new Context()) {
|
||||
// Create an infinitesimal
|
||||
RCFNum eps = RCFNum.mkInfinitesimal(ctx);
|
||||
System.out.println("eps = " + eps);
|
||||
System.out.println("Is eps infinitesimal? " + (eps.isInfinitesimal() ? "yes" : "no"));
|
||||
|
||||
// Infinitesimals are smaller than any positive real number
|
||||
RCFNum tiny = new RCFNum(ctx, "1/1000000000");
|
||||
System.out.println("eps < 1/1000000000? " + (eps.lt(tiny) ? "yes" : "no"));
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
try {
|
||||
rcfBasicExample();
|
||||
rcfRationalExample();
|
||||
rcfRootsExample();
|
||||
rcfInfinitesimalExample();
|
||||
|
||||
System.out.println("\nAll RCF examples completed successfully!");
|
||||
} catch (Exception e) {
|
||||
System.err.println("Error: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue