@@ -163,6 +163,7 @@ only in this scenario*.
163163 | "\\forall" "{" Patterns "}" Pattern [klabel(forall)]
164164
165165 | "\\mu" SetVariable "." Pattern [klabel(mu)]
166+ | "\\nu" SetVariable "." Pattern [klabel(nu)]
166167 /* Sugar for \iff, \mu and application */
167168 | "\\iff-lfp" "(" Pattern "," Pattern ")" [klabel(ifflfp)]
168169
@@ -354,6 +355,7 @@ module KORE-HELPERS
354355 requires getReturnSort(P) =/=K S
355356
356357 rule getReturnSort(\mu _ . Phi) => getReturnSort(Phi)
358+ rule getReturnSort(\nu _ . Phi) => getReturnSort(Phi)
357359 rule getReturnSort(\or(P, Ps)) => unionSort(getReturnSort(P), getReturnSort(\or(Ps)))
358360 rule getReturnSort(\or(.Patterns)) => BottomSort
359361 rule getReturnSort(\and(P, Ps)) => intersectSort(getReturnSort(P), getReturnSort(\and(Ps)))
@@ -604,6 +606,8 @@ where the term being unfolded has been replace by `#hole`.
604606 rule subst(X:Variable,Y:Variable,V) => X requires X =/=K Y
605607 rule subst(X:SetVariable,Y:SetVariable,V) => X requires X =/=K Y
606608 rule subst(X:Variable,P:Pattern, V) => X requires notBool(isVariable(P) orBool isVariableName(P))
609+ rule subst(X:SetVariable,P:Pattern, V) => X
610+ requires notBool(isSetVariable(P))
607611 rule subst(I:Int, X, V) => I
608612 rule subst(\top(),_,_)=> \top()
609613 rule subst(\bottom(),_,_) => \bottom()
@@ -680,6 +684,7 @@ Alpha renaming: Rename all bound variables. Free variables are left unchanged.
680684 rule alphaRename(\exists { Fs:Patterns } P:Pattern)
681685 => #fun(RENAMING => \exists { Fs[RENAMING] } alphaRename(substMap(P,RENAMING))) ( makeFreshSubstitution(Fs) )
682686 rule alphaRename(\mu X . P:Pattern) => \mu !X . alphaRename(subst(P, X, !X))
687+ rule alphaRename(\nu X . P:Pattern) => \nu !X . alphaRename(subst(P, X, !X))
683688 rule alphaRename(\equals(L, R)) => \equals(alphaRename(L), alphaRename(R))
684689 rule alphaRename(\not(Ps)) => \not(alphaRename(Ps))
685690 rule alphaRename(\functionalPattern(Ps)) => \functionalPattern(alphaRename(Ps))
@@ -753,12 +758,14 @@ single symbol applied to multiple arguments.
753758 rule #nnf(S:Symbol(Args)) => S(#nnfPs(Args))
754759 rule #nnf( \or(Ps)) => \or(#nnfPs(Ps))
755760 rule #nnf(\and(Ps)) => \and(#nnfPs(Ps))
761+ rule #nnf(\implies(L, R)) => #nnf(\or(\not(L), R))
756762
757763 rule #nnf(\not(P)) => \not(P) requires isDnfAtom(P)
758764 rule #nnf(\not(S:Symbol(Args))) => \not(S(#nnfPs(Args)))
759765 rule #nnf(\not( \or(Ps))) => \and(#nnfPs(#not(Ps)))
760766 rule #nnf(\not(\and(Ps))) => \or(#nnfPs(#not(Ps)))
761767 rule #nnf(\not(\not(P))) => #nnf(P)
768+ rule #nnf(\not(\implies(L, R))) => #nnf(\not(\or(\not(L), R)))
762769
763770 syntax Bool ::= isDnfAtom(Pattern) [function]
764771 rule isDnfAtom(V:Variable) => true
@@ -768,9 +775,11 @@ single symbol applied to multiple arguments.
768775 rule isDnfAtom(\exists{Vs}_) => true
769776 rule isDnfAtom(\forall{Vs}_) => true
770777 rule isDnfAtom(\mu X . _) => true
778+ rule isDnfAtom(\nu X . _) => true
771779 rule isDnfAtom(implicationContext(_, _)) => true
772780 rule isDnfAtom(\and(_)) => false
773781 rule isDnfAtom(\or(_)) => false
782+ rule isDnfAtom(\implies(_, _)) => false
774783 rule isDnfAtom(S:Symbol(ARGS)) => false
775784 rule isDnfAtom(\not(P)) => false
776785```
0 commit comments