SlideShare uma empresa Scribd logo
1 de 113
Baixar para ler 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

Mais conteúdo relacionado

Mais procurados

Dotnet programming concepts difference faqs- 2
Dotnet programming concepts difference faqs- 2Dotnet programming concepts difference faqs- 2
Dotnet programming concepts difference faqs- 2
Umar Ali
 
Android webinar class_java_review
Android webinar class_java_reviewAndroid webinar class_java_review
Android webinar class_java_review
Edureka!
 
String and string buffer
String and string bufferString and string buffer
String and string buffer
kamal kotecha
 
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
junaidhasan17
 

Mais procurados (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)
 

Destaque

El portafolio en la educación inicial
El portafolio en la educación inicialEl portafolio en la educación inicial
El portafolio en la educación inicial
Moises Logroño
 
La Jaune et la Rouge - Isogeo - 700-page-094-095
La Jaune et la Rouge - Isogeo - 700-page-094-095La Jaune et la Rouge - Isogeo - 700-page-094-095
La Jaune et la Rouge - Isogeo - 700-page-094-095
Didier Tranchier
 
Operasi aritmatika kecuali operasi bitwise
Operasi aritmatika kecuali operasi bitwiseOperasi aritmatika kecuali operasi bitwise
Operasi aritmatika kecuali operasi bitwise
Morynna
 
Khairurrahmi method
Khairurrahmi methodKhairurrahmi method
Khairurrahmi method
syahyar
 
презентация1
презентация1презентация1
презентация1
Catherinesvii
 

Destaque (16)

El portafolio en la educación inicial
El portafolio en la educación inicialEl portafolio en la educación inicial
El portafolio en la educación inicial
 
La Jaune et la Rouge - Isogeo - 700-page-094-095
La Jaune et la Rouge - Isogeo - 700-page-094-095La Jaune et la Rouge - Isogeo - 700-page-094-095
La Jaune et la Rouge - Isogeo - 700-page-094-095
 
Operasi aritmatika kecuali operasi bitwise
Operasi aritmatika kecuali operasi bitwiseOperasi aritmatika kecuali operasi bitwise
Operasi aritmatika kecuali operasi bitwise
 
Fray presentacion personal
Fray presentacion personalFray presentacion personal
Fray presentacion personal
 
4 20-15.7 lg
4 20-15.7 lg4 20-15.7 lg
4 20-15.7 lg
 
Processes and threads
Processes and threadsProcesses and threads
Processes and threads
 
12 pikat e marrëveshjes së oslos të vitit 1998
12 pikat e marrëveshjes së oslos të vitit 199812 pikat e marrëveshjes së oslos të vitit 1998
12 pikat e marrëveshjes së oslos të vitit 1998
 
Malaysia
MalaysiaMalaysia
Malaysia
 
Study of various techniques for driver behavior monitoring and recognition sytem
Study of various techniques for driver behavior monitoring and recognition sytemStudy of various techniques for driver behavior monitoring and recognition sytem
Study of various techniques for driver behavior monitoring and recognition sytem
 
Khairurrahmi method
Khairurrahmi methodKhairurrahmi method
Khairurrahmi method
 
Cristòfol colom
Cristòfol colomCristòfol colom
Cristòfol colom
 
La Réunion à l'heure des startups et du digital : "La Réunion a toutes ses ch...
La Réunion à l'heure des startups et du digital : "La Réunion a toutes ses ch...La Réunion à l'heure des startups et du digital : "La Réunion a toutes ses ch...
La Réunion à l'heure des startups et du digital : "La Réunion a toutes ses ch...
 
презентация1
презентация1презентация1
презентация1
 
проектна культура вчителя англійської мови. дика с.м. копия
проектна культура вчителя англійської мови. дика с.м.   копияпроектна культура вчителя англійської мови. дика с.м.   копия
проектна культура вчителя англійської мови. дика с.м. копия
 
2014 sem vii unit vi internal sales
2014 sem vii  unit vi internal sales2014 sem vii  unit vi internal sales
2014 sem vii unit vi internal sales
 
Automatic phase changer
Automatic phase changerAutomatic phase changer
Automatic phase changer
 

Semelhante a Lo12

JavaScript - Programming Languages course
JavaScript - Programming Languages course JavaScript - Programming Languages course
JavaScript - Programming Languages course
yoavrubin
 

Semelhante a Lo12 (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
 

Mais de lksoo (20)

Lo48
Lo48Lo48
Lo48
 
Lo43
Lo43Lo43
Lo43
 
Lo39
Lo39Lo39
Lo39
 
Lo37
Lo37Lo37
Lo37
 
Lo27
Lo27Lo27
Lo27
 
Lo17
Lo17Lo17
Lo17
 
T3
T3T3
T3
 
T2
T2T2
T2
 
T1
T1T1
T1
 
T4
T4T4
T4
 
P5
P5P5
P5
 
P4
P4P4
P4
 
P3
P3P3
P3
 
P1
P1P1
P1
 
P2
P2P2
P2
 
L10
L10L10
L10
 
L9
L9L9
L9
 
L8
L8L8
L8
 
L7
L7L7
L7
 
L6
L6L6
L6
 

Último

introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
VishalKumarJha10
 

Último (20)

Pharm-D Biostatistics and Research methodology
Pharm-D Biostatistics and Research methodologyPharm-D Biostatistics and Research methodology
Pharm-D Biostatistics and Research methodology
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
BUS PASS MANGEMENT SYSTEM USING PHP.pptx
BUS PASS MANGEMENT SYSTEM USING PHP.pptxBUS PASS MANGEMENT SYSTEM USING PHP.pptx
BUS PASS MANGEMENT SYSTEM USING PHP.pptx
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
LEVEL 5 - SESSION 1 2023 (1).pptx - PDF 123456
LEVEL 5   - SESSION 1 2023 (1).pptx - PDF 123456LEVEL 5   - SESSION 1 2023 (1).pptx - PDF 123456
LEVEL 5 - SESSION 1 2023 (1).pptx - PDF 123456
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
 
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdfAzure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 

Lo12

  • 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