SlideShare a Scribd company logo
1 of 113
Download to read offline
COMP 213
Advanced Object-oriented Programming
Lecture 13
Propositional
Logic
Task
Develop a program that:
allows a user to enter a string representing a term in
propositional logic;
prints out the term with minimal and maximal brackets;
prints out a truth table for the term.
(actually, we won’t have time for the third one)
Task
Develop a program that:
allows a user to enter a string representing a term in
propositional logic;
prints out the term with minimal and maximal brackets;
prints out a truth table for the term.
(actually, we won’t have time for the third one)
Propositional Logic
Propositional logic is the logic of truth and reasoning. It is
concerned with how some statements follow logically from
other statements to form logical arguments.
It was first systematically studied by Aristotle, and is still of
interest in philosophical logic (mainly as one of the simplest
non-trivial logics).
It is also relevant to Computer Science as the basis of Boolean
logic.
George Boole, 1815–1864
In 1854, Boole published An
Investigation into the Laws of
Thought, on Which are founded the
Mathematical Theories of Logic and
Probabilities.
This work related logical operators and binary arithmetic, and is
the basis for what is now called Boolean logic
(which is actually just another name for Propositional Logic).
Propositional Logic
Propositional Logic is a language consisting of terms that are
built from variables, the constants true and false, and Boolean
operators (‘not’, ‘and’, ’or’, etc.).
In BNF:
Prop ::= Var | true | false | not Prop |
Prop and Prop | Prop or Prop |
Prop implies Prop
Var ::= ’A | ’B | ’C | · · ·
There is a reason for the single quotes before the variables . . . :
we’ll use one of Maude’s built-in types for these.
Propositional Logic
Propositional Logic is a language consisting of terms that are
built from variables, the constants true and false, and Boolean
operators (‘not’, ‘and’, ’or’, etc.).
In BNF:
Prop ::= Var | true | false | not Prop |
Prop and Prop | Prop or Prop |
Prop implies Prop
Var ::= ’A | ’B | ’C | · · ·
There is a reason for the single quotes before the variables . . . :
we’ll use one of Maude’s built-in types for these.
Propositional Logic
Propositional Logic is a language consisting of terms that are
built from variables, the constants true and false, and Boolean
operators (‘not’, ‘and’, ’or’, etc.).
In BNF:
Prop ::= Var | true | false | not Prop |
Prop and Prop | Prop or Prop |
Prop implies Prop
Var ::= ’A | ’B | ’C | · · ·
There is a reason for the single quotes before the variables . . . :
we’ll use one of Maude’s built-in types for these.
Propositional ADT
Propositions also form an Abstract Data Type.
The propositions themselves are the abstract data values.
The operations are the constants (variables, true, false) and the
operators (not, and, or, implies).
We’ll specify this ADT in Maude, then implement it in Java.
Propositional ADT
Propositions also form an Abstract Data Type.
The propositions themselves are the abstract data values.
The operations are the constants (variables, true, false) and the
operators (not, and, or, implies).
We’ll specify this ADT in Maude, then implement it in Java.
Propositional ADT
Propositions also form an Abstract Data Type.
The propositions themselves are the abstract data values.
The operations are the constants (variables, true, false) and the
operators (not, and, or, implies).
We’ll specify this ADT in Maude, then implement it in Java.
Propositional ADT
Propositions also form an Abstract Data Type.
The propositions themselves are the abstract data values.
The operations are the constants (variables, true, false) and the
operators (not, and, or, implies).
We’ll specify this ADT in Maude, then implement it in Java.
Maude, Maude, Maude
file: PropLog.maude
fmod PROP LOGIC is
*** import Maude’s quoted identifiers,
*** renaming the sort Qid to PVar (for "Propositional Variable")
protecting QID *(sort Qid to PVar) .
Maude’s built-in module QID declares a sort Qid of ‘quoted
identifiers’; these are very like strings, except rather than being
enclosed in double quotes ("), they are preceded by a single
closing quote (’). E.g., ’a, ’aa, ’abc, etc.
This simply means that the sort Qid is now called PVar
Maude, Maude, Maude
file: PropLog.maude
fmod PROP LOGIC is
*** import Maude’s quoted identifiers,
*** renaming the sort Qid to PVar (for "Propositional Variable")
protecting QID *(sort Qid to PVar) .
Maude’s built-in module QID declares a sort Qid of ‘quoted
identifiers’; these are very like strings, except rather than being
enclosed in double quotes ("), they are preceded by a single
closing quote (’). E.g., ’a, ’aa, ’abc, etc.
This simply means that the sort Qid is now called PVar
Maude, Maude, Maude
file: PropLog.maude
fmod PROP LOGIC is
*** import Maude’s quoted identifiers,
*** renaming the sort Qid to PVar (for "Propositional Variable")
protecting QID *(sort Qid to PVar) .
Maude’s built-in module QID declares a sort Qid of ‘quoted
identifiers’; these are very like strings, except rather than being
enclosed in double quotes ("), they are preceded by a single
closing quote (’). E.g., ’a, ’aa, ’abc, etc.
This simply means that the sort Qid is now called PVar
Maude, Maude, Maude
file: PropLog.maude
fmod PROP LOGIC is
*** import Maude’s quoted identifiers,
*** renaming the sort Qid to PVar (for "Propositional Variable")
protecting QID *(sort Qid to PVar) .
Maude’s built-in module QID declares a sort Qid of ‘quoted
identifiers’; these are very like strings, except rather than being
enclosed in double quotes ("), they are preceded by a single
closing quote (’). E.g., ’a, ’aa, ’abc, etc.
This simply means that the sort Qid is now called PVar
Maude, Maude, Maude
file: PropLog.maude
fmod PROP LOGIC is
*** import Maude’s quoted identifiers,
*** renaming the sort Qid to PVar (for "Propositional Variable")
protecting QID *(sort Qid to PVar) .
Maude’s built-in module QID declares a sort Qid of ‘quoted
identifiers’; these are very like strings, except rather than being
enclosed in double quotes ("), they are preceded by a single
closing quote (’). E.g., ’a, ’aa, ’abc, etc.
This simply means that the sort Qid is now called PVar
Maude, Maude, Maude
file: PropLog.maude
fmod PROP LOGIC is
*** import Maude’s quoted identifiers,
*** renaming the sort Qid to PVar (for "Propositional Variable")
protecting QID *(sort Qid to PVar) .
Maude’s built-in module QID declares a sort Qid of ‘quoted
identifiers’; these are very like strings, except rather than being
enclosed in double quotes ("), they are preceded by a single
closing quote (’). E.g., ’a, ’aa, ’abc, etc.
This simply means that the sort Qid is now called PVar
Maude, Maude, Maude
file: PropLog.maude
fmod PROP LOGIC is
*** import Maude’s quoted identifiers,
*** renaming the sort Qid to PVar (for "Propositional Variable")
protecting QID *(sort Qid to PVar) .
Maude’s built-in module QID declares a sort Qid of ‘quoted
identifiers’; these are very like strings, except rather than being
enclosed in double quotes ("), they are preceded by a single
closing quote (’). E.g., ’a, ’aa, ’abc, etc.
This simply means that the sort Qid is now called PVar
Maude, Maude, Maude
file: PropLog.maude
fmod PROP LOGIC is
*** import Maude’s quoted identifiers,
*** renaming the sort Qid to PVar (for "Propositional Variable")
protecting QID *(sort Qid to PVar) .
Maude’s built-in module QID declares a sort Qid of ‘quoted
identifiers’; these are very like strings, except rather than being
enclosed in double quotes ("), they are preceded by a single
closing quote (’). E.g., ’a, ’aa, ’abc, etc.
This simply means that the sort Qid is now called PVar
More Maude
file PropLog.maude
*** propositions
sort Prop .
*** every variable is a proposition
subsort PVar < Prop .
NB this is Maude, not Java; subsorts are not the same thing as
inheritance — we’re not suggesting
class Prop extends PVar { ... }
but it does mean that PVars can be used whenever a Prop is
expected.
More Maude
file PropLog.maude
*** propositions
sort Prop .
*** every variable is a proposition
subsort PVar < Prop .
NB this is Maude, not Java; subsorts are not the same thing as
inheritance — we’re not suggesting
class Prop extends PVar { ... }
but it does mean that PVars can be used whenever a Prop is
expected.
More Maude
file PropLog.maude
*** propositions
sort Prop .
*** every variable is a proposition
subsort PVar < Prop .
NB this is Maude, not Java; subsorts are not the same thing as
inheritance — we’re not suggesting
class Prop extends PVar { ... }
but it does mean that PVars can be used whenever a Prop is
expected.
More Maude
file PropLog.maude
*** propositions
sort Prop .
*** every variable is a proposition
subsort PVar < Prop .
NB this is Maude, not Java; subsorts are not the same thing as
inheritance — we’re not suggesting
class Prop extends PVar { ... }
but it does mean that PVars can be used whenever a Prop is
expected.
More Maude
file PropLog.maude
*** propositions
sort Prop .
*** every variable is a proposition
subsort PVar < Prop .
NB this is Maude, not Java; subsorts are not the same thing as
inheritance — we’re not suggesting
class Prop extends PVar { ... }
but it does mean that PVars can be used whenever a Prop is
expected.
More Maude
file: PropLog.maude
ops true false : -> Prop .
op and : Prop Prop -> Prop .
op or : Prop Prop -> Prop .
op implies : Prop Prop -> Prop .
op not : Prop -> Prop .
Note: one underscore for each argument
The first three operations are infix; ‘not’ is prefix
Example propositions:
not ’a and ’b implies ’c or true
More Maude
file: PropLog.maude
ops true false : -> Prop .
op and : Prop Prop -> Prop .
op or : Prop Prop -> Prop .
op implies : Prop Prop -> Prop .
op not : Prop -> Prop .
Note: one underscore for each argument
The first three operations are infix; ‘not’ is prefix
Example propositions:
not ’a and ’b implies ’c or true
More Maude
file: PropLog.maude
ops true false : -> Prop .
op and : Prop Prop -> Prop .
op or : Prop Prop -> Prop .
op implies : Prop Prop -> Prop .
op not : Prop -> Prop .
Note: one underscore for each argument
The first three operations are infix; ‘not’ is prefix
Example propositions:
not ’a and ’b implies ’c or true
More Maude
file: PropLog.maude
ops true false : -> Prop .
op and : Prop Prop -> Prop .
op or : Prop Prop -> Prop .
op implies : Prop Prop -> Prop .
op not : Prop -> Prop .
Note: one underscore for each argument
The first three operations are infix; ‘not’ is prefix
Example propositions:
not ’a and ’b implies ’c or true
More Maude
file: PropLog.maude
ops true false : -> Prop .
op and : Prop Prop -> Prop .
op or : Prop Prop -> Prop .
op implies : Prop Prop -> Prop .
op not : Prop -> Prop .
Note: one underscore for each argument
The first three operations are infix; ‘not’ is prefix
Example propositions:
not ’a and ’b implies ’c or true
More Maude
file: PropLog.maude
ops true false : -> Prop .
op and : Prop Prop -> Prop .
op or : Prop Prop -> Prop .
op implies : Prop Prop -> Prop .
op not : Prop -> Prop .
Note: one underscore for each argument
The first three operations are infix; ‘not’ is prefix
Example propositions:
not ’a and ’b implies ’c or true
More Maude
file: PropLog.maude
ops true false : -> Prop .
op and : Prop Prop -> Prop .
op or : Prop Prop -> Prop .
op implies : Prop Prop -> Prop .
op not : Prop -> Prop .
Note: one underscore for each argument
The first three operations are infix; ‘not’ is prefix
Example propositions:
not ’a and ’b implies ’c or true
More Maude
file: PropLog.maude
ops true false : -> Prop .
op and : Prop Prop -> Prop .
op or : Prop Prop -> Prop .
op implies : Prop Prop -> Prop .
op not : Prop -> Prop .
Note: one underscore for each argument
The first three operations are infix; ‘not’ is prefix
Example propositions:
not ’a and ’b implies ’c or true
More Maude
file: PropLog.maude
ops true false : -> Prop .
op and : Prop Prop -> Prop .
op or : Prop Prop -> Prop .
op implies : Prop Prop -> Prop .
op not : Prop -> Prop .
Note: one underscore for each argument
The first three operations are infix; ‘not’ is prefix
Example propositions:
not ’a and ’b implies ’c or true
More Maude
file: PropLog.maude
ops true false : -> Prop .
op and : Prop Prop -> Prop .
op or : Prop Prop -> Prop .
op implies : Prop Prop -> Prop .
op not : Prop -> Prop .
Note: one underscore for each argument
The first three operations are infix; ‘not’ is prefix
Example propositions:
not ’a and ’b implies ’c or true
More Examples of Terms
’a
true
not ’a
not false
’a and true
’a and not ’b
’c or ’a and not ’b
not ’c implies not ’b and not not ’a
As we can see from the last two examples, terms can be
ambiguous:
(’c or ’a) and not ’b / ’c or (’a and not ’b)
More Examples of Terms
’a
true
not ’a
not false
’a and true
’a and not ’b
’c or ’a and not ’b
not ’c implies not ’b and not not ’a
As we can see from the last two examples, terms can be
ambiguous:
(’c or ’a) and not ’b / ’c or (’a and not ’b)
(Brackets)
We can use brackets to disambiguate terms; e.g.,
(’c or ’a) and not ’b
We can also use conventions so that we sometimes don’t need
brackets to disambiguate terms:
we give a precedence to each operator; operations with a low
precedence are more tightly binding.
file: PropLog.maude
op and : Prop Prop -> Prop [prec 40] .
op or : Prop Prop -> Prop [prec 44] .
op implies : Prop Prop -> Prop [prec 48] .
op not : Prop -> Prop [prec 30] .
(Brackets)
We can use brackets to disambiguate terms; e.g.,
(’c or ’a) and not ’b
We can also use conventions so that we sometimes don’t need
brackets to disambiguate terms:
we give a precedence to each operator; operations with a low
precedence are more tightly binding.
file: PropLog.maude
op and : Prop Prop -> Prop [prec 40] .
op or : Prop Prop -> Prop [prec 44] .
op implies : Prop Prop -> Prop [prec 48] .
op not : Prop -> Prop [prec 30] .
(Brackets)
We can use brackets to disambiguate terms; e.g.,
(’c or ’a) and not ’b
We can also use conventions so that we sometimes don’t need
brackets to disambiguate terms:
we give a precedence to each operator; operations with a low
precedence are more tightly binding.
file: PropLog.maude
op and : Prop Prop -> Prop [prec 40] .
op or : Prop Prop -> Prop [prec 44] .
op implies : Prop Prop -> Prop [prec 48] .
op not : Prop -> Prop [prec 30] .
Examples
Term Means
’a and ’b or ’c (’a and ’b) or ’c
not ’a and ’b implies ’c ((not ’a) and ’b) implies ’c
not ’a and (’b implies ’c) (not ’a) and (’b implies ’c)
’a and ’b or ’c implies ’d ((’a and ’b) or ’c) implies ’d
This disambiguates terms with different operators
but what about terms with the same operators, e.g.
’a and ’b and ’c ?
Examples
Term Means
’a and ’b or ’c (’a and ’b) or ’c
not ’a and ’b implies ’c ((not ’a) and ’b) implies ’c
not ’a and (’b implies ’c) (not ’a) and (’b implies ’c)
’a and ’b or ’c implies ’d ((’a and ’b) or ’c) implies ’d
This disambiguates terms with different operators
but what about terms with the same operators, e.g.
’a and ’b and ’c ?
Associativity
We will adopt the convention that binary operators are
right-associative. I.e.,
Term Means
’a or ’b or ’c or ’d or ’e ’a or (’b or (’c or (’d or ’e)))
’a and ’b and ’c and ’d ’a and (’b and (’c and ’d))
’a implies ’b implies ’c ’a implies (’b implies ’c)
etc.
Associativity
In fact, we will use a semantic property of and and or (called
associativity), which says that any way of bracketing
’a and ’b and ’c and ’d
gives the same result, so we can omit brackets entirely
(and similarly for or).
file: PropLog.maude
op and : Prop Prop -> Prop [assoc prec 40] .
op or : Prop Prop -> Prop [assoc prec 44] .
op implies : Prop Prop -> Prop [prec 48] .
op not : Prop -> Prop [prec 30] .
Associativity
In fact, we will use a semantic property of and and or (called
associativity), which says that any way of bracketing
’a and ’b and ’c and ’d
gives the same result, so we can omit brackets entirely
(and similarly for or).
file: PropLog.maude
op and : Prop Prop -> Prop [assoc prec 40] .
op or : Prop Prop -> Prop [assoc prec 44] .
op implies : Prop Prop -> Prop [prec 48] .
op not : Prop -> Prop [prec 30] .
Printing with Brackets
We still need to specify operations to print with maximal and
minimal bracketing.
file: PropLog.maude
op printAllBrackets : Prop -> String .
We specify what this operation does by considering what its
arguments may be: a PVar, true, false, or a term built from the
other four operations (and, or, implies, not).
Printing with Brackets
We still need to specify operations to print with maximal and
minimal bracketing.
file: PropLog.maude
op printAllBrackets : Prop -> String .
We specify what this operation does by considering what its
arguments may be: a PVar, true, false, or a term built from the
other four operations (and, or, implies, not).
Printing with Brackets
file: PropLog.maude
eq printAllBrackets(true) = "(true)" .
eq printAllBrackets(false) = "(false)" .
var V : PVar .
eq printAllBrackets(V) = "(" + string(V) + ")" .
module QID
op string : Qid -> String .
module QID *(sort Qid to PVar)
op string : PVar -> String .
e.g., string(’example) = "example"
Printing with Brackets
file: PropLog.maude
eq printAllBrackets(true) = "(true)" .
eq printAllBrackets(false) = "(false)" .
var V : PVar .
eq printAllBrackets(V) = "(" + string(V) + ")" .
module QID
op string : Qid -> String .
module QID *(sort Qid to PVar)
op string : PVar -> String .
e.g., string(’example) = "example"
Printing with Brackets
file: PropLog.maude
eq printAllBrackets(true) = "(true)" .
eq printAllBrackets(false) = "(false)" .
var V : PVar .
eq printAllBrackets(V) = "(" + string(V) + ")" .
module QID
op string : Qid -> String .
module QID *(sort Qid to PVar)
op string : PVar -> String .
e.g., string(’example) = "example"
Printing with Brackets
file: PropLog.maude
eq printAllBrackets(true) = "(true)" .
eq printAllBrackets(false) = "(false)" .
var V : PVar .
eq printAllBrackets(V) = "(" + string(V) + ")" .
module QID
op string : Qid -> String .
module QID *(sort Qid to PVar)
op string : PVar -> String .
e.g., string(’example) = "example"
Printing with Brackets
file: PropLog.maude
eq printAllBrackets(true) = "(true)" .
eq printAllBrackets(false) = "(false)" .
var V : PVar .
eq printAllBrackets(V) = "(" + string(V) + ")" .
module QID
op string : Qid -> String .
module QID *(sort Qid to PVar)
op string : PVar -> String .
e.g., string(’example) = "example"
Printing with Brackets
file: PropLog.maude
eq printAllBrackets(true) = "(true)" .
eq printAllBrackets(false) = "(false)" .
var V : PVar .
eq printAllBrackets(V) = "(" + string(V) + ")" .
module QID
op string : Qid -> String .
module QID *(sort Qid to PVar)
op string : PVar -> String .
e.g., string(’example) = "example"
Printing with Brackets
file: PropLog.maude
eq printAllBrackets(true) = "(true)" .
eq printAllBrackets(false) = "(false)" .
var V : PVar .
eq printAllBrackets(V) = "(" + string(V) + ")" .
module QID
op string : Qid -> String .
module QID *(sort Qid to PVar)
op string : PVar -> String .
e.g., string(’example) = "example"
Printing with Brackets
file: PropLog.maude
eq printAllBrackets(true) = "(true)" .
eq printAllBrackets(false) = "(false)" .
var V : PVar .
eq printAllBrackets(V) = "(" + string(V) + ")" .
module QID
op string : Qid -> String .
module QID *(sort Qid to PVar)
op string : PVar -> String .
e.g., string(’example) = "example"
Printing with Brackets
file: PropLog.maude
eq printAllBrackets(true) = "(true)" .
eq printAllBrackets(false) = "(false)" .
var V : PVar .
eq printAllBrackets(V) = "(" + string(V) + ")" .
module QID
op string : Qid -> String .
module QID *(sort Qid to PVar)
op string : PVar -> String .
e.g., string(’example) = "example"
Printing with Brackets
file: PropLog.maude
vars P P1 P2 : Prop .
eq printAllBrackets(P1 and P2) =
"(" + printAllBrackets(P1) + " and "
+ printAllBrackets(P2) + ")" .
*** similarly for ‘or’ and ‘implies’
. . .
eq printAllBrackets(not P) = "(not " + printAllBrackets(P) + ")" .
Printing with Brackets
file: PropLog.maude
vars P P1 P2 : Prop .
eq printAllBrackets(P1 and P2) =
"(" + printAllBrackets(P1) + " and "
+ printAllBrackets(P2) + ")" .
*** similarly for ‘or’ and ‘implies’
. . .
eq printAllBrackets(not P) = "(not " + printAllBrackets(P) + ")" .
Printing with Brackets
file: PropLog.maude
vars P P1 P2 : Prop .
eq printAllBrackets(P1 and P2) =
"(" + printAllBrackets(P1) + " and "
+ printAllBrackets(P2) + ")" .
*** similarly for ‘or’ and ‘implies’
. . .
eq printAllBrackets(not P) = "(not " + printAllBrackets(P) + ")" .
Printing with Brackets
file: PropLog.maude
vars P P1 P2 : Prop .
eq printAllBrackets(P1 and P2) =
"(" + printAllBrackets(P1) + " and "
+ printAllBrackets(P2) + ")" .
*** similarly for ‘or’ and ‘implies’
. . .
eq printAllBrackets(not P) = "(not " + printAllBrackets(P) + ")" .
Printing with Brackets
file: PropLog.maude
vars P P1 P2 : Prop .
eq printAllBrackets(P1 and P2) =
"(" + printAllBrackets(P1) + " and "
+ printAllBrackets(P2) + ")" .
*** similarly for ‘or’ and ‘implies’
. . .
eq printAllBrackets(not P) = "(not " + printAllBrackets(P) + ")" .
Printing with Brackets
file: PropLog.maude
vars P P1 P2 : Prop .
eq printAllBrackets(P1 and P2) =
"(" + printAllBrackets(P1) + " and "
+ printAllBrackets(P2) + ")" .
*** similarly for ‘or’ and ‘implies’
. . .
eq printAllBrackets(not P) = "(not " + printAllBrackets(P) + ")" .
Printing with Brackets
file: PropLog.maude
vars P P1 P2 : Prop .
eq printAllBrackets(P1 and P2) =
"(" + printAllBrackets(P1) + " and "
+ printAllBrackets(P2) + ")" .
*** similarly for ‘or’ and ‘implies’
. . .
eq printAllBrackets(not P) = "(not " + printAllBrackets(P) + ")" .
Printing with Minimal Brackets
file: PropLog.maude
op toString : Prop -> String .
eq toString(true) = "true" .
eq toString(false) = "false" .
eq toString(V) = string(V) .
eq toString(P1 and P2) = ? .
If we just write
eq toString(P1 and P2) = toString(P1) + " and " + toString(P2) .
(and similarly for or, implies, not)
then we’ll never get any brackets anywhere.
Printing with Minimal Brackets
file: PropLog.maude
op toString : Prop -> String .
eq toString(true) = "true" .
eq toString(false) = "false" .
eq toString(V) = string(V) .
eq toString(P1 and P2) = ? .
If we just write
eq toString(P1 and P2) = toString(P1) + " and " + toString(P2) .
(and similarly for or, implies, not)
then we’ll never get any brackets anywhere.
Printing with Minimal Brackets
file: PropLog.maude
op toString : Prop -> String .
eq toString(true) = "true" .
eq toString(false) = "false" .
eq toString(V) = string(V) .
eq toString(P1 and P2) = ? .
If we just write
eq toString(P1 and P2) = toString(P1) + " and " + toString(P2) .
(and similarly for or, implies, not)
then we’ll never get any brackets anywhere.
Printing with Minimal Brackets
file: PropLog.maude
op toString : Prop -> String .
eq toString(true) = "true" .
eq toString(false) = "false" .
eq toString(V) = string(V) .
eq toString(P1 and P2) = ? .
If we just write
eq toString(P1 and P2) = toString(P1) + " and " + toString(P2) .
(and similarly for or, implies, not)
then we’ll never get any brackets anywhere.
Printing with Minimal Brackets
file: PropLog.maude
op toString : Prop -> String .
eq toString(true) = "true" .
eq toString(false) = "false" .
eq toString(V) = string(V) .
eq toString(P1 and P2) = ? .
If we just write
eq toString(P1 and P2) = toString(P1) + " and " + toString(P2) .
(and similarly for or, implies, not)
then we’ll never get any brackets anywhere.
Printing with Minimal Brackets
file: PropLog.maude
op toString : Prop -> String .
eq toString(true) = "true" .
eq toString(false) = "false" .
eq toString(V) = string(V) .
eq toString(P1 and P2) = ? .
If we just write
eq toString(P1 and P2) = toString(P1) + " and " + toString(P2) .
(and similarly for or, implies, not)
then we’ll never get any brackets anywhere.
Printing with Minimal Brackets
file: PropLog.maude
op toString : Prop -> String .
eq toString(true) = "true" .
eq toString(false) = "false" .
eq toString(V) = string(V) .
eq toString(P1 and P2) = ? .
If we just write
eq toString(P1 and P2) = toString(P1) + " and " + toString(P2) .
(and similarly for or, implies, not)
then we’ll never get any brackets anywhere.
Printing with Minimal Brackets
file: PropLog.maude
eq toString(P1 and P2) = ? .
If P1 is of the form P3 and P4, then we don’t need brackets
around the first argument.
E.g.,
toString(’a and ’b and ’c) = "’a and ’b and ’c" .
But if P1 is of the form P3 or P4, then we do need brackets
around the first argument.
E.g.,
toString(’a or ’b and ’c) = "(’a or ’b) and ’c" .
Printing with Minimal Brackets
file: PropLog.maude
eq toString(P1 and P2) = ? .
If P1 is of the form P3 and P4, then we don’t need brackets
around the first argument.
E.g.,
toString(’a and ’b and ’c) = "’a and ’b and ’c" .
But if P1 is of the form P3 or P4, then we do need brackets
around the first argument.
E.g.,
toString(’a or ’b and ’c) = "(’a or ’b) and ’c" .
Printing with Minimal Brackets
file: PropLog.maude
eq toString(P1 and P2) = ? .
If P1 is of the form P3 and P4, then we don’t need brackets
around the first argument.
E.g.,
toString(’a and ’b and ’c) = "’a and ’b and ’c" .
But if P1 is of the form P3 or P4, then we do need brackets
around the first argument.
E.g.,
toString(’a or ’b and ’c) = "(’a or ’b) and ’c" .
Printing with Minimal Brackets
In the second case, brackets were needed because or has
lower precedence than and.
We’ll add an extra parameter that represents ‘the precedence
of the operator above a term’.
This gives us exactly the information we need in order to decide
whether an operand requires brackets around it.
file: PropLog.maude
*** put brackets around the proposition if the precedence of
*** its main operator is greater than the given integer
op toStringPrec : Prop Int -> String .
Printing with Minimal Brackets
In the second case, brackets were needed because or has
lower precedence than and.
We’ll add an extra parameter that represents ‘the precedence
of the operator above a term’.
This gives us exactly the information we need in order to decide
whether an operand requires brackets around it.
file: PropLog.maude
*** put brackets around the proposition if the precedence of
*** its main operator is greater than the given integer
op toStringPrec : Prop Int -> String .
Printing with Minimal Brackets
In the second case, brackets were needed because or has
lower precedence than and.
We’ll add an extra parameter that represents ‘the precedence
of the operator above a term’.
This gives us exactly the information we need in order to decide
whether an operand requires brackets around it.
file: PropLog.maude
*** put brackets around the proposition if the precedence of
*** its main operator is greater than the given integer
op toStringPrec : Prop Int -> String .
Printing with Minimal Brackets
In the second case, brackets were needed because or has
lower precedence than and.
We’ll add an extra parameter that represents ‘the precedence
of the operator above a term’.
This gives us exactly the information we need in order to decide
whether an operand requires brackets around it.
file: PropLog.maude
*** put brackets around the proposition if the precedence of
*** its main operator is greater than the given integer
op toStringPrec : Prop Int -> String .
Printing with Minimal Brackets
file: PropLog.maude
*** no operator has precedence greater than 48,
*** so no outermost brackets
eq toString(P) = toStringPrec(P, 48) .
var I : Int .
eq toStringPrec(true, I) = "true" .
eq toStringPrec(false, I) = "false" .
eq toStringPrec(V, I) = string(V) .
Printing with Minimal Brackets
file: PropLog.maude
*** no operator has precedence greater than 48,
*** so no outermost brackets
eq toString(P) = toStringPrec(P, 48) .
var I : Int .
eq toStringPrec(true, I) = "true" .
eq toStringPrec(false, I) = "false" .
eq toStringPrec(V, I) = string(V) .
Printing with Minimal Brackets
file: PropLog.maude
*** no operator has precedence greater than 48,
*** so no outermost brackets
eq toString(P) = toStringPrec(P, 48) .
var I : Int .
eq toStringPrec(true, I) = "true" .
eq toStringPrec(false, I) = "false" .
eq toStringPrec(V, I) = string(V) .
Printing with Minimal Brackets
file: PropLog.maude
*** no operator has precedence greater than 48,
*** so no outermost brackets
eq toString(P) = toStringPrec(P, 48) .
var I : Int .
eq toStringPrec(true, I) = "true" .
eq toStringPrec(false, I) = "false" .
eq toStringPrec(V, I) = string(V) .
Printing with Minimal Brackets
file: PropLog.maude
cq toStringPrec(P1 and P2, I) =
toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40)
if I >= 40 . *** no brackets needed
cq toStringPrec(P1 and P2, I) =
"(" + toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40)
+ ")"
if I < 40 . *** brackets are needed
so P1 and P2 will have brackets if needed
similarly for or and not
Printing with Minimal Brackets
file: PropLog.maude
cq toStringPrec(P1 and P2, I) =
toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40)
if I >= 40 . *** no brackets needed
cq toStringPrec(P1 and P2, I) =
"(" + toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40)
+ ")"
if I < 40 . *** brackets are needed
so P1 and P2 will have brackets if needed
similarly for or and not
Printing with Minimal Brackets
file: PropLog.maude
cq toStringPrec(P1 and P2, I) =
toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40)
if I >= 40 . *** no brackets needed
cq toStringPrec(P1 and P2, I) =
"(" + toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40)
+ ")"
if I < 40 . *** brackets are needed
so P1 and P2 will have brackets if needed
similarly for or and not
Printing with Minimal Brackets
file: PropLog.maude
cq toStringPrec(P1 and P2, I) =
toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40)
if I >= 40 . *** no brackets needed
cq toStringPrec(P1 and P2, I) =
"(" + toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40)
+ ")"
if I < 40 . *** brackets are needed
so P1 and P2 will have brackets if needed
similarly for or and not
Printing with Minimal Brackets
file: PropLog.maude
cq toStringPrec(P1 and P2, I) =
toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40)
if I >= 40 . *** no brackets needed
cq toStringPrec(P1 and P2, I) =
"(" + toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40)
+ ")"
if I < 40 . *** brackets are needed
so P1 and P2 will have brackets if needed
similarly for or and not
Printing with Minimal Brackets
file: PropLog.maude
cq toStringPrec(P1 and P2, I) =
toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40)
if I >= 40 . *** no brackets needed
cq toStringPrec(P1 and P2, I) =
"(" + toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40)
+ ")"
if I < 40 . *** brackets are needed
so P1 and P2 will have brackets if needed
similarly for or and not
Printing with Minimal Brackets
file: PropLog.maude
cq toStringPrec(P1 and P2, I) =
toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40)
if I >= 40 . *** no brackets needed
cq toStringPrec(P1 and P2, I) =
"(" + toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40)
+ ")"
if I < 40 . *** brackets are needed
so P1 and P2 will have brackets if needed
similarly for or and not
Printing with Minimal Brackets
file: PropLog.maude
cq toStringPrec(P1 and P2, I) =
toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40)
if I >= 40 . *** no brackets needed
cq toStringPrec(P1 and P2, I) =
"(" + toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40)
+ ")"
if I < 40 . *** brackets are needed
so P1 and P2 will have brackets if needed
similarly for or and not
Printing with Minimal Brackets
file: PropLog.maude
cq toStringPrec(P1 and P2, I) =
toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40)
if I >= 40 . *** no brackets needed
cq toStringPrec(P1 and P2, I) =
"(" + toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40)
+ ")"
if I < 40 . *** brackets are needed
so P1 and P2 will have brackets if needed
similarly for or and not
Printing with Minimal Brackets
file: PropLog.maude
cq toStringPrec(P1 implies P2, I) =
toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48)
if I >= 48 . *** no brackets needed
cq toStringPrec(P1 implies P2, I) =
"(" + toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48)
+ ")"
if I < 48 . *** brackets are needed
This gives us right associativity:
P1 will have brackets round it if its main operator is ‘implies’;
P2 will not
Printing with Minimal Brackets
file: PropLog.maude
cq toStringPrec(P1 implies P2, I) =
toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48)
if I >= 48 . *** no brackets needed
cq toStringPrec(P1 implies P2, I) =
"(" + toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48)
+ ")"
if I < 48 . *** brackets are needed
This gives us right associativity:
P1 will have brackets round it if its main operator is ‘implies’;
P2 will not
Printing with Minimal Brackets
file: PropLog.maude
cq toStringPrec(P1 implies P2, I) =
toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48)
if I >= 48 . *** no brackets needed
cq toStringPrec(P1 implies P2, I) =
"(" + toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48)
+ ")"
if I < 48 . *** brackets are needed
This gives us right associativity:
P1 will have brackets round it if its main operator is ‘implies’;
P2 will not
Printing with Minimal Brackets
file: PropLog.maude
cq toStringPrec(P1 implies P2, I) =
toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48)
if I >= 48 . *** no brackets needed
cq toStringPrec(P1 implies P2, I) =
"(" + toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48)
+ ")"
if I < 48 . *** brackets are needed
This gives us right associativity:
P1 will have brackets round it if its main operator is ‘implies’;
P2 will not
Printing with Minimal Brackets
file: PropLog.maude
cq toStringPrec(P1 implies P2, I) =
toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48)
if I >= 48 . *** no brackets needed
cq toStringPrec(P1 implies P2, I) =
"(" + toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48)
+ ")"
if I < 48 . *** brackets are needed
This gives us right associativity:
P1 will have brackets round it if its main operator is ‘implies’;
P2 will not
Printing with Minimal Brackets
file: PropLog.maude
cq toStringPrec(P1 implies P2, I) =
toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48)
if I >= 48 . *** no brackets needed
cq toStringPrec(P1 implies P2, I) =
"(" + toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48)
+ ")"
if I < 48 . *** brackets are needed
This gives us right associativity:
P1 will have brackets round it if its main operator is ‘implies’;
P2 will not
Printing with Minimal Brackets
file: PropLog.maude
cq toStringPrec(P1 implies P2, I) =
toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48)
if I >= 48 . *** no brackets needed
cq toStringPrec(P1 implies P2, I) =
"(" + toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48)
+ ")"
if I < 48 . *** brackets are needed
This gives us right associativity:
P1 will have brackets round it if its main operator is ‘implies’;
P2 will not
Printing with Minimal Brackets
file: PropLog.maude
cq toStringPrec(P1 implies P2, I) =
toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48)
if I >= 48 . *** no brackets needed
cq toStringPrec(P1 implies P2, I) =
"(" + toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48)
+ ")"
if I < 48 . *** brackets are needed
This gives us right associativity:
P1 will have brackets round it if its main operator is ‘implies’;
P2 will not
Maude Interpreter
reduce toString((’a or ’b) and ’c) .
=
toStringPrec((’a or ’b) and ’c, 48)
= *** 48 >= 40; no brackets needed
toStringPrec(’a or ’b, 40) + " and " + toStringPrec(’c, 40)
= *** 40 < 44; brackets are needed
"(" + toStringPrec(’a, 44) + " or " + toStringPrec(’b, 44) + ")"
+ " and " + toStringPrec(’c, 40)
=
"(" + string(’a) + " or " + string(’b) + ")"
+ " and " + string(’c)
=
"(a or b) and c"
Maude Interpreter
reduce toString((’a or ’b) and ’c) .
=
toStringPrec((’a or ’b) and ’c, 48)
= *** 48 >= 40; no brackets needed
toStringPrec(’a or ’b, 40) + " and " + toStringPrec(’c, 40)
= *** 40 < 44; brackets are needed
"(" + toStringPrec(’a, 44) + " or " + toStringPrec(’b, 44) + ")"
+ " and " + toStringPrec(’c, 40)
=
"(" + string(’a) + " or " + string(’b) + ")"
+ " and " + string(’c)
=
"(a or b) and c"
Maude Interpreter
reduce toString((’a or ’b) and ’c) .
=
toStringPrec((’a or ’b) and ’c, 48)
= *** 48 >= 40; no brackets needed
toStringPrec(’a or ’b, 40) + " and " + toStringPrec(’c, 40)
= *** 40 < 44; brackets are needed
"(" + toStringPrec(’a, 44) + " or " + toStringPrec(’b, 44) + ")"
+ " and " + toStringPrec(’c, 40)
=
"(" + string(’a) + " or " + string(’b) + ")"
+ " and " + string(’c)
=
"(a or b) and c"
Maude Interpreter
reduce toString((’a or ’b) and ’c) .
=
toStringPrec((’a or ’b) and ’c, 48)
= *** 48 >= 40; no brackets needed
toStringPrec(’a or ’b, 40) + " and " + toStringPrec(’c, 40)
= *** 40 < 44; brackets are needed
"(" + toStringPrec(’a, 44) + " or " + toStringPrec(’b, 44) + ")"
+ " and " + toStringPrec(’c, 40)
=
"(" + string(’a) + " or " + string(’b) + ")"
+ " and " + string(’c)
=
"(a or b) and c"
Maude Interpreter
reduce toString((’a or ’b) and ’c) .
=
toStringPrec((’a or ’b) and ’c, 48)
= *** 48 >= 40; no brackets needed
toStringPrec(’a or ’b, 40) + " and " + toStringPrec(’c, 40)
= *** 40 < 44; brackets are needed
"(" + toStringPrec(’a, 44) + " or " + toStringPrec(’b, 44) + ")"
+ " and " + toStringPrec(’c, 40)
=
"(" + string(’a) + " or " + string(’b) + ")"
+ " and " + string(’c)
=
"(a or b) and c"
Maude Interpreter
reduce toString((’a or ’b) and ’c) .
=
toStringPrec((’a or ’b) and ’c, 48)
= *** 48 >= 40; no brackets needed
toStringPrec(’a or ’b, 40) + " and " + toStringPrec(’c, 40)
= *** 40 < 44; brackets are needed
"(" + toStringPrec(’a, 44) + " or " + toStringPrec(’b, 44) + ")"
+ " and " + toStringPrec(’c, 40)
=
"(" + string(’a) + " or " + string(’b) + ")"
+ " and " + string(’c)
=
"(a or b) and c"
Maude Interpreter
reduce toString((’a or ’b) and ’c) .
=
toStringPrec((’a or ’b) and ’c, 48)
= *** 48 >= 40; no brackets needed
toStringPrec(’a or ’b, 40) + " and " + toStringPrec(’c, 40)
= *** 40 < 44; brackets are needed
"(" + toStringPrec(’a, 44) + " or " + toStringPrec(’b, 44) + ")"
+ " and " + toStringPrec(’c, 40)
=
"(" + string(’a) + " or " + string(’b) + ")"
+ " and " + string(’c)
=
"(a or b) and c"
Maude Interpreter
reduce toString((’a or ’b) and ’c) .
=
toStringPrec((’a or ’b) and ’c, 48)
= *** 48 >= 40; no brackets needed
toStringPrec(’a or ’b, 40) + " and " + toStringPrec(’c, 40)
= *** 40 < 44; brackets are needed
"(" + toStringPrec(’a, 44) + " or " + toStringPrec(’b, 44) + ")"
+ " and " + toStringPrec(’c, 40)
=
"(" + string(’a) + " or " + string(’b) + ")"
+ " and " + string(’c)
=
"(a or b) and c"
Maude Interpreter
reduce toString((’a or ’b) and ’c) .
=
toStringPrec((’a or ’b) and ’c, 48)
= *** 48 >= 40; no brackets needed
toStringPrec(’a or ’b, 40) + " and " + toStringPrec(’c, 40)
= *** 40 < 44; brackets are needed
"(" + toStringPrec(’a, 44) + " or " + toStringPrec(’b, 44) + ")"
+ " and " + toStringPrec(’c, 40)
=
"(" + string(’a) + " or " + string(’b) + ")"
+ " and " + string(’c)
=
"(a or b) and c"
Maude Interpreter
reduce toString((’a or ’b) and ’c) .
=
toStringPrec((’a or ’b) and ’c, 48)
= *** 48 >= 40; no brackets needed
toStringPrec(’a or ’b, 40) + " and " + toStringPrec(’c, 40)
= *** 40 < 44; brackets are needed
"(" + toStringPrec(’a, 44) + " or " + toStringPrec(’b, 44) + ")"
+ " and " + toStringPrec(’c, 40)
=
"(" + string(’a) + " or " + string(’b) + ")"
+ " and " + string(’c)
=
"(a or b) and c"
Maude Interpreter
reduce toString((’a or ’b) and ’c) .
=
toStringPrec((’a or ’b) and ’c, 48)
= *** 48 >= 40; no brackets needed
toStringPrec(’a or ’b, 40) + " and " + toStringPrec(’c, 40)
= *** 40 < 44; brackets are needed
"(" + toStringPrec(’a, 44) + " or " + toStringPrec(’b, 44) + ")"
+ " and " + toStringPrec(’c, 40)
=
"(" + string(’a) + " or " + string(’b) + ")"
+ " and " + string(’c)
=
"(a or b) and c"
Back to Java
public class Prop {
public Prop and(Prop p1, Prop p2) { ... }
// similarly for ‘or’, etc.
public String printAllBrackets() { ...}
public String toString() { ...}
}
We need a data representation.
Back to Java
public class Prop {
public Prop and(Prop p1, Prop p2) { ... }
// similarly for ‘or’, etc.
public String printAllBrackets() { ...}
public String toString() { ...}
}
We need a data representation.
Back to Java
public class Prop {
public Prop and(Prop p1, Prop p2) { ... }
// similarly for ‘or’, etc.
public String printAllBrackets() { ...}
public String toString() { ...}
}
We need a data representation.
That’s All, Folks!
Summary
sort Prop
Maude equations
helper functions
Next:
data representation

