Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- Forall and exists in Lua, version 0 -- By Eduardo Ochs, 2011jul26 --[[ * (eepitch-lua51) * (eepitch-kill) * (eepitch-lua51) --]] get_value = function (var) return _G[var] end set_value = function (var, value) _G[var] = value end run = function (f, ...) if type(f) == "string" then f = _G[f] end return f(...) end prun = function (...) print(run(...)) end forall_in = function (var, set, f) local var_backup = get_value(var) local result = true for _,value in ipairs(set) do set_value(var, value) result = result and run(f) end set_value(var, var_backup) return result end exists_in = function (var, set, f) local var_backup = get_value(var) local result = false for _,value in ipairs(set) do set_value(var, value) result = result or run(f) end set_value(var, var_backup) return result end -- Verbose syntax: _G["P(a)"] = function () return a < 4 end _G["Fa a in A.P(a)"] = function () return forall_in("a", get_value("A"), "P(a)") end a = 0; print(run("P(a)")) --> true a = 5; print(run("P(a)")) --> false A = {2, 3, 4}; print(run("Fa a in A.P(a)")) --> false A = {2, 3}; print(run("Fa a in A.P(a)")) --> true -- Shorter syntax (may be confusing): _G["P(a)"] = function () return a < 4 end _G["Fa_a_A.P(a)"] = function () return forall_in("a", A, "P(a)") end a = 0; prun("P(a)") --> true a = 5; prun("P(a)") --> false A = {2, 3, 4}; prun("Fa_a_A.P(a)") --> false A = {2, 3}; prun("Fa_a_A.P(a)") --> true