concrete QueryEng of Query = {
lincat
Query = Str ;
Kind = Number => Str ;
Property = {s : Str ; p : Fix} ;
Term = {s : Str ; n : Number} ;
param
Fix = Pre | Post ;
Number = Sg | Pl ;
lin
QWhich kind property = "which" ++ kind ! Pl ++ be ! Pl ++ property.s ;
QHowMany kind property="how" ++ "many" ++ kind ! Pl ++ be ! Pl ++ property.s ;
QWhether term property = be ! term.n ++ term.s ++ property.s ;
TAll kind = {s = "all" ++ kind ! Pl ; n = Pl} ;
TAny kind = {s = "any" ++ kind ! Sg ; n = Sg} ;
PAnd p q = {s = p.s ++ "and" ++ q.s ; p = fix2 p.p q.p} ;
POr p q = {s = p.s ++ "or" ++ q.s ; p = fix2 p.p q.p} ;
PNot p = {s = "not" ++ p.s ; p = Post} ;
KProperty property kind = \\n => case property.p of {
Pre => property.s ++ kind ! n ;
Post => kind ! n ++ property.s
} ;
oper
be : Number => Str = table {Sg => "is" ; Pl => "are"} ;
prefix : Str -> {s : Str ; p : Fix} = \s -> {s = s ; p = Pre} ;
postfix : Str -> {s : Str ; p : Fix} = \s -> {s = s ; p = Post} ;
fix2 : Fix -> Fix -> Fix = \x,y -> case x of {Post => Post ; _ => y} ;
}