More Related Content

What's hot

Dotnet programming concepts difference faqs- 2
Dotnet programming concepts difference faqs- 2Dotnet programming concepts difference faqs- 2
Dotnet programming concepts difference faqs- 2Umar Ali
 
Android webinar class_java_review
Android webinar class_java_reviewAndroid webinar class_java_review
Android webinar class_java_reviewEdureka!
 
How to get along with implicits
How to get along with implicits How to get along with implicits
How to get along with implicits Taisuke Oe
 
Introduction to Client-Side Javascript
Introduction to Client-Side JavascriptIntroduction to Client-Side Javascript
Introduction to Client-Side JavascriptJulie Iskander
 
Chapter 8 - Exceptions and Assertions Edit summary
Chapter 8 - Exceptions and Assertions  Edit summaryChapter 8 - Exceptions and Assertions  Edit summary
Chapter 8 - Exceptions and Assertions Edit summaryEduardo Bergavera
 
String and string buffer
String and string bufferString and string buffer
String and string bufferkamal kotecha
 
Clean code - Agile Software Craftsmanship
Clean code - Agile Software CraftsmanshipClean code - Agile Software Craftsmanship
Clean code - Agile Software CraftsmanshipYukti Kaura
 
Farhaan Ahmed, BCA 2nd Year
Farhaan Ahmed, BCA 2nd YearFarhaan Ahmed, BCA 2nd Year
Farhaan Ahmed, BCA 2nd Yeardezyneecole
 
