All Downloads are FREE. Search and download functionalities are using the official Maven repository.

proof.Proof.scala Maven / Gradle / Ivy

The newest version!
package galileo.proof

import galileo.environment.Environment
import galileo.expr.{Expr,Statement}

object Proof extends Enumeration{
	type Status = Value
	val Proven, Disproved, Unproven = Value
	
	def apply( left:Expr, relation:String, right:Expr ):Expr = relation match {
		case "=" => Proof( Equality( left, right ), List(), Proof.Unproven )
		//case "!=" => ProofInequality( left, right )
		//case ">" => ProofGreatherThan( left, right )
		//case ">=" => ProofGreatherThanOrEqual( left, right)
	}
	/*
	val rules:List[Rule] = {
		var rv:List[Rule] = List()
		//rv = rv :+ Numnber.rules()
		rv
	}
	*/
	//val maxDepth = 10
	// returns steps needed to get either
	// a truth, a falsitude or if no steps are returned the statement is 'unproven/uncertain'

	def prove(relation:Relation,depth:Int=10):Option[Proof] = {
		for( i <- 0 to depth )
		{
			proveInner(relation,depth) match {
				case Some( p ) => return Some( p )
				case _ => None
			}
		}
		
		return None
	}

	def proveInner(relation:Relation, depth:Int=10):Option[Proof] = {
		/*
		if( depth == 0 )
			return None //Proof(relation,List(), "unproven")

		def checker(left:Expr,right:Expr):Option[Rule] = (left,right) match {
			//case Number(a), Number(b) if ( a == b ) => rv = rv :+ Rule( "Equality of numbers", Truth( a + "=" + b ) )
			case (a:Expr,b:Expr) if ( a == b ) => Rule( "Equality of expressions", Truth( a + "=" + b ) )
			case (Number(a), Number(b)) => Rule( "Inequality of numbers", Falsitude( a + "!=" + b ) )
			case (Variable(a), Variable( b )) => Rule( "Inequality of variables", Falsitude( a + "!=" + b ) )
			//case (Sum( a, b ), c:Expr) if ( a == c ) => Rule( "Removal of common term " + a, Equality( b, Number( 0 ) ) )
			//case (Number( a ), Sum( Number( b ), c ) ) if ( b == a ) => rv = rv :+ Rule( "Removal of common term " + a, Equality( Number( 0 ), c ) )
			//case (Number( a ), Sum( Number( b ), c ) ) if ( a > b ) => rv = rv :+ Rule( "Subtract " + Number( b ) + "from both sides", Equality( Number( a - b ), c ) )
			//case (Number( a ), Sum( Number( b ), c ) ) if ( a < b ) => rv = rv :+ Rule( "Subtract " + Number( a ) + "from both sides", Equality( Number( 0 ), Sum( Number( b - a ), c ) ) )
			//case (Sum( a, b ), Sum( c, d ) ) if ( a == c ) => rv = rv :+ Rule( "Removal of common term " + a, Equality( b, d ) )
			//case (Sum( Number( a ), b:Expr ), Sum( Number( c ), d:Expr ) ) if( a > c ) => rv = rv :+ Rule( "Subtract " + Number( c ) + " from both sides", Equality( Sum( Number( a - c ), b ), d ) ) 
			//case (Sum( Number( a ), b:Expr ), Sum( Number( c ), d:Expr ) ) if( a < c ) => rv = rv :+ Rule( "Subtract " + Number( a ) + " from both sides", Equality( b, Sum( Number( c - a ), d ) ) ) 
			//case (Sum( Number( a ), Number( b ) ), Sum( Number( c ), Number( d ) ) ) => rv = rv :+ Rule( "Executing sum ", Equality( Number( a + b ), Number( c + d ) ) )
			case _ => None
		}

		val d = 1
		while( d < depth ){
			var ls = relation.left.conversions( d )
			var rs = relation.right.conversions( d )
			for( l <- ls ) {
				for( r <- rs ) {
					val attempt = checker( l, r )
					attempt.result match {
						case t:Truth => Some( Proof( relation, List( rule ), Proof.Proven ) )
						case f:Falsitude => Some( Proof( relation, List( rule ), Proof.Disproved ) )
						case _ => None
					}
				}
			}			
		}	
		*/
		

		//var steps:List[Rule] = List()
		//println( relation.rules( depth ) )
		//return None 
		for( rule <- relation.rules( depth ) ) {
			//println( "trying " + rule  + ", with result: " + rule.result )
			val attempt = rule.result
			attempt match {
				case t:Truth => return Some( Proof( relation, List( rule ), Proof.Proven ) )
				case f:Falsitude => return Some( Proof( relation, List( rule ), Proof.Disproved ) )
				case _ => None //e:Equality if ( e.left == e.right) => None // println( "I no know")
			}
			//val result = rule.result
		}
		/*
		// tail iteration here....
		if( depth < 10 )
		{
			// get new rules...
		}
		*/

		return None

		//return Some( Proof( relation, List(), Proof.Proven ) )
/*
		for( rule <- relation.rules( depth ) ) {
			val result = rule.result
			var rv:Option[Proof] = None
			result match {
				case t:Truth => rv = Some( Proof( relation, List( rule ), Proof.Proven ) )
				case f:Falsitude => rv = Some( Proof( relation, List( rule ), Proof.Disproved ) )
				case _ => None
			}
			if( rv.isDefined ) return rv
			// filter{ _.isDefined } map { _.get } // scala way of not returning None here

			println( "rv is notDefined")
			//println( "iterating...")
			val steps:List[Rule] = List( rule )
			var pp:Option[Proof] = None
			prove( result, depth + 1 ) match {
				case Some( p ) if( p.status != "unproven" ) => pp = Some( Proof( relation, steps ++ p.steps, p.status ) )
				case _ => None
			} 
			if( pp.isDefined ) return pp // Some( pp.get ) //Proof( relation, steps ++ pp.get.steps, pp.get.status ) )
			// now continue...
		}
		return None
		*/

		/*		case Truth => Proof( relation, steps :+ rule, "proven" ) // we're done here, it's been proven...
				case Falsitude => Proof( relation, steps :+ rule, "disproved" )
				case u => { 
					val p = prove( u, depth - 1 )
					if( // case _ if( prove( rule.result, depth - 1  ).status != "unproven" ) => Proof( relation, s)
			}
			*/
	}
}
 
