 Select all correct implementations of the and(x,y) function that for all argument expressions x and y , it evaluates same as x && y boolean expression.
Explanation
Get an explanation when it's available:
Theory
• Function parameters can be passed by value or be passed by name.
The same distinction applies to definitions.
The def form is “by-name”, its right hand side is evaluated on each use.
There is also a val form, which is “by-value”.
Example:
val x = 2
val y = square(x)

The right-hand side of a val definition is evaluated at the point of the definition itself.
Afterwards, the name refers to the value. For instance, y above refers to 4, not square(2).
• The difference between val and def becomes apparent when the right hand side does not terminate.
Given
def loop: Boolean = loop

A definition
def x = loop

is OK, but a definition
val x = loop

will lead to an infinite loop.
• Boolean expressions b can be composed of
true false // Constants
!b // Negation
b && b // Conjunction
b || b // Disjunction

and of the usual comparison operations:
e <= e, e >= e, e < e, e > e, e == e, e != e
Here are reduction rules for Boolean expressions (e is an arbitrary expression):
!true --> false
!false --> true
true && e --> e
false && e --> false
true || e --> true
false || e --> e

Note that && and || do not always need their right operand to be evaluated.
We say, these expressions use “short-circuit evaluation”.
• To express choosing between two alternatives, Scala has a conditional expression if-else. It looks like a if-else in Java, but is used for expressions, not statements.
Example:
def abs(x: Int) = if (x >= 0) x else -x

x >= 0 is a predicate, of type Boolean.
Here are reduction rules for conditional expressions (e1 and e2 are arbitrary expressions, b is boolean expression)
if (b) e1 else e2:
if (true) e1 else e2   --> e1
if (false) e1 else e2  --> e2 