L9 wrapper classes
L9 wrapper classesL9 wrapper classes
L9 wrapper classesteach4uin
 
Java 7 new features
Java 7 new featuresJava 7 new features
Java 7 new featuresShivam Goel
 
JAVA Polymorphism
JAVA PolymorphismJAVA Polymorphism
JAVA PolymorphismMahi Mca
 
Kotlin what_you_need_to_know-converted event 4 with nigerians
Kotlin  what_you_need_to_know-converted event 4 with nigeriansKotlin  what_you_need_to_know-converted event 4 with nigerians
Kotlin what_you_need_to_know-converted event 4 with nigeriansjunaidhasan17
 
(4) cpp automatic arrays_pointers_c-strings
(4) cpp automatic arrays_pointers_c-strings(4) cpp automatic arrays_pointers_c-strings
(4) cpp automatic arrays_pointers_c-stringsNico Ludwig
 
Virtual function complete By Abdul Wahab (moon sheikh)
Virtual function complete By Abdul Wahab (moon sheikh)Virtual function complete By Abdul Wahab (moon sheikh)
Virtual function complete By Abdul Wahab (moon sheikh)MoonSheikh1
 

What's hot (20)

wrapper classes
wrapper classeswrapper classes
wrapper classes
 
Dotnet programming concepts difference faqs- 2
Dotnet programming concepts difference faqs- 2Dotnet programming concepts difference faqs- 2
Dotnet programming concepts difference faqs- 2
 
