-- Programmed by Jedidiah Barber -- Licensed under the Sunset License v1.0 -- See license.txt for further details with Ada.Text_IO, Kompsos.Math, Kompsos.Pretty_Print; procedure Logo is package TIO renames Ada.Text_IO; package InKomp is new Kompsos (Integer); use InKomp; package Math is new InKomp.Math (0, 1); package Printer is new InKomp.Pretty_Print (Integer'Image); function B (Item : in Natural) return Term renames Math.Build; function P (Item : in Integer) return String renames Printer.Image; function PV (Item : in Term) return String is begin return P (Math.Value (Item)); exception when others => return Printer.Image (Item); end PV; procedure Test (Power, Base : in Natural) is Relation : Goal := Empty_Goal; Exponent : constant Term := Relation.Fresh; Remainder : constant Term := Relation.Fresh; Result : State; begin Math.Logarithm (Relation, B (Power) & B (Base) & Exponent & Remainder); Result := Relation.Run; TIO.Put_Line ("log_" & P (Base) & " (" & P (Power) & ") = " & PV (Exponent.Resolve (Result)) & " r " & PV (Remainder.Resolve (Result))); end Test; begin TIO.Put_Line ("Logarithm"); Test (1, 1); Test (68, 2); Test (68, 3); Test (68, 4); Test (68, 5); Test (68, 6); Test (68, 7); Test (68, 8); TIO.New_Line; TIO.Put_Line ("Expected Failure"); -- Here there is no reasonable way to assign a value to the exponent variable term Test (68, 1); -- 1^x is always 1 so will never be 68 -- In this case the log function is undefined for x=0 Test (68, 0); -- 0^x is always 0 or undefined so could never be 68 Test (0, 0); end Logo;