# MIT License, Copyright (c) 2022 Marvin Borner :import std/Combinator . # true true k # false false ki # inverts boolean value not! [0 false true] !‣ not! :test (!true) (false) :test (!false) (true) # true if both args are true and? [[1 0 false]] …&&… and? :test (true && true) (true) :test (true && false) (false) :test (false && true) (false) :test (false && false) (false) # true if not both args are true nand? [[1 0 1 false true]] :test (nand? true true) (false) :test (nand? true false) (true) :test (nand? false true) (true) :test (nand? false false) (true) # true if one of the args is true or? [[1 true 0]] …||… or? :test (true || true) (true) :test (true || false) (true) :test (false || true) (true) :test (false || false) (false) # true if both args are false nor? [[1 1 0 false true]] :test (nor? true true) (false) :test (nor? true false) (false) :test (nor? false true) (false) :test (nor? false false) (true) # true if args are not same bools xor? [[1 !0 0]] :test (xor? true true) (false) :test (xor? true false) (true) :test (xor? false true) (true) :test (xor? false false) (false) # true if both args are same bools xnor? [[1 0 !0]] :test (xnor? true true) (true) :test (xnor? true false) (false) :test (xnor? false true) (false) :test (xnor? false false) (true) # if first arg is true, exec first exp; else second exp # this function is generally redundant # I personally just write (exp? case-T case-F) directly if [[[2 1 0]]] …?!… if :test (if true true false) (true) :test ((true ?! true) false) (true) :test (if false true false) (false) :test ((false ?! true) false) (false) # mathematical implies definition implies [[!1 || 0]] …=>?… implies :test (true =>? true) (true) :test (true =>? false) (false) :test (false =>? true) (true) :test (false =>? false) (true) # mathematical iff (if and only if) definition iff [[(1 =>? 0) && (0 =>? 1)]] …<=>?… iff :test (true <=>? true) (true) :test (true <=>? false) (false) :test (false <=>? true) (false) :test (false <=>? false) (true)