|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- -*- coding: raw-text -*-
-- (find-es "lua5" "modal.lua")
-- A library of functions to operate on modal and intuitionistic
-- truth-values.
-- Edrx, 2008aug01
ctrue = function () return 1 end
cfalse = function () return 0 end
cnot = function (a) return 1 - a end
cand = function (a, b) return min(a, b) end
cor = function (a, b) return max(a, b) end
cimp = function (a, b) return b >= a and 1 or 0 end
n = 4 -- number of worlds (see "setup", below)
mmap = function (clf, A, B)
C = {}
for i=1,n do C[i] = clf(A and A[i], B and B[i]) end
return C
end
mtrue = function () return mmap(ctrue) end
mfalse = function () return mmap(cfalse) end
mand = function (A, B) return mmap(cand, A, B) end
mor = function (A, B) return mmap(cor, A, B) end
mimp = function (A, B) return mmap(cimp, A, B) end
mnot = function (A) return mmap(cnot, A) end
S = function (A) return table.concat(A) end -- stringify
M = function (str) return split(str, ".") end -- modalize (tablify)
-- Reh: Square: House:
-- 1 1
-- 2 3 1 2 2 3
-- 4 3 4 4 5
--
Nec_Reh = function (A)
AI = {}
AI[4] = A[4]
AI[3] = A[3]
AI[2] = A[2] * AI[4]
AI[1] = A[1] * AI[2] * AI[3]
return AI
end
Nec_Square = function (A)
AI = {}
AI[4] = A[4]
AI[3] = A[3]
AI[2] = A[2] * AI[4]
AI[1] = A[1] * AI[3]
return AI
end
Nec_House = function (A)
AI = {}
AI[5] = A[5]
AI[4] = A[4]
AI[3] = A[3] * AI[5]
AI[2] = A[2] * AI[4]
AI[1] = A[1] * AI[2] * AI[3]
return AI
end
Nec = Nec_Reh
Nec = Nec_Square
nec = function (str) return S(Nec(M(str))) end
itrue = function () return S(mtrue()) end
ifalse = function () return S(mfalse()) end
iand = function (p, q) return S(mand(M(p), M(q))) end
ior = function (p, q) return S(mor(M(p), M(q))) end
iimp = function (p, q) return S(Nec(mimp(M(p), M(q)))) end
inot = function (p) return S(Nec(mnot(M(p)))) end
addss = function (T, n, prefix)
prefix = prefix or ""
if n == 0 then
tinsert(T, prefix)
else
addss(T, n-1, prefix.."0")
addss(T, n-1, prefix.."1")
end
return T
end
mtvs_ = function () return addss({}, n) end
itvs_ = function ()
local itvs = {}
for _,mtv in ipairs(mtvs_()) do
if mtv == nec(mtv) then tinsert(itvs, mtv) end
end
return itvs
end
mtvs = mtvs_() -- modal truth-values
itvs = itvs_() -- intuitionistic truth-values
star_notnot = function (p) return inot(inot(p)) end
star = star_notnot
-- Other modalities. Usage:
-- star = star_or("001")
-- star = star_imp("011")
star_or = function (alpha) return function (p) return ior(alpha, p) end end
star_imp = function (beta) return function (p) return iimp(beta, p) end end
star_force = function (alpha, beta)
return function (p) return ior(alpha, iimp(beta, p)) end -- check this
end
setup = function (n_, Nec_)
n = n_ -- number of worlds
Nec = Nec_ -- Nec_Reh or Nec_Square or ...
mtvs = mtvs_() -- a table listing all the modal truth-values
itvs = itvs_() -- a table listing all the intuitionistic truth-values
t = itrue()
end
setup(4, Nec_Square)
setup(5, Nec_House)
-- Reh: Square: House: Vee: Bighouse: Two: Three:
-- 1 1 1 2 1 1 1
-- 2 3 1 2 2 3 3 2 3 2 2
-- 4 3 4 4 5 4 5 3
-- 6 7
--
Meta_House = {"23", "4", "5", "", ""}
Meta_Square = {"3", "4", "", ""}
Meta_Vee = {"3", "3", ""}
Meta_Reh = {"23", "4", "", ""}
Meta_Bighouse = {"23", "4", "5", "6", "7", "", ""}
Meta_Two = {"2", ""}
Meta_Three = {"2", "3", ""}
Nec_Meta = function (A)
AI = {}
for i=n,1,-1 do -- start from the worlds at the bottom
AI[i] = A[i]
for c in string.gmatch(Meta[i], ".") do -- for each world immediately
AI[i] = AI[i] * AI[tonumber(c)] -- below this one: and-ify
end
end
return AI
end
Setup = function (Meta_)
n = #Meta_ -- number of worlds
Meta = Meta_
Nec = Nec_Meta -- Nec_Reh or Nec_Square or ...
mtvs = mtvs_() -- a table listing all the modal truth-values
itvs = itvs_() -- a table listing all the intuitionistic truth-values
t = itrue()
end
toset = function (T) local S={}; for i=1,#T do S[T[i]]=T[i] end; return S end
differents = function (T) return #keys(toset(T)) end
eight = function (op, p, q)
local a, b, c, d = op(p, q), op(star(p), q),
op(p, star(q)), op(star(p), star(q))
return a, b, c, d, star(a), star(b), star(c), star(d)
end
generatepairs = function (A)
return coroutine.wrap(function ()
for _,i in ipairs(A) do
for _,j in ipairs(A) do
coroutine.yield(i, j)
end
end
end)
end
generatetriples = function (A)
return coroutine.wrap(function ()
for _,i in ipairs(A) do
for _,j in ipairs(A) do
for _,k in ipairs(A) do
coroutine.yield(i, j, k)
end
end
end
end)
end
printeight = function (op, min)
for p,q in generatepairs(itvs) do
local d = differents{eight(op, p, q)}
if d >= (min or 0) then
print(p, q, eight(op, p, q))
end
end
end
printneight = function (op, min)
for p,q in generatepairs(itvs) do
local d = differents{eight(op, p, q)}
if d >= (min or 0) then
print(p, q, d)
end
end
end