Android webinar class_java_review
Android webinar class_java_reviewAndroid webinar class_java_review
Android webinar class_java_review
 
How to get along with implicits
How to get along with implicits How to get along with implicits
How to get along with implicits
 
Introduction to Client-Side Javascript
Introduction to Client-Side JavascriptIntroduction to Client-Side Javascript
Introduction to Client-Side Javascript
 
Chapter 8 - Exceptions and Assertions Edit summary
Chapter 8 - Exceptions and Assertions  Edit summaryChapter 8 - Exceptions and Assertions  Edit summary
Chapter 8 - Exceptions and Assertions Edit summary
 
Java String
Java String Java String
Java String
 
String and string buffer
String and string bufferString and string buffer
String and string buffer
 
Clean code - Agile Software Craftsmanship
Clean code - Agile Software CraftsmanshipClean code - Agile Software Craftsmanship
Clean code - Agile Software Craftsmanship
 
Wrapper classes
Wrapper classes Wrapper classes
Wrapper classes
 
Farhaan Ahmed, BCA 2nd Year
Farhaan Ahmed, BCA 2nd YearFarhaan Ahmed, BCA 2nd Year
Farhaan Ahmed, BCA 2nd Year
 
Wrapper classes
Wrapper classesWrapper classes
Wrapper classes
 
L9 wrapper classes
L9 wrapper classesL9 wrapper classes
L9 wrapper classes
 
Java 7 new features
Java 7 new featuresJava 7 new features
Java 7 new features
 
JAVA Polymorphism
JAVA PolymorphismJAVA Polymorphism
JAVA Polymorphism
 
Kotlin what_you_need_to_know-converted event 4 with nigerians
Kotlin  what_you_need_to_know-converted event 4 with nigeriansKotlin  what_you_need_to_know-converted event 4 with nigerians
Kotlin what_you_need_to_know-converted event 4 with nigerians
 
(4) cpp automatic arrays_pointers_c-strings
(4) cpp automatic arrays_pointers_c-strings(4) cpp automatic arrays_pointers_c-strings
(4) cpp automatic arrays_pointers_c-strings
 
M C6java3
M C6java3M C6java3
M C6java3
 
Autoboxing And Unboxing In Java
Autoboxing And Unboxing In JavaAutoboxing And Unboxing In Java
Autoboxing And Unboxing In Java
 
Virtual function complete By Abdul Wahab (moon sheikh)
Virtual function complete By Abdul Wahab (moon sheikh)Virtual function complete By Abdul Wahab (moon sheikh)
Virtual function complete By Abdul Wahab (moon sheikh)
 

Viewers also liked (19)

Lo5
Lo5Lo5
Lo5
 
Lo10
Lo10Lo10
Lo10
 
Lo20
Lo20Lo20
Lo20
 
Lo11
Lo11Lo11
Lo11
 
Lo12
Lo12Lo12
Lo12
 
08
0808
08
 
Lo16
Lo16Lo16
Lo16
 
Lo2
Lo2Lo2
Lo2
 
Lo7
Lo7Lo7
Lo7
 
Lo4
Lo4Lo4
Lo4
 
02
0202
02
 
Lo19
Lo19Lo19
Lo19
 
Lo15
Lo15Lo15
Lo15
 
Lo13
Lo13Lo13
Lo13
 
Lo9
Lo9Lo9
Lo9
 
Lo14
Lo14Lo14
Lo14
 
Lo17
Lo17Lo17
Lo17
 
Lo18
Lo18Lo18
Lo18
 
Lo8
Lo8Lo8
Lo8
 

Similar to 01

