A logical expression

The basic (primitive) operators are: & (and), | (or) and ~ (not). Composed operators are impl and ^, they implemented using the basic operators.

Introduced properties

fun &(e: LExpr): LExpr

logic :: LExpr :: &

Conjunction with e (or).
fun ^(e: LExpr): LExpr

logic :: LExpr :: ^

Exclusive disjunction with e (xor).
fun cnf(vars: nullable Array[LVar]): CNF

logic :: LExpr :: cnf

Compute a conjunctive normal form.
fun imp(e: LExpr): LExpr

logic :: LExpr :: imp

Implication with e (implies).
fun is_f: Bool

logic :: LExpr :: is_f

It the logical expression lfalse?
fun is_t: Bool

logic :: LExpr :: is_t

It the logical expression ltrue?
fun nnf: LExpr

logic :: LExpr :: nnf

The negation normal form (NNF).
fun nnnf: LExpr

logic :: LExpr :: nnnf

The negative negation normal form (NNF).
fun size: Int

logic :: LExpr :: size

The size of the logical expression.
fun unary ~: LExpr

logic :: LExpr :: unary ~

The negation of self
fun |(e: LExpr): LExpr

logic :: LExpr :: |

Disjunction with e (and).

Redefined properties

redef type SELF: LExpr

logic $ LExpr :: SELF

Type of this instance, automatically specialized in every class

All properties

fun !=(other: nullable Object): Bool

core :: Object :: !=

Have self and other different values?
fun &(e: LExpr): LExpr

logic :: LExpr :: &

Conjunction with e (or).
fun ==(other: nullable Object): Bool

core :: Object :: ==

Have self and other the same value?
type CLASS: Class[SELF]

core :: Object :: CLASS

The type of the class of self.
type SELF: Object

core :: Object :: SELF

Type of this instance, automatically specialized in every class
fun ^(e: LExpr): LExpr

logic :: LExpr :: ^

Exclusive disjunction with e (xor).
protected fun class_factory(name: String): CLASS

core :: Object :: class_factory

Implementation used by get_class to create the specific class.
fun class_name: String

core :: Object :: class_name

The class name of the object.
fun cnf(vars: nullable Array[LVar]): CNF

logic :: LExpr :: cnf

Compute a conjunctive normal form.
fun get_class: CLASS

core :: Object :: get_class

The meta-object representing the dynamic type of self.
fun hash: Int

core :: Object :: hash

The hash code of the object.
fun imp(e: LExpr): LExpr

logic :: LExpr :: imp

Implication with e (implies).
init init

core :: Object :: init

fun inspect: String

core :: Object :: inspect

Developer readable representation of self.
protected fun inspect_head: String

core :: Object :: inspect_head

Return "CLASSNAME:#OBJECTID".
fun is_f: Bool

logic :: LExpr :: is_f

It the logical expression lfalse?
intern fun is_same_instance(other: nullable Object): Bool

core :: Object :: is_same_instance

Return true if self and other are the same instance (i.e. same identity).
fun is_same_serialized(other: nullable Object): Bool

core :: Object :: is_same_serialized

Is self the same as other in a serialization context?
intern fun is_same_type(other: Object): Bool

core :: Object :: is_same_type

Return true if self and other have the same dynamic type.
fun is_t: Bool

logic :: LExpr :: is_t

It the logical expression ltrue?
fun nnf: LExpr

logic :: LExpr :: nnf

The negation normal form (NNF).
fun nnnf: LExpr

logic :: LExpr :: nnnf

The negative negation normal form (NNF).
intern fun object_id: Int

core :: Object :: object_id

An internal hash code for the object based on its identity.
fun output

core :: Object :: output

Display self on stdout (debug only).
intern fun output_class_name

core :: Object :: output_class_name

Display class name on stdout (debug only).
fun serialization_hash: Int

core :: Object :: serialization_hash

Hash value use for serialization
fun size: Int

logic :: LExpr :: size

The size of the logical expression.
intern fun sys: Sys

core :: Object :: sys

Return the global sys object, the only instance of the Sys class.
abstract fun to_jvalue(env: JniEnv): JValue

core :: Object :: to_jvalue

fun to_s: String

core :: Object :: to_s

User readable representation of self.
fun unary ~: LExpr

logic :: LExpr :: unary ~

The negation of self
fun |(e: LExpr): LExpr

logic :: LExpr :: |

Disjunction with e (and).
package_diagram logic::LExpr LExpr core::Object Object logic::LExpr->core::Object logic::LAnd LAnd logic::LAnd->logic::LExpr logic::LOr LOr logic::LOr->logic::LExpr logic::LNot LNot logic::LNot->logic::LExpr logic::LTrue LTrue logic::LTrue->logic::LExpr logic::LFalse LFalse logic::LFalse->logic::LExpr logic::LVar LVar logic::LVar->logic::LExpr

Parents

interface Object

core :: Object

The root of the class hierarchy.

Children

class LAnd

logic :: LAnd

A logical conjunction operation
class LFalse