// we prove relations, e.g. Prove( 4 == 5 - 1 ) or Prove( x = 2 * x + 5 - x - 5 )  or Prove( 4 > 3 )
case class Proof( relation:Relation, steps:List[Rule]=List(), status:Proof.Status ) extends Expr with Statement {
	// during this step we search for Truth... Or falsitude
	override def visit(env:Option[Environment]) = Proof.prove( relation, 0 ) match {
		case Some( p ) => p
		case None => this
	}
	override def toString():String = status match {
		case Proof.Proven => "The statement " + relation + " is true, proven in the following steps\n" + steps.mkString( "\n")
		case Proof.Disproved => "The statement " + relation + " is false, shown in the following steps " + steps.mkString( "\n")
		case Proof.Unproven => "The veracity of statement " + relation + " can not be determined"
	}
	def info(env:Option[Environment]=None) = "Proof(" + relation + "," + steps + "," + status + ")" 
}

// Proof( 10 == 9 + 1, [], "unproven" )
// Proof( 10 == 10, [ "sum"], "proven" )
/*
case class Equality(left:Expr, right:Expr) extends Relation{
	override def visit( env:Option[Environment]):Expr = {
		var steps:List[Rules] = List()
		// now, find that List of rules to apply

		/*
		(l.visit(env),r.visit(env)) match{
			case (a,b) if (a == b ) => 
		}
		*/
		// different methods
		// 1. labyrinth solve first, w backtrack, heuristics etc
		// 2. Genetic algorithm

	}
	def findProof( depth:Proof.maxDepth ):Option[Proof] = {
		// Let's say depth is 1...
		for( rule <- rules )
			rule.apply( this ) match {
				//case Truth => return 
				//case Falsitude => // counterproof
			}
	}
}
*/


// Proof as a verb
//case class Proof(left:Expr, relation:Relation, right:Expr) extends Expr{}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy