To define rules we need a base type and expressions defined in that type. The base type and the expressions require the following:
Rules must be defined in terms of a category with:
in turn FunctionSpace requires:
|
That is, the left and right hand side of the equation must extend these.
For example: Expression(R) extends FunctionSpace(R).
Interpreter Syntax for Rules
The interpreter seems to have a special syntax for entering rules:
(1) -> R1 := rule log(x) + log(y) == log(x*y) (1) log(y) + log(x) + %B == log(x y) + %B Type: RewriteRule(Integer,Integer,Expression(Integer)) |
The simplest form of this special syntax is something like:
'rule' expression '==' expression
but there are more complicated versions like:
'rule' var | predicate var '==' expression
Multiple rules can be entered to a ruleset by using indentation.
I tried doing the same thing, without using this special syntax, I could not get this to work:
(3) -> E1 := log(x) + log(y) (3) log(y) + log(x) Type: Expression(Integer) (4) -> E2 := log(x*y) (4) log(x y) Type: Expression(Integer) (5) -> RR := RewriteRule(Integer,Integer,Expression(Integer)) (5) RewriteRule(Integer,Integer,Expression(Integer)) Type: Type (6) -> R1 := rule(E1,E2)$RR Line 1: R1 := rule(E1,E2)$RR .............A Error A: syntax error at top level Error A: Improper syntax. 2 error(s) parsing |
Why does that not work? I would have thought it would work according to this:
(2) -> )show RewriteRule RewriteRule(Base: SetCategory,R: Join(Ring,PatternMatchable(Base),Comparable, ConvertibleTo(Pattern(Base))),F: Join(FunctionSpace(R),PatternMatchable(Base), ConvertibleTo(Pattern(Base)))) is a domain constructor Abbreviation for RewriteRule is RULE This constructor is exposed in this frame. ------------------------------- Operations -------------------------------- ?=? : (%,%) -> Boolean coerce : Equation(F) -> % coerce : % -> OutputForm elt : (%,F,PositiveInteger) -> F ?.? : (%,F) -> F hash : % -> SingleInteger latex : % -> String lhs : % -> F pattern : % -> Pattern(Base) retract : % -> Equation(F) rhs : % -> F rule : (F,F,List(Symbol)) -> % rule : (F,F) -> % ?~=? : (%,%) -> Boolean hashUpdate! : (HashState,%) -> HashState quotedOperators : % -> List(Symbol) retractIfCan : % -> Union(Equation(F),"failed") suchThat : (%,List(Symbol),(List(F) -> Boolean)) -> % |
This appears to work, but I don't think it does because E1 and E2 are taken as, variables in the rule, rather than expressions?
(6) -> R1 := rule E1 == E2 (6) E1 == E2 Type: RewriteRule(Integer,Integer,Expression(Integer)) |
Applying the Rules
This is not what I expected:
(7) -> E3 := log(sin(x))+log(y) (7) log(sin(x)) + log(y) Type: Expression(Integer) (8) -> R1 E3 (8) E2 Type: Expression(Integer) (9) -> R1 log(sin(x))+log(y) (9) log(y) + E2 Type: Expression(Integer) |
(6) -> )di op rule There are 2 exposed functions called rule : [1] (D1,D1,List(Symbol)) -> RewriteRule(D3,D4,D1) from RewriteRule(D3,D4,D1) if D3 has SETCAT and D4 has Join(Ring,PatternMatchable(D3), Comparable,ConvertibleTo(Pattern(D3))) and D1 has Join( FunctionSpace(D4),PatternMatchable(D3),ConvertibleTo( Pattern(D3))) [2] (D1,D1) -> RewriteRule(D2,D3,D1) from RewriteRule(D2,D3,D1) if D2 has SETCAT and D3 has Join(Ring,PatternMatchable(D2), Comparable,ConvertibleTo(Pattern(D2))) and D1 has Join( FunctionSpace(D3),PatternMatchable(D2),ConvertibleTo( Pattern(D2))) |
see:
- pattern.spad.pamphlet
- patmatch1.spad.pamphlet
- patmatch2.spad.pamphlet
- rule.spad.pamphlet
(1) -> PMR := PatternMatchResult(Integer, Symbol) (1) PatternMatchResult(Integer,Symbol) Type: Type (2) -> P := Pattern(Integer) (2) Pattern(Integer) Type: Type (3) -> p := (1$Integer) :: P (3) 1 Type: Pattern(Integer) (4) -> pmr := new()$PMR (4) [] Type: PatternMatchResult(Integer,Symbol) (5) -> patternMatch("*"::Symbol,p,pmr)$Symbol (5) Does not match Type: PatternMatchResult(Integer,Symbol) |
Further Topics
Can we use this pattern matching mechanism for matching types (type inference) in the interpreter? See dicussion on page here.