[ 
https://issues.apache.org/jira/browse/GROOVY-11238?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Paul King closed GROOVY-11238.
------------------------------

> Logical implication operator revisited
> --------------------------------------
>
>                 Key: GROOVY-11238
>                 URL: https://issues.apache.org/jira/browse/GROOVY-11238
>             Project: Groovy
>          Issue Type: New Feature
>            Reporter: Paul King
>            Assignee: Paul King
>            Priority: Major
>             Fix For: 5.0.0-alpha-4
>
>
> Some languages like Racket, Eiffel and Dafny have an implication operator. 
> Others like Scala and Python rely on the "<=" operator for Booleans, though 
> that is not short-circuiting. Groovy has an "implies" method (also 
> short-circuiting) and we explored some time back about supporting an 
> implication operator. At the time, we decided it wasn't needed, after all, "A 
> implies B" is the same as "!A || B". In a lot of programming scenarios, the 
> existing operators work well and are well known, but there are some cases 
> like preconditions, postconditions, invariants and other logical expressions 
> where the implication operator would read better. Since the groovy-contracts 
> module supports such expressions and testing frameworks like jqwik also have 
> logical expressions, this issue is to explore that possibility again.
> Earlier, we had considered "=>" as the operator (like Racket) but that was 
> considered too easy to confuse with "<=" and ">=". It also conflicted with 
> the early lambda syntax (though that isn't relevant now). So, I suggest we 
> use "==>" like Dafny (and what has been proposed for Scala).
> Here is what some jqwik tests would look like:
> {code:groovy}
> @Property(tries=10)
> boolean 'only zero is the same as the negative of itself'(@ForAll int i) {
>     i == 0 ==> i == -i
> }
> @Property(tries=100)
> boolean 'an odd number squared is still odd'(@ForAll int n) {
>     n % 2 == 1 ==> (n ** 2) % 2 == 1
> }
> @Property(tries=100)
> boolean 'abs of a positive integer is itself'(@ForAll int i) {
>     i >= 0 ==> i.abs() == i
> }
> {code}
> Here is an example with DBC:
> {code:groovy}
> @Requires({ result >= 0
>   && (n >= 0 ==> result == n)
>   && (n < 0 ==> result == -n)})
> int myAbs(int n) {
>     n.abs()
> }
> {code}
> This is in a form that could be sent to a proof checking framework (though we 
> have no such integration today).
> So, to recap, the goal here is not to make wholesale changes to existing code 
> which might use the existing operators, but to provide the "==>" operator for 
> scenarios where the operator aids readability or otherwise makes sense.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to