OCA Java SE 8 Exam Chapter 1 Java Building Blocks
OCA Java SE 8 Exam Chapter 1 Java Building BlocksOCA Java SE 8 Exam Chapter 1 Java Building Blocks
OCA Java SE 8 Exam Chapter 1 Java Building Blocksİbrahim Kürce
 
1669958779195.pdf
1669958779195.pdf1669958779195.pdf
1669958779195.pdfvenud11
 
JavaScript - Programming Languages course
JavaScript - Programming Languages course JavaScript - Programming Languages course
JavaScript - Programming Languages course yoavrubin
 
JavaScript Programming
JavaScript ProgrammingJavaScript Programming
JavaScript ProgrammingSehwan Noh
 
JavaScript - An Introduction
JavaScript - An IntroductionJavaScript - An Introduction
JavaScript - An IntroductionManvendra Singh
 
Eo gaddis java_chapter_06_Classes and Objects
Eo gaddis java_chapter_06_Classes and ObjectsEo gaddis java_chapter_06_Classes and Objects
Eo gaddis java_chapter_06_Classes and ObjectsGina Bullock
 
Eo gaddis java_chapter_06_5e
Eo gaddis java_chapter_06_5eEo gaddis java_chapter_06_5e
Eo gaddis java_chapter_06_5eGina Bullock
 
Eo gaddis java_chapter_06_5e
Eo gaddis java_chapter_06_5eEo gaddis java_chapter_06_5e
Eo gaddis java_chapter_06_5eGina Bullock
 
OOPS in java | Super and this Keyword | Memory Management in java | pacakages...
OOPS in java | Super and this Keyword | Memory Management in java | pacakages...OOPS in java | Super and this Keyword | Memory Management in java | pacakages...
OOPS in java | Super and this Keyword | Memory Management in java | pacakages...Sagar Verma
 
OOP - Java is pass-by-value
OOP - Java is pass-by-valueOOP - Java is pass-by-value
OOP - Java is pass-by-valueMudasir Qazi
 
JavaScript Miller Columns
JavaScript Miller ColumnsJavaScript Miller Columns
JavaScript Miller ColumnsJonathan Fine
 
DISE - Windows Based Application Development in Java
DISE - Windows Based Application Development in JavaDISE - Windows Based Application Development in Java
DISE - Windows Based Application Development in JavaRasan Samarasinghe
 
Lecture2_MCS4_Evening.pptx
Lecture2_MCS4_Evening.pptxLecture2_MCS4_Evening.pptx
Lecture2_MCS4_Evening.pptxSaqlainYaqub1
 
JavaScript Cheatsheets with easy way .pdf
JavaScript Cheatsheets with easy way .pdfJavaScript Cheatsheets with easy way .pdf
JavaScript Cheatsheets with easy way .pdfranjanadeore1
 
Comparable/ Comparator
Comparable/ ComparatorComparable/ Comparator
Comparable/ ComparatorSean McElrath
 
Lambda: A Peek Under The Hood - Brian Goetz
Lambda: A Peek Under The Hood - Brian GoetzLambda: A Peek Under The Hood - Brian Goetz
Lambda: A Peek Under The Hood - Brian GoetzJAX London
 
Does Java Have a Future After Version 8? (Belfast JUG April 2014)
Does Java Have a Future After Version 8? (Belfast JUG April 2014)Does Java Have a Future After Version 8? (Belfast JUG April 2014)
Does Java Have a Future After Version 8? (Belfast JUG April 2014)Garth Gilmour
 

Similar to 01 (20)

OCA Java SE 8 Exam Chapter 1 Java Building Blocks
OCA Java SE 8 Exam Chapter 1 Java Building BlocksOCA Java SE 8 Exam Chapter 1 Java Building Blocks
OCA Java SE 8 Exam Chapter 1 Java Building Blocks
 
Swift, swiftly
Swift, swiftlySwift, swiftly
Swift, swiftly
 
1669958779195.pdf
1669958779195.pdf1669958779195.pdf
1669958779195.pdf
 
JavaScript - Programming Languages course
JavaScript - Programming Languages course JavaScript - Programming Languages course
JavaScript - Programming Languages course
 
JavaScript Programming
JavaScript ProgrammingJavaScript Programming
JavaScript Programming
 
JavaScript - An Introduction
JavaScript - An IntroductionJavaScript - An Introduction
JavaScript - An Introduction
 
Eo gaddis java_chapter_06_Classes and Objects
Eo gaddis java_chapter_06_Classes and ObjectsEo gaddis java_chapter_06_Classes and Objects
Eo gaddis java_chapter_06_Classes and Objects
 
Eo gaddis java_chapter_06_5e
Eo gaddis java_chapter_06_5eEo gaddis java_chapter_06_5e
Eo gaddis java_chapter_06_5e
 
Eo gaddis java_chapter_06_5e
Eo gaddis java_chapter_06_5eEo gaddis java_chapter_06_5e
Eo gaddis java_chapter_06_5e
 
OOPS in java | Super and this Keyword | Memory Management in java | pacakages...
OOPS in java | Super and this Keyword | Memory Management in java | pacakages...OOPS in java | Super and this Keyword | Memory Management in java | pacakages...
OOPS in java | Super and this Keyword | Memory Management in java | pacakages...
 
OOP - Java is pass-by-value
OOP - Java is pass-by-valueOOP - Java is pass-by-value
OOP - Java is pass-by-value
 
JavaScript Miller Columns
JavaScript Miller ColumnsJavaScript Miller Columns
JavaScript Miller Columns
 
DISE - Windows Based Application Development in Java
DISE - Windows Based Application Development in JavaDISE - Windows Based Application Development in Java
DISE - Windows Based Application Development in Java
 
Lecture2_MCS4_Evening.pptx
Lecture2_MCS4_Evening.pptxLecture2_MCS4_Evening.pptx
Lecture2_MCS4_Evening.pptx
 
JavaScript Cheatsheets with easy way .pdf
JavaScript Cheatsheets with easy way .pdfJavaScript Cheatsheets with easy way .pdf
JavaScript Cheatsheets with easy way .pdf
 
Comparable/ Comparator
Comparable/ ComparatorComparable/ Comparator
Comparable/ Comparator
 
Chapter 2
Chapter 2Chapter 2
Chapter 2
 
Lambda: A Peek Under The Hood - Brian Goetz
Lambda: A Peek Under The Hood - Brian GoetzLambda: A Peek Under The Hood - Brian Goetz
Lambda: A Peek Under The Hood - Brian Goetz
 
Does Java Have a Future After Version 8? (Belfast JUG April 2014)
Does Java Have a Future After Version 8? (Belfast JUG April 2014)Does Java Have a Future After Version 8? (Belfast JUG April 2014)
Does Java Have a Future After Version 8? (Belfast JUG April 2014)
 
Introduction to Java
Introduction to JavaIntroduction to Java
Introduction to Java
 

More from liankei

More from liankei (16)

Lo 19
Lo 19Lo 19
Lo 19
 
Lo 18
Lo 18Lo 18
Lo 18
 
Lo 13
Lo 13Lo 13
Lo 13
 
Lo 12
Lo 12Lo 12
Lo 12
 
Lo 11
Lo 11Lo 11
Lo 11
 
Lo 06
Lo 06Lo 06
Lo 06
 
Lo 05
Lo 05Lo 05
Lo 05
 
Lo 04
Lo 04Lo 04
Lo 04
 
Lo 01
Lo 01Lo 01
Lo 01
 
Lo 16
Lo 16Lo 16
Lo 16
 
Lo 15
Lo 15Lo 15
Lo 15
 
Lo 09
Lo 09Lo 09
Lo 09
 
Lo 08
Lo 08Lo 08
Lo 08
 
Lo 03
Lo 03Lo 03
Lo 03
 
Lo 20
Lo 20Lo 20
Lo 20
 
Lo6
Lo6Lo6
Lo6
 

Recently uploaded

04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...apidays
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfhans926745
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 

Recently uploaded (20)

04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 

