プログラマメモ2 - programmer no memo2

3値論理 論理積、論理和 再び 2008/04/07

3値論理 論理積、論理和 再び

Javaです。

ちなみに
真偽値に論理演算子&,|が使えます。

結果

論理積
t ^ t = t
t ^ f = f
t ^ u = u
f ^ t = f
f ^ f = f
f ^ u = f
u ^ t = u
u ^ f = f
u ^ u = u
論理和
t ∨ t = t
t ∨ f = t
t ∨ u = t
f ∨ t = t
f ∨ f = f
f ∨ u = u
u ∨ t = t
u ∨ f = u
u ∨ u = u


public class Eq {
public static void main(String[] args) {

Boolean[] bs = { true, false, null };
System.out.println("論理積");
for (Boolean b1 : bs) {
for (Boolean b2 : bs) {
p_logicalProduct(b1, b2);
}
}
System.out.println("論理和");
for (Boolean b1 : bs) {
for (Boolean b2 : bs) {
p_logicalDisconjunction(b1, b2);
}
}
}

static String t(Boolean b) {
return b == null ? "u" : b ? "t" : "f";
}

static void p_logicalProduct(Boolean b1, Boolean b2) {
System.out.printf("%s ^ %s = %s%n", t(b1), t(b2), t(logicalProduct(b1,
b2)));
}

static void p_logicalDisconjunction(Boolean b1, Boolean b2) {
System.out.printf("%s ∨ %s = %s%n", t(b1), t(b2),
t(logicalDisconjunction(b1, b2)));
}

static Boolean logicalProduct(Boolean b1, Boolean b2) {
// 論理積
// t ^ t = t
// t ^ f = f
// t ^ u = u
// f ^ t = f
// f ^ f = f
// f ^ u = f
// u ^ t = u
// u ^ f = f
// u ^ u = u
if (b1 == null && b2 == null)
return null;
if (b1 == null && b2 != null)
return b2 ? null : false;
if (b1 != null && b2 == null)
return b1 ? null : false;
return b1 & b2;
}

static Boolean logicalDisconjunction(Boolean b1, Boolean b2) {
// 論理和
// t ∨ t = t
// t ∨ f = t
// t ∨ u = t
// f ∨ t = t
// f ∨ f = f
// f ∨ u = u
// u ∨ t = t
// u ∨ f = u
// u ∨ u = u
if (b1 == null && b2 == null)
return null;
if (b1 == null && b2 != null)
return b2 ? true : null;
if (b1 != null && b2 == null)
return b1 ? true : null;

return b1 | b2;
}
}

: