Skip to content

Instantly share code, notes, and snippets.

@scudelletti
Last active November 22, 2016 11:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save scudelletti/03e543f52ac5f7c7c90ce19b473bf926 to your computer and use it in GitHub Desktop.
Save scudelletti/03e543f52ac5f7c7c90ce19b473bf926 to your computer and use it in GitHub Desktop.
If condition on lambda calculus
# Rules: A lamda always has 1 parameter, nothing more, nothing less
# Useful Content: https://en.wikipedia.org/wiki/Church_encoding
# Identity lambda
IDENTITY = ->x { x }
# True, returns the first argument
TT = ->x { ->y { x } }
# False, returns the last argument
FF = ->x { ->y { y } }
# Conditional lambda
##
# Call boolean(TT or FF) passing 2 lambdas
# One for truth case
# One for false case
IF = ->boolean {->tCase {->fCase {
boolean.call(tCase).call(fCase).call(IDENTITY)
} } }
# Testing the conditional lambda
IF.call(TT).call(->_ { puts "T" }).call(->_ { puts "F" }) #=> "T"
IF.call(FF).call(->_ { puts "T" }).call(->_ { puts "F" }) #=> "F"
###
# Avoiding Calling IF twite to test
ASSERT = -> (boolean) {
IF.(boolean).(->_ { puts "T" }).(->_ { puts "F" })
}
# Testing the conditional lambda without rewriting
ASSERT.(TT) # => "T"
ASSERT.(FF) # => "F"
### AND Operator
AND = ->(p) { ->(q) { p.call(q).call(p) } }
AND.call(TT).call(TT) # => TT
AND.call(TT).call(FF) # => FF
AND.call(FF).call(TT) # => FF
AND.call(FF).call(FF) # => FF
ASSERT.(
AND.call(TT).call(TT)
) # => "T"
ASSERT.(
AND.call(TT).call(FF)
) # => "F"
ASSERT.(
AND.call(FF).call(TT)
) # => "F"
ASSERT.(
AND.call(FF).call(FF)
) # => "F"
# We could also use ruby to check
AND.call(TT).call(TT) == TT
AND.call(TT).call(FF) == FF
AND.call(FF).call(TT) == FF
AND.call(FF).call(FF) == FF
### OR Operator
OR = ->(p) { ->(q) { p.call(p).call(q) } }
OR.call(TT).call(TT) # => TT
OR.call(TT).call(FF) # => TT
OR.call(FF).call(TT) # => TT
OR.call(FF).call(FF) # => FF
ASSERT.(
OR.call(TT).call(TT)
) # => "T"
ASSERT.(
OR.call(TT).call(FF)
) # => "T"
ASSERT.(
OR.call(FF).call(TT)
) # => "T"
ASSERT.(
OR.call(FF).call(FF)
) # => "F"
# We could also use ruby to check
OR.call(TT).call(TT) == TT
OR.call(TT).call(FF) == TT
OR.call(FF).call(TT) == TT
OR.call(FF).call(FF) == FF
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment