// lambda calculus revisited
T = m => n => m; // the 1st parameter is selected - true
F = m => n => n; // the 2nd parameter is selected - false
N = p => p(F)(T);
A = p => q => p(q)(p); // p(q)(F)
O = p => q => p(p)(q); // p(T)(q)
X = p => q => p(q(F)(T))(q);
console.log("Some logic operations:")
console.log(T("T")("F") + " represents true.");
console.log(F("T")("F") + " represents false.");
console.log("!T=" + N(T)("T")("F"));
console.log("!F=" + N(F)("T")("F"));
console.log("AND operations:");
console.log("T+T=" + A(T)(T)("T")("F"));
console.log("T+F=" + A(T)(F)("T")("F"));
console.log("F+T=" + A(F)(T)("T")("F"));
console.log("F+F=" + A(F)(F)("T")("F"));
console.log("OR operations:");
console.log("T+T=" + O(T)(T)("T")("F"));
console.log("T+F=" + O(T)(F)("T")("F"));
console.log("F+T=" + O(F)(T)("T")("F"));
console.log("F+F=" + O(F)(F)("T")("F"));
console.log("XOR operations:");
console.log("T+T=" + X(T)(T)("T")("F"));
console.log("T+F=" + X(T)(F)("T")("F"));
console.log("F+T=" + X(F)(T)("T")("F"));
console.log("F+F=" + X(F)(F)("T")("F"));