01

  • 1. COMP 213 Advanced Object-oriented Programming Lecture 13 Propositional Logic
  • 2. Task Develop a program that: allows a user to enter a string representing a term in propositional logic; prints out the term with minimal and maximal brackets; prints out a truth table for the term. (actually, we won’t have time for the third one)
  • 3. Task Develop a program that: allows a user to enter a string representing a term in propositional logic; prints out the term with minimal and maximal brackets; prints out a truth table for the term. (actually, we won’t have time for the third one)
  • 4. Propositional Logic Propositional logic is the logic of truth and reasoning. It is concerned with how some statements follow logically from other statements to form logical arguments. It was first systematically studied by Aristotle, and is still of interest in philosophical logic (mainly as one of the simplest non-trivial logics). It is also relevant to Computer Science as the basis of Boolean logic.
  • 5. George Boole, 1815–1864 In 1854, Boole published An Investigation into the Laws of Thought, on Which are founded the Mathematical Theories of Logic and Probabilities. This work related logical operators and binary arithmetic, and is the basis for what is now called Boolean logic (which is actually just another name for Propositional Logic).
  • 6. Propositional Logic Propositional Logic is a language consisting of terms that are built from variables, the constants true and false, and Boolean operators (‘not’, ‘and’, ’or’, etc.). In BNF: Prop ::= Var | true | false | not Prop | Prop and Prop | Prop or Prop | Prop implies Prop Var ::= ’A | ’B | ’C | · · · There is a reason for the single quotes before the variables . . . : we’ll use one of Maude’s built-in types for these.
  • 7. Propositional Logic Propositional Logic is a language consisting of terms that are built from variables, the constants true and false, and Boolean operators (‘not’, ‘and’, ’or’, etc.). In BNF: Prop ::= Var | true | false | not Prop | Prop and Prop | Prop or Prop | Prop implies Prop Var ::= ’A | ’B | ’C | · · · There is a reason for the single quotes before the variables . . . : we’ll use one of Maude’s built-in types for these.
  • 8. Propositional Logic Propositional Logic is a language consisting of terms that are built from variables, the constants true and false, and Boolean operators (‘not’, ‘and’, ’or’, etc.). In BNF: Prop ::= Var | true | false | not Prop | Prop and Prop | Prop or Prop | Prop implies Prop Var ::= ’A | ’B | ’C | · · · There is a reason for the single quotes before the variables . . . : we’ll use one of Maude’s built-in types for these.
  • 9. Propositional ADT Propositions also form an Abstract Data Type. The propositions themselves are the abstract data values. The operations are the constants (variables, true, false) and the operators (not, and, or, implies). We’ll specify this ADT in Maude, then implement it in Java.
  • 10. Propositional ADT Propositions also form an Abstract Data Type. The propositions themselves are the abstract data values. The operations are the constants (variables, true, false) and the operators (not, and, or, implies). We’ll specify this ADT in Maude, then implement it in Java.
  • 11. Propositional ADT Propositions also form an Abstract Data Type. The propositions themselves are the abstract data values. The operations are the constants (variables, true, false) and the operators (not, and, or, implies). We’ll specify this ADT in Maude, then implement it in Java.
  • 12. Propositional ADT Propositions also form an Abstract Data Type. The propositions themselves are the abstract data values. The operations are the constants (variables, true, false) and the operators (not, and, or, implies). We’ll specify this ADT in Maude, then implement it in Java.
  • 13. Maude, Maude, Maude file: PropLog.maude fmod PROP LOGIC is *** import Maude’s quoted identifiers, *** renaming the sort Qid to PVar (for "Propositional Variable") protecting QID *(sort Qid to PVar) . Maude’s built-in module QID declares a sort Qid of ‘quoted identifiers’; these are very like strings, except rather than being enclosed in double quotes ("), they are preceded by a single closing quote (’). E.g., ’a, ’aa, ’abc, etc. This simply means that the sort Qid is now called PVar
  • 14. Maude, Maude, Maude file: PropLog.maude fmod PROP LOGIC is *** import Maude’s quoted identifiers, *** renaming the sort Qid to PVar (for "Propositional Variable") protecting QID *(sort Qid to PVar) . Maude’s built-in module QID declares a sort Qid of ‘quoted identifiers’; these are very like strings, except rather than being enclosed in double quotes ("), they are preceded by a single closing quote (’). E.g., ’a, ’aa, ’abc, etc. This simply means that the sort Qid is now called PVar
  • 15. Maude, Maude, Maude file: PropLog.maude fmod PROP LOGIC is *** import Maude’s quoted identifiers, *** renaming the sort Qid to PVar (for "Propositional Variable") protecting QID *(sort Qid to PVar) . Maude’s built-in module QID declares a sort Qid of ‘quoted identifiers’; these are very like strings, except rather than being enclosed in double quotes ("), they are preceded by a single closing quote (’). E.g., ’a, ’aa, ’abc, etc. This simply means that the sort Qid is now called PVar
  • 16. Maude, Maude, Maude file: PropLog.maude fmod PROP LOGIC is *** import Maude’s quoted identifiers, *** renaming the sort Qid to PVar (for "Propositional Variable") protecting QID *(sort Qid to PVar) . Maude’s built-in module QID declares a sort Qid of ‘quoted identifiers’; these are very like strings, except rather than being enclosed in double quotes ("), they are preceded by a single closing quote (’). E.g., ’a, ’aa, ’abc, etc. This simply means that the sort Qid is now called PVar
  • 17. Maude, Maude, Maude file: PropLog.maude fmod PROP LOGIC is *** import Maude’s quoted identifiers, *** renaming the sort Qid to PVar (for "Propositional Variable") protecting QID *(sort Qid to PVar) . Maude’s built-in module QID declares a sort Qid of ‘quoted identifiers’; these are very like strings, except rather than being enclosed in double quotes ("), they are preceded by a single closing quote (’). E.g., ’a, ’aa, ’abc, etc. This simply means that the sort Qid is now called PVar
  • 18. Maude, Maude, Maude file: PropLog.maude fmod PROP LOGIC is *** import Maude’s quoted identifiers, *** renaming the sort Qid to PVar (for "Propositional Variable") protecting QID *(sort Qid to PVar) . Maude’s built-in module QID declares a sort Qid of ‘quoted identifiers’; these are very like strings, except rather than being enclosed in double quotes ("), they are preceded by a single closing quote (’). E.g., ’a, ’aa, ’abc, etc. This simply means that the sort Qid is now called PVar
  • 19. Maude, Maude, Maude file: PropLog.maude fmod PROP LOGIC is *** import Maude’s quoted identifiers, *** renaming the sort Qid to PVar (for "Propositional Variable") protecting QID *(sort Qid to PVar) . Maude’s built-in module QID declares a sort Qid of ‘quoted identifiers’; these are very like strings, except rather than being enclosed in double quotes ("), they are preceded by a single closing quote (’). E.g., ’a, ’aa, ’abc, etc. This simply means that the sort Qid is now called PVar
  • 20. Maude, Maude, Maude file: PropLog.maude fmod PROP LOGIC is *** import Maude’s quoted identifiers, *** renaming the sort Qid to PVar (for "Propositional Variable") protecting QID *(sort Qid to PVar) . Maude’s built-in module QID declares a sort Qid of ‘quoted identifiers’; these are very like strings, except rather than being enclosed in double quotes ("), they are preceded by a single closing quote (’). E.g., ’a, ’aa, ’abc, etc. This simply means that the sort Qid is now called PVar
  • 21. More Maude file PropLog.maude *** propositions sort Prop . *** every variable is a proposition subsort PVar < Prop . NB this is Maude, not Java; subsorts are not the same thing as inheritance — we’re not suggesting class Prop extends PVar { ... } but it does mean that PVars can be used whenever a Prop is expected.
  • 22. More Maude file PropLog.maude *** propositions sort Prop . *** every variable is a proposition subsort PVar < Prop . NB this is Maude, not Java; subsorts are not the same thing as inheritance — we’re not suggesting class Prop extends PVar { ... } but it does mean that PVars can be used whenever a Prop is expected.
  • 23. More Maude file PropLog.maude *** propositions sort Prop . *** every variable is a proposition subsort PVar < Prop . NB this is Maude, not Java; subsorts are not the same thing as inheritance — we’re not suggesting class Prop extends PVar { ... } but it does mean that PVars can be used whenever a Prop is expected.
  • 24. More Maude file PropLog.maude *** propositions sort Prop . *** every variable is a proposition subsort PVar < Prop . NB this is Maude, not Java; subsorts are not the same thing as inheritance — we’re not suggesting class Prop extends PVar { ... } but it does mean that PVars can be used whenever a Prop is expected.
  • 25. More Maude file PropLog.maude *** propositions sort Prop . *** every variable is a proposition subsort PVar < Prop . NB this is Maude, not Java; subsorts are not the same thing as inheritance — we’re not suggesting class Prop extends PVar { ... } but it does mean that PVars can be used whenever a Prop is expected.
  • 26. More Maude file: PropLog.maude ops true false : -> Prop . op and : Prop Prop -> Prop . op or : Prop Prop -> Prop . op implies : Prop Prop -> Prop . op not : Prop -> Prop . Note: one underscore for each argument The first three operations are infix; ‘not’ is prefix Example propositions: not ’a and ’b implies ’c or true
  • 27. More Maude file: PropLog.maude ops true false : -> Prop . op and : Prop Prop -> Prop . op or : Prop Prop -> Prop . op implies : Prop Prop -> Prop . op not : Prop -> Prop . Note: one underscore for each argument The first three operations are infix; ‘not’ is prefix Example propositions: not ’a and ’b implies ’c or true
  • 28. More Maude file: PropLog.maude ops true false : -> Prop . op and : Prop Prop -> Prop . op or : Prop Prop -> Prop . op implies : Prop Prop -> Prop . op not : Prop -> Prop . Note: one underscore for each argument The first three operations are infix; ‘not’ is prefix Example propositions: not ’a and ’b implies ’c or true
  • 29. More Maude file: PropLog.maude ops true false : -> Prop . op and : Prop Prop -> Prop . op or : Prop Prop -> Prop . op implies : Prop Prop -> Prop . op not : Prop -> Prop . Note: one underscore for each argument The first three operations are infix; ‘not’ is prefix Example propositions: not ’a and ’b implies ’c or true
  • 30. More Maude file: PropLog.maude ops true false : -> Prop . op and : Prop Prop -> Prop . op or : Prop Prop -> Prop . op implies : Prop Prop -> Prop . op not : Prop -> Prop . Note: one underscore for each argument The first three operations are infix; ‘not’ is prefix Example propositions: not ’a and ’b implies ’c or true
  • 31. More Maude file: PropLog.maude ops true false : -> Prop . op and : Prop Prop -> Prop . op or : Prop Prop -> Prop . op implies : Prop Prop -> Prop . op not : Prop -> Prop . Note: one underscore for each argument The first three operations are infix; ‘not’ is prefix Example propositions: not ’a and ’b implies ’c or true
  • 32. More Maude file: PropLog.maude ops true false : -> Prop . op and : Prop Prop -> Prop . op or : Prop Prop -> Prop . op implies : Prop Prop -> Prop . op not : Prop -> Prop . Note: one underscore for each argument The first three operations are infix; ‘not’ is prefix Example propositions: not ’a and ’b implies ’c or true
  • 33. More Maude file: PropLog.maude ops true false : -> Prop . op and : Prop Prop -> Prop . op or : Prop Prop -> Prop . op implies : Prop Prop -> Prop . op not : Prop -> Prop . Note: one underscore for each argument The first three operations are infix; ‘not’ is prefix Example propositions: not ’a and ’b implies ’c or true
  • 34. More Maude file: PropLog.maude ops true false : -> Prop . op and : Prop Prop -> Prop . op or : Prop Prop -> Prop . op implies : Prop Prop -> Prop . op not : Prop -> Prop . Note: one underscore for each argument The first three operations are infix; ‘not’ is prefix Example propositions: not ’a and ’b implies ’c or true
  • 35. More Maude file: PropLog.maude ops true false : -> Prop . op and : Prop Prop -> Prop . op or : Prop Prop -> Prop . op implies : Prop Prop -> Prop . op not : Prop -> Prop . Note: one underscore for each argument The first three operations are infix; ‘not’ is prefix Example propositions: not ’a and ’b implies ’c or true
  • 36. More Examples of Terms ’a true not ’a not false ’a and true ’a and not ’b ’c or ’a and not ’b not ’c implies not ’b and not not ’a As we can see from the last two examples, terms can be ambiguous: (’c or ’a) and not ’b / ’c or (’a and not ’b)
  • 37. More Examples of Terms ’a true not ’a not false ’a and true ’a and not ’b ’c or ’a and not ’b not ’c implies not ’b and not not ’a As we can see from the last two examples, terms can be ambiguous: (’c or ’a) and not ’b / ’c or (’a and not ’b)
  • 38. (Brackets) We can use brackets to disambiguate terms; e.g., (’c or ’a) and not ’b We can also use conventions so that we sometimes don’t need brackets to disambiguate terms: we give a precedence to each operator; operations with a low precedence are more tightly binding. file: PropLog.maude op and : Prop Prop -> Prop [prec 40] . op or : Prop Prop -> Prop [prec 44] . op implies : Prop Prop -> Prop [prec 48] . op not : Prop -> Prop [prec 30] .
  • 39. (Brackets) We can use brackets to disambiguate terms; e.g., (’c or ’a) and not ’b We can also use conventions so that we sometimes don’t need brackets to disambiguate terms: we give a precedence to each operator; operations with a low precedence are more tightly binding. file: PropLog.maude op and : Prop Prop -> Prop [prec 40] . op or : Prop Prop -> Prop [prec 44] . op implies : Prop Prop -> Prop [prec 48] . op not : Prop -> Prop [prec 30] .
  • 40. (Brackets) We can use brackets to disambiguate terms; e.g., (’c or ’a) and not ’b We can also use conventions so that we sometimes don’t need brackets to disambiguate terms: we give a precedence to each operator; operations with a low precedence are more tightly binding. file: PropLog.maude op and : Prop Prop -> Prop [prec 40] . op or : Prop Prop -> Prop [prec 44] . op implies : Prop Prop -> Prop [prec 48] . op not : Prop -> Prop [prec 30] .
  • 41. Examples Term Means ’a and ’b or ’c (’a and ’b) or ’c not ’a and ’b implies ’c ((not ’a) and ’b) implies ’c not ’a and (’b implies ’c) (not ’a) and (’b implies ’c) ’a and ’b or ’c implies ’d ((’a and ’b) or ’c) implies ’d This disambiguates terms with different operators but what about terms with the same operators, e.g. ’a and ’b and ’c ?
  • 42. Examples Term Means ’a and ’b or ’c (’a and ’b) or ’c not ’a and ’b implies ’c ((not ’a) and ’b) implies ’c not ’a and (’b implies ’c) (not ’a) and (’b implies ’c) ’a and ’b or ’c implies ’d ((’a and ’b) or ’c) implies ’d This disambiguates terms with different operators but what about terms with the same operators, e.g. ’a and ’b and ’c ?
  • 43. Associativity We will adopt the convention that binary operators are right-associative. I.e., Term Means ’a or ’b or ’c or ’d or ’e ’a or (’b or (’c or (’d or ’e))) ’a and ’b and ’c and ’d ’a and (’b and (’c and ’d)) ’a implies ’b implies ’c ’a implies (’b implies ’c) etc.
  • 44. Associativity In fact, we will use a semantic property of and and or (called associativity), which says that any way of bracketing ’a and ’b and ’c and ’d gives the same result, so we can omit brackets entirely (and similarly for or). file: PropLog.maude op and : Prop Prop -> Prop [assoc prec 40] . op or : Prop Prop -> Prop [assoc prec 44] . op implies : Prop Prop -> Prop [prec 48] . op not : Prop -> Prop [prec 30] .
  • 45. Associativity In fact, we will use a semantic property of and and or (called associativity), which says that any way of bracketing ’a and ’b and ’c and ’d gives the same result, so we can omit brackets entirely (and similarly for or). file: PropLog.maude op and : Prop Prop -> Prop [assoc prec 40] . op or : Prop Prop -> Prop [assoc prec 44] . op implies : Prop Prop -> Prop [prec 48] . op not : Prop -> Prop [prec 30] .
  • 46. Printing with Brackets We still need to specify operations to print with maximal and minimal bracketing. file: PropLog.maude op printAllBrackets : Prop -> String . We specify what this operation does by considering what its arguments may be: a PVar, true, false, or a term built from the other four operations (and, or, implies, not).
  • 47. Printing with Brackets We still need to specify operations to print with maximal and minimal bracketing. file: PropLog.maude op printAllBrackets : Prop -> String . We specify what this operation does by considering what its arguments may be: a PVar, true, false, or a term built from the other four operations (and, or, implies, not).
  • 48. Printing with Brackets file: PropLog.maude eq printAllBrackets(true) = "(true)" . eq printAllBrackets(false) = "(false)" . var V : PVar . eq printAllBrackets(V) = "(" + string(V) + ")" . module QID op string : Qid -> String . module QID *(sort Qid to PVar) op string : PVar -> String . e.g., string(’example) = "example"
  • 49. Printing with Brackets file: PropLog.maude eq printAllBrackets(true) = "(true)" . eq printAllBrackets(false) = "(false)" . var V : PVar . eq printAllBrackets(V) = "(" + string(V) + ")" . module QID op string : Qid -> String . module QID *(sort Qid to PVar) op string : PVar -> String . e.g., string(’example) = "example"
  • 50. Printing with Brackets file: PropLog.maude eq printAllBrackets(true) = "(true)" . eq printAllBrackets(false) = "(false)" . var V : PVar . eq printAllBrackets(V) = "(" + string(V) + ")" . module QID op string : Qid -> String . module QID *(sort Qid to PVar) op string : PVar -> String . e.g., string(’example) = "example"
  • 51. Printing with Brackets file: PropLog.maude eq printAllBrackets(true) = "(true)" . eq printAllBrackets(false) = "(false)" . var V : PVar . eq printAllBrackets(V) = "(" + string(V) + ")" . module QID op string : Qid -> String . module QID *(sort Qid to PVar) op string : PVar -> String . e.g., string(’example) = "example"
  • 52. Printing with Brackets file: PropLog.maude eq printAllBrackets(true) = "(true)" . eq printAllBrackets(false) = "(false)" . var V : PVar . eq printAllBrackets(V) = "(" + string(V) + ")" . module QID op string : Qid -> String . module QID *(sort Qid to PVar) op string : PVar -> String . e.g., string(’example) = "example"
  • 53. Printing with Brackets file: PropLog.maude eq printAllBrackets(true) = "(true)" . eq printAllBrackets(false) = "(false)" . var V : PVar . eq printAllBrackets(V) = "(" + string(V) + ")" . module QID op string : Qid -> String . module QID *(sort Qid to PVar) op string : PVar -> String . e.g., string(’example) = "example"
  • 54. Printing with Brackets file: PropLog.maude eq printAllBrackets(true) = "(true)" . eq printAllBrackets(false) = "(false)" . var V : PVar . eq printAllBrackets(V) = "(" + string(V) + ")" . module QID op string : Qid -> String . module QID *(sort Qid to PVar) op string : PVar -> String . e.g., string(’example) = "example"
  • 55. Printing with Brackets file: PropLog.maude eq printAllBrackets(true) = "(true)" . eq printAllBrackets(false) = "(false)" . var V : PVar . eq printAllBrackets(V) = "(" + string(V) + ")" . module QID op string : Qid -> String . module QID *(sort Qid to PVar) op string : PVar -> String . e.g., string(’example) = "example"
  • 56. Printing with Brackets file: PropLog.maude eq printAllBrackets(true) = "(true)" . eq printAllBrackets(false) = "(false)" . var V : PVar . eq printAllBrackets(V) = "(" + string(V) + ")" . module QID op string : Qid -> String . module QID *(sort Qid to PVar) op string : PVar -> String . e.g., string(’example) = "example"
  • 57. Printing with Brackets file: PropLog.maude vars P P1 P2 : Prop . eq printAllBrackets(P1 and P2) = "(" + printAllBrackets(P1) + " and " + printAllBrackets(P2) + ")" . *** similarly for ‘or’ and ‘implies’ . . . eq printAllBrackets(not P) = "(not " + printAllBrackets(P) + ")" .
  • 58. Printing with Brackets file: PropLog.maude vars P P1 P2 : Prop . eq printAllBrackets(P1 and P2) = "(" + printAllBrackets(P1) + " and " + printAllBrackets(P2) + ")" . *** similarly for ‘or’ and ‘implies’ . . . eq printAllBrackets(not P) = "(not " + printAllBrackets(P) + ")" .
  • 59. Printing with Brackets file: PropLog.maude vars P P1 P2 : Prop . eq printAllBrackets(P1 and P2) = "(" + printAllBrackets(P1) + " and " + printAllBrackets(P2) + ")" . *** similarly for ‘or’ and ‘implies’ . . . eq printAllBrackets(not P) = "(not " + printAllBrackets(P) + ")" .
  • 60. Printing with Brackets file: PropLog.maude vars P P1 P2 : Prop . eq printAllBrackets(P1 and P2) = "(" + printAllBrackets(P1) + " and " + printAllBrackets(P2) + ")" . *** similarly for ‘or’ and ‘implies’ . . . eq printAllBrackets(not P) = "(not " + printAllBrackets(P) + ")" .
  • 61. Printing with Brackets file: PropLog.maude vars P P1 P2 : Prop . eq printAllBrackets(P1 and P2) = "(" + printAllBrackets(P1) + " and " + printAllBrackets(P2) + ")" . *** similarly for ‘or’ and ‘implies’ . . . eq printAllBrackets(not P) = "(not " + printAllBrackets(P) + ")" .
  • 62. Printing with Brackets file: PropLog.maude vars P P1 P2 : Prop . eq printAllBrackets(P1 and P2) = "(" + printAllBrackets(P1) + " and " + printAllBrackets(P2) + ")" . *** similarly for ‘or’ and ‘implies’ . . . eq printAllBrackets(not P) = "(not " + printAllBrackets(P) + ")" .
  • 63. Printing with Brackets file: PropLog.maude vars P P1 P2 : Prop . eq printAllBrackets(P1 and P2) = "(" + printAllBrackets(P1) + " and " + printAllBrackets(P2) + ")" . *** similarly for ‘or’ and ‘implies’ . . . eq printAllBrackets(not P) = "(not " + printAllBrackets(P) + ")" .
  • 64. Printing with Minimal Brackets file: PropLog.maude op toString : Prop -> String . eq toString(true) = "true" . eq toString(false) = "false" . eq toString(V) = string(V) . eq toString(P1 and P2) = ? . If we just write eq toString(P1 and P2) = toString(P1) + " and " + toString(P2) . (and similarly for or, implies, not) then we’ll never get any brackets anywhere.
  • 65. Printing with Minimal Brackets file: PropLog.maude op toString : Prop -> String . eq toString(true) = "true" . eq toString(false) = "false" . eq toString(V) = string(V) . eq toString(P1 and P2) = ? . If we just write eq toString(P1 and P2) = toString(P1) + " and " + toString(P2) . (and similarly for or, implies, not) then we’ll never get any brackets anywhere.
  • 66. Printing with Minimal Brackets file: PropLog.maude op toString : Prop -> String . eq toString(true) = "true" . eq toString(false) = "false" . eq toString(V) = string(V) . eq toString(P1 and P2) = ? . If we just write eq toString(P1 and P2) = toString(P1) + " and " + toString(P2) . (and similarly for or, implies, not) then we’ll never get any brackets anywhere.
  • 67. Printing with Minimal Brackets file: PropLog.maude op toString : Prop -> String . eq toString(true) = "true" . eq toString(false) = "false" . eq toString(V) = string(V) . eq toString(P1 and P2) = ? . If we just write eq toString(P1 and P2) = toString(P1) + " and " + toString(P2) . (and similarly for or, implies, not) then we’ll never get any brackets anywhere.
  • 68. Printing with Minimal Brackets file: PropLog.maude op toString : Prop -> String . eq toString(true) = "true" . eq toString(false) = "false" . eq toString(V) = string(V) . eq toString(P1 and P2) = ? . If we just write eq toString(P1 and P2) = toString(P1) + " and " + toString(P2) . (and similarly for or, implies, not) then we’ll never get any brackets anywhere.
  • 69. Printing with Minimal Brackets file: PropLog.maude op toString : Prop -> String . eq toString(true) = "true" . eq toString(false) = "false" . eq toString(V) = string(V) . eq toString(P1 and P2) = ? . If we just write eq toString(P1 and P2) = toString(P1) + " and " + toString(P2) . (and similarly for or, implies, not) then we’ll never get any brackets anywhere.
  • 70. Printing with Minimal Brackets file: PropLog.maude op toString : Prop -> String . eq toString(true) = "true" . eq toString(false) = "false" . eq toString(V) = string(V) . eq toString(P1 and P2) = ? . If we just write eq toString(P1 and P2) = toString(P1) + " and " + toString(P2) . (and similarly for or, implies, not) then we’ll never get any brackets anywhere.
  • 71. Printing with Minimal Brackets file: PropLog.maude eq toString(P1 and P2) = ? . If P1 is of the form P3 and P4, then we don’t need brackets around the first argument. E.g., toString(’a and ’b and ’c) = "’a and ’b and ’c" . But if P1 is of the form P3 or P4, then we do need brackets around the first argument. E.g., toString(’a or ’b and ’c) = "(’a or ’b) and ’c" .
  • 72. Printing with Minimal Brackets file: PropLog.maude eq toString(P1 and P2) = ? . If P1 is of the form P3 and P4, then we don’t need brackets around the first argument. E.g., toString(’a and ’b and ’c) = "’a and ’b and ’c" . But if P1 is of the form P3 or P4, then we do need brackets around the first argument. E.g., toString(’a or ’b and ’c) = "(’a or ’b) and ’c" .
  • 73. Printing with Minimal Brackets file: PropLog.maude eq toString(P1 and P2) = ? . If P1 is of the form P3 and P4, then we don’t need brackets around the first argument. E.g., toString(’a and ’b and ’c) = "’a and ’b and ’c" . But if P1 is of the form P3 or P4, then we do need brackets around the first argument. E.g., toString(’a or ’b and ’c) = "(’a or ’b) and ’c" .
  • 74. Printing with Minimal Brackets In the second case, brackets were needed because or has lower precedence than and. We’ll add an extra parameter that represents ‘the precedence of the operator above a term’. This gives us exactly the information we need in order to decide whether an operand requires brackets around it. file: PropLog.maude *** put brackets around the proposition if the precedence of *** its main operator is greater than the given integer op toStringPrec : Prop Int -> String .
  • 75. Printing with Minimal Brackets In the second case, brackets were needed because or has lower precedence than and. We’ll add an extra parameter that represents ‘the precedence of the operator above a term’. This gives us exactly the information we need in order to decide whether an operand requires brackets around it. file: PropLog.maude *** put brackets around the proposition if the precedence of *** its main operator is greater than the given integer op toStringPrec : Prop Int -> String .
  • 76. Printing with Minimal Brackets In the second case, brackets were needed because or has lower precedence than and. We’ll add an extra parameter that represents ‘the precedence of the operator above a term’. This gives us exactly the information we need in order to decide whether an operand requires brackets around it. file: PropLog.maude *** put brackets around the proposition if the precedence of *** its main operator is greater than the given integer op toStringPrec : Prop Int -> String .
  • 77. Printing with Minimal Brackets In the second case, brackets were needed because or has lower precedence than and. We’ll add an extra parameter that represents ‘the precedence of the operator above a term’. This gives us exactly the information we need in order to decide whether an operand requires brackets around it. file: PropLog.maude *** put brackets around the proposition if the precedence of *** its main operator is greater than the given integer op toStringPrec : Prop Int -> String .
  • 78. Printing with Minimal Brackets file: PropLog.maude *** no operator has precedence greater than 48, *** so no outermost brackets eq toString(P) = toStringPrec(P, 48) . var I : Int . eq toStringPrec(true, I) = "true" . eq toStringPrec(false, I) = "false" . eq toStringPrec(V, I) = string(V) .
  • 79. Printing with Minimal Brackets file: PropLog.maude *** no operator has precedence greater than 48, *** so no outermost brackets eq toString(P) = toStringPrec(P, 48) . var I : Int . eq toStringPrec(true, I) = "true" . eq toStringPrec(false, I) = "false" . eq toStringPrec(V, I) = string(V) .
  • 80. Printing with Minimal Brackets file: PropLog.maude *** no operator has precedence greater than 48, *** so no outermost brackets eq toString(P) = toStringPrec(P, 48) . var I : Int . eq toStringPrec(true, I) = "true" . eq toStringPrec(false, I) = "false" . eq toStringPrec(V, I) = string(V) .
  • 81. Printing with Minimal Brackets file: PropLog.maude *** no operator has precedence greater than 48, *** so no outermost brackets eq toString(P) = toStringPrec(P, 48) . var I : Int . eq toStringPrec(true, I) = "true" . eq toStringPrec(false, I) = "false" . eq toStringPrec(V, I) = string(V) .
  • 82. Printing with Minimal Brackets file: PropLog.maude cq toStringPrec(P1 and P2, I) = toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40) if I >= 40 . *** no brackets needed cq toStringPrec(P1 and P2, I) = "(" + toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40) + ")" if I < 40 . *** brackets are needed so P1 and P2 will have brackets if needed similarly for or and not
  • 83. Printing with Minimal Brackets file: PropLog.maude cq toStringPrec(P1 and P2, I) = toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40) if I >= 40 . *** no brackets needed cq toStringPrec(P1 and P2, I) = "(" + toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40) + ")" if I < 40 . *** brackets are needed so P1 and P2 will have brackets if needed similarly for or and not
  • 84. Printing with Minimal Brackets file: PropLog.maude cq toStringPrec(P1 and P2, I) = toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40) if I >= 40 . *** no brackets needed cq toStringPrec(P1 and P2, I) = "(" + toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40) + ")" if I < 40 . *** brackets are needed so P1 and P2 will have brackets if needed similarly for or and not
  • 85. Printing with Minimal Brackets file: PropLog.maude cq toStringPrec(P1 and P2, I) = toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40) if I >= 40 . *** no brackets needed cq toStringPrec(P1 and P2, I) = "(" + toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40) + ")" if I < 40 . *** brackets are needed so P1 and P2 will have brackets if needed similarly for or and not
  • 86. Printing with Minimal Brackets file: PropLog.maude cq toStringPrec(P1 and P2, I) = toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40) if I >= 40 . *** no brackets needed cq toStringPrec(P1 and P2, I) = "(" + toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40) + ")" if I < 40 . *** brackets are needed so P1 and P2 will have brackets if needed similarly for or and not
  • 87. Printing with Minimal Brackets file: PropLog.maude cq toStringPrec(P1 and P2, I) = toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40) if I >= 40 . *** no brackets needed cq toStringPrec(P1 and P2, I) = "(" + toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40) + ")" if I < 40 . *** brackets are needed so P1 and P2 will have brackets if needed similarly for or and not
  • 88. Printing with Minimal Brackets file: PropLog.maude cq toStringPrec(P1 and P2, I) = toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40) if I >= 40 . *** no brackets needed cq toStringPrec(P1 and P2, I) = "(" + toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40) + ")" if I < 40 . *** brackets are needed so P1 and P2 will have brackets if needed similarly for or and not
  • 89. Printing with Minimal Brackets file: PropLog.maude cq toStringPrec(P1 and P2, I) = toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40) if I >= 40 . *** no brackets needed cq toStringPrec(P1 and P2, I) = "(" + toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40) + ")" if I < 40 . *** brackets are needed so P1 and P2 will have brackets if needed similarly for or and not
  • 90. Printing with Minimal Brackets file: PropLog.maude cq toStringPrec(P1 and P2, I) = toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40) if I >= 40 . *** no brackets needed cq toStringPrec(P1 and P2, I) = "(" + toStringPrec(P1, 40) + " and " + toStringPrec(P2, 40) + ")" if I < 40 . *** brackets are needed so P1 and P2 will have brackets if needed similarly for or and not
  • 91. Printing with Minimal Brackets file: PropLog.maude cq toStringPrec(P1 implies P2, I) = toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48) if I >= 48 . *** no brackets needed cq toStringPrec(P1 implies P2, I) = "(" + toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48) + ")" if I < 48 . *** brackets are needed This gives us right associativity: P1 will have brackets round it if its main operator is ‘implies’; P2 will not
  • 92. Printing with Minimal Brackets file: PropLog.maude cq toStringPrec(P1 implies P2, I) = toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48) if I >= 48 . *** no brackets needed cq toStringPrec(P1 implies P2, I) = "(" + toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48) + ")" if I < 48 . *** brackets are needed This gives us right associativity: P1 will have brackets round it if its main operator is ‘implies’; P2 will not
  • 93. Printing with Minimal Brackets file: PropLog.maude cq toStringPrec(P1 implies P2, I) = toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48) if I >= 48 . *** no brackets needed cq toStringPrec(P1 implies P2, I) = "(" + toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48) + ")" if I < 48 . *** brackets are needed This gives us right associativity: P1 will have brackets round it if its main operator is ‘implies’; P2 will not
  • 94. Printing with Minimal Brackets file: PropLog.maude cq toStringPrec(P1 implies P2, I) = toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48) if I >= 48 . *** no brackets needed cq toStringPrec(P1 implies P2, I) = "(" + toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48) + ")" if I < 48 . *** brackets are needed This gives us right associativity: P1 will have brackets round it if its main operator is ‘implies’; P2 will not
  • 95. Printing with Minimal Brackets file: PropLog.maude cq toStringPrec(P1 implies P2, I) = toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48) if I >= 48 . *** no brackets needed cq toStringPrec(P1 implies P2, I) = "(" + toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48) + ")" if I < 48 . *** brackets are needed This gives us right associativity: P1 will have brackets round it if its main operator is ‘implies’; P2 will not
  • 96. Printing with Minimal Brackets file: PropLog.maude cq toStringPrec(P1 implies P2, I) = toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48) if I >= 48 . *** no brackets needed cq toStringPrec(P1 implies P2, I) = "(" + toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48) + ")" if I < 48 . *** brackets are needed This gives us right associativity: P1 will have brackets round it if its main operator is ‘implies’; P2 will not
  • 97. Printing with Minimal Brackets file: PropLog.maude cq toStringPrec(P1 implies P2, I) = toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48) if I >= 48 . *** no brackets needed cq toStringPrec(P1 implies P2, I) = "(" + toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48) + ")" if I < 48 . *** brackets are needed This gives us right associativity: P1 will have brackets round it if its main operator is ‘implies’; P2 will not
  • 98. Printing with Minimal Brackets file: PropLog.maude cq toStringPrec(P1 implies P2, I) = toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48) if I >= 48 . *** no brackets needed cq toStringPrec(P1 implies P2, I) = "(" + toStringPrec(P1, 47) + " implies " + toStringPrec(P2, 48) + ")" if I < 48 . *** brackets are needed This gives us right associativity: P1 will have brackets round it if its main operator is ‘implies’; P2 will not
  • 99. Maude Interpreter reduce toString((’a or ’b) and ’c) . = toStringPrec((’a or ’b) and ’c, 48) = *** 48 >= 40; no brackets needed toStringPrec(’a or ’b, 40) + " and " + toStringPrec(’c, 40) = *** 40 < 44; brackets are needed "(" + toStringPrec(’a, 44) + " or " + toStringPrec(’b, 44) + ")" + " and " + toStringPrec(’c, 40) = "(" + string(’a) + " or " + string(’b) + ")" + " and " + string(’c) = "(a or b) and c"
  • 100. Maude Interpreter reduce toString((’a or ’b) and ’c) . = toStringPrec((’a or ’b) and ’c, 48) = *** 48 >= 40; no brackets needed toStringPrec(’a or ’b, 40) + " and " + toStringPrec(’c, 40) = *** 40 < 44; brackets are needed "(" + toStringPrec(’a, 44) + " or " + toStringPrec(’b, 44) + ")" + " and " + toStringPrec(’c, 40) = "(" + string(’a) + " or " + string(’b) + ")" + " and " + string(’c) = "(a or b) and c"
  • 101. Maude Interpreter reduce toString((’a or ’b) and ’c) . = toStringPrec((’a or ’b) and ’c, 48) = *** 48 >= 40; no brackets needed toStringPrec(’a or ’b, 40) + " and " + toStringPrec(’c, 40) = *** 40 < 44; brackets are needed "(" + toStringPrec(’a, 44) + " or " + toStringPrec(’b, 44) + ")" + " and " + toStringPrec(’c, 40) = "(" + string(’a) + " or " + string(’b) + ")" + " and " + string(’c) = "(a or b) and c"
  • 102. Maude Interpreter reduce toString((’a or ’b) and ’c) . = toStringPrec((’a or ’b) and ’c, 48) = *** 48 >= 40; no brackets needed toStringPrec(’a or ’b, 40) + " and " + toStringPrec(’c, 40) = *** 40 < 44; brackets are needed "(" + toStringPrec(’a, 44) + " or " + toStringPrec(’b, 44) + ")" + " and " + toStringPrec(’c, 40) = "(" + string(’a) + " or " + string(’b) + ")" + " and " + string(’c) = "(a or b) and c"
  • 103. Maude Interpreter reduce toString((’a or ’b) and ’c) . = toStringPrec((’a or ’b) and ’c, 48) = *** 48 >= 40; no brackets needed toStringPrec(’a or ’b, 40) + " and " + toStringPrec(’c, 40) = *** 40 < 44; brackets are needed "(" + toStringPrec(’a, 44) + " or " + toStringPrec(’b, 44) + ")" + " and " + toStringPrec(’c, 40) = "(" + string(’a) + " or " + string(’b) + ")" + " and " + string(’c) = "(a or b) and c"
  • 104. Maude Interpreter reduce toString((’a or ’b) and ’c) . = toStringPrec((’a or ’b) and ’c, 48) = *** 48 >= 40; no brackets needed toStringPrec(’a or ’b, 40) + " and " + toStringPrec(’c, 40) = *** 40 < 44; brackets are needed "(" + toStringPrec(’a, 44) + " or " + toStringPrec(’b, 44) + ")" + " and " + toStringPrec(’c, 40) = "(" + string(’a) + " or " + string(’b) + ")" + " and " + string(’c) = "(a or b) and c"
  • 105. Maude Interpreter reduce toString((’a or ’b) and ’c) . = toStringPrec((’a or ’b) and ’c, 48) = *** 48 >= 40; no brackets needed toStringPrec(’a or ’b, 40) + " and " + toStringPrec(’c, 40) = *** 40 < 44; brackets are needed "(" + toStringPrec(’a, 44) + " or " + toStringPrec(’b, 44) + ")" + " and " + toStringPrec(’c, 40) = "(" + string(’a) + " or " + string(’b) + ")" + " and " + string(’c) = "(a or b) and c"
  • 106. Maude Interpreter reduce toString((’a or ’b) and ’c) . = toStringPrec((’a or ’b) and ’c, 48) = *** 48 >= 40; no brackets needed toStringPrec(’a or ’b, 40) + " and " + toStringPrec(’c, 40) = *** 40 < 44; brackets are needed "(" + toStringPrec(’a, 44) + " or " + toStringPrec(’b, 44) + ")" + " and " + toStringPrec(’c, 40) = "(" + string(’a) + " or " + string(’b) + ")" + " and " + string(’c) = "(a or b) and c"
  • 107. Maude Interpreter reduce toString((’a or ’b) and ’c) . = toStringPrec((’a or ’b) and ’c, 48) = *** 48 >= 40; no brackets needed toStringPrec(’a or ’b, 40) + " and " + toStringPrec(’c, 40) = *** 40 < 44; brackets are needed "(" + toStringPrec(’a, 44) + " or " + toStringPrec(’b, 44) + ")" + " and " + toStringPrec(’c, 40) = "(" + string(’a) + " or " + string(’b) + ")" + " and " + string(’c) = "(a or b) and c"
  • 108. Maude Interpreter reduce toString((’a or ’b) and ’c) . = toStringPrec((’a or ’b) and ’c, 48) = *** 48 >= 40; no brackets needed toStringPrec(’a or ’b, 40) + " and " + toStringPrec(’c, 40) = *** 40 < 44; brackets are needed "(" + toStringPrec(’a, 44) + " or " + toStringPrec(’b, 44) + ")" + " and " + toStringPrec(’c, 40) = "(" + string(’a) + " or " + string(’b) + ")" + " and " + string(’c) = "(a or b) and c"
  • 109. Maude Interpreter reduce toString((’a or ’b) and ’c) . = toStringPrec((’a or ’b) and ’c, 48) = *** 48 >= 40; no brackets needed toStringPrec(’a or ’b, 40) + " and " + toStringPrec(’c, 40) = *** 40 < 44; brackets are needed "(" + toStringPrec(’a, 44) + " or " + toStringPrec(’b, 44) + ")" + " and " + toStringPrec(’c, 40) = "(" + string(’a) + " or " + string(’b) + ")" + " and " + string(’c) = "(a or b) and c"
  • 110. Back to Java public class Prop { public Prop and(Prop p1, Prop p2) { ... } // similarly for ‘or’, etc. public String printAllBrackets() { ...} public String toString() { ...} } We need a data representation.
  • 111. Back to Java public class Prop { public Prop and(Prop p1, Prop p2) { ... } // similarly for ‘or’, etc. public String printAllBrackets() { ...} public String toString() { ...} } We need a data representation.
  • 112. Back to Java public class Prop { public Prop and(Prop p1, Prop p2) { ... } // similarly for ‘or’, etc. public String printAllBrackets() { ...} public String toString() { ...} } We need a data representation.
  • 113. That’s All, Folks! Summary sort Prop Maude equations helper functions Next: data representation