logic :: LFalse

The class of the singleton lfalse
class LNot

logic :: LNot

A logical negation operation
class LOr

logic :: LOr

A logical disjunction operation
class LTrue

logic :: LTrue

The class of the singleton ltrue
class LVar

logic :: LVar

A variable of a logical expression.

Class definitions

logic $ LExpr
# A logical expression
#
# The basic (primitive) operators are: `&` (and), `|` (or) and `~` (not).
# Composed operators are `impl` and `^`, they implemented using the basic operators.
class LExpr
	# It the logical expression `ltrue`?
	#
	# ~~~
	# assert     ltrue.is_t
	# assert not lfalse.is_t
	# assert not (new LVar("a")).is_t
	# ~~~
	fun is_t: Bool do return false

	# It the logical expression `lfalse`?
	#
	# ~~~
	# assert     lfalse.is_f
	# assert not ltrue.is_f
	# assert not (new LVar("a")).is_f
	# ~~~
	fun is_f: Bool do return false

	# The negation of `self`
	#
	# ~~~
	# var a = new LVar("a")
	# assert (~a).to_s == "~a"
	# assert (~~a).to_s == "a"
	# ~~~
	fun ~:LExpr do return lnot

	private var lnot: LExpr is lazy do return new LNot(self)

	# Disjunction with `e` (and).
	#
	# ~~~
	# var a = new LVar("a")
	# var b = new LVar("b")
	# assert (a|b).to_s == "(a | b)"
	# ~~~
	#
	# `true` and `false` operands are optimized.
	#
	# ~~~
	# assert (a|ltrue).is_t
	# assert (a|lfalse) == a
	# ~~~
	fun |(e: LExpr): LExpr do
		if self.is_f then return e
		if self.is_t then return ltrue
		if e.is_f then return self
		if e.is_t then return ltrue
		return new LOr(self, e)
	end

	# Conjunction with `e` (or).
	#
	# ~~~
	# var a = new LVar("a")
	# var b = new LVar("b")
	# assert (a&b).to_s == "(a & b)"
	# ~~~
	#
	# `true` and `false` operands are optimized.
	#
	# ~~~
	# assert (a&ltrue) == a
	# assert (a&lfalse).is_f
	# ~~~
	fun &(e: LExpr): LExpr do
		if self.is_f then return lfalse
		if self.is_t then return e
		if e.is_f then return lfalse
		if e.is_t then return self
		return new LAnd(self, e)
	end

	# Implication with `e` (implies).
	#
	# Note: it is transformed with conjunctions and disjunctions.
	#
	# ~~~
	# var a = new LVar("a")
	# var b = new LVar("b")
	# assert a.imp(b).to_s == "(~a | b)"
	# ~~~
	fun imp(e: LExpr): LExpr
	do
		return (~self) | e
	end

	# Exclusive disjunction with `e` (xor).
	#
	# Note: it is transformed with conjunctions and disjunctions.
	#
	# ~~~
	# var a = new LVar("a")
	# var b = new LVar("b")
	# assert (a^b).to_s == "((a & ~b) | (~a & b))"
	# ~~~
	fun ^(e: LExpr): LExpr
	do
		return (self & ~e) | (~self & e)
	end

	# The negation normal form (NNF).
	#
	# In NNF, the negation operator is only applied to variables.
	#
	# ~~~
	# var a = new LVar("a")
	# var b = new LVar("b")
	# assert (a&b).nnf.to_s == "(a & b)"
	# assert (~(a&b)).nnf.to_s == "(~a | ~b)"
	# ~~~
	#
	# Subclasses implement it recursively.
	fun nnf: LExpr do return self

	# The negative negation normal form (NNF).
	#
	# This method is used to implement `nnf`.
	# Basically, it returns the NNF of `~self`.
	#
	# ~~~
	# var a = new LVar("a")
	# var b = new LVar("b")
	# assert (a&b).nnnf.to_s == "(~a | ~b)"
	# ~~~
	#
	# Subclasses implements it by using De Morgan's laws to push negation inwards.
	fun nnnf: LExpr do return ~self

	# Compute a conjunctive normal form.
	#
	# By default, a unique *equivalent* formula is computed (but its size might be exponential).
	#
	# ~~~
	# var a = new LVar("a")
	# var b = new LVar("b")
	# var c = new LVar("c")
	#
	# var ex = a | (b & c)
	# assert ex.cnf.to_s == "(a|b) & (a|c)"
	# assert (~ex).cnf.to_s == "(~a) & (~b|~c)"
	# ~~~
	#
	# If a parameter `vars` is given, an *equisatisfiable* formula is computed.
	# Additional variables, named `zzsomething`, are created by the transformation and stored in `vars`.
	fun cnf(vars: nullable Array[LVar]): CNF do
		var ss = new CNF
		var s = new Set[LExpr]
		ss.data.add s
		s.add self
		return ss
	end

	# The size of the logical expression.
	fun size: Int do return 1
end
lib/logic/lexpr.nit:47,1--207,3