|
@@ -1,5 +1,6 @@
|
|
|
package tri
|
|
|
|
|
|
+/* троичная логика */
|
|
|
var TRUE Trit = Trit{n: false, t: true}
|
|
|
var FALSE Trit = Trit{n: false, t: false}
|
|
|
var NIL Trit = Trit{n: true, t: false}
|
|
@@ -18,3 +19,199 @@ func (t Trit) String() string {
|
|
|
return "%false"
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+func False(t Trit) bool {
|
|
|
+ return t == FALSE
|
|
|
+}
|
|
|
+
|
|
|
+func True(t Trit) bool {
|
|
|
+ return t == TRUE
|
|
|
+}
|
|
|
+
|
|
|
+func Nil(t Trit) bool {
|
|
|
+ return t == NIL
|
|
|
+}
|
|
|
+
|
|
|
+func Not(t Trit) Trit {
|
|
|
+ if t == TRUE {
|
|
|
+ return FALSE
|
|
|
+ } else if t == FALSE {
|
|
|
+ return TRUE
|
|
|
+ } else {
|
|
|
+ return NIL
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func Impl(p, q Trit) Trit {
|
|
|
+ if False(p) && False(q) {
|
|
|
+ return TRUE
|
|
|
+ } else if False(p) && True(q) {
|
|
|
+ return TRUE
|
|
|
+ } else if True(p) && False(q) {
|
|
|
+ return FALSE
|
|
|
+ } else if True(p) && True(q) {
|
|
|
+ return TRUE
|
|
|
+ } else if True(p) && Nil(q) {
|
|
|
+ return NIL
|
|
|
+ } else if Nil(p) && False(q) {
|
|
|
+ return NIL
|
|
|
+ } else if False(p) && Nil(q) {
|
|
|
+ return TRUE
|
|
|
+ } else if Nil(p) && Nil(q) {
|
|
|
+ return TRUE
|
|
|
+ } else if Nil(p) && True(q) {
|
|
|
+ return TRUE
|
|
|
+ }
|
|
|
+ panic(0)
|
|
|
+}
|
|
|
+
|
|
|
+func CNot(t Trit) Trit {
|
|
|
+ if t == TRUE {
|
|
|
+ return FALSE
|
|
|
+ } else if t == FALSE {
|
|
|
+ return NIL
|
|
|
+ } else {
|
|
|
+ return TRUE
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func Or(p, q Trit) Trit {
|
|
|
+ return Impl(Impl(p, q), q)
|
|
|
+}
|
|
|
+
|
|
|
+func And(p, q Trit) Trit {
|
|
|
+ return Not(Or(Not(p), Not(q)))
|
|
|
+}
|
|
|
+
|
|
|
+func Eq(p, q Trit) Trit {
|
|
|
+ return And(Impl(p, q), Impl(q, p))
|
|
|
+}
|
|
|
+
|
|
|
+func This(x int) Trit {
|
|
|
+ if x == 1 {
|
|
|
+ return TRUE
|
|
|
+ } else if x == 0 {
|
|
|
+ return NIL
|
|
|
+ } else if x == -1 {
|
|
|
+ return FALSE
|
|
|
+ }
|
|
|
+ panic(0)
|
|
|
+}
|
|
|
+
|
|
|
+func Ord(t Trit) int {
|
|
|
+ if t == FALSE {
|
|
|
+ return -1
|
|
|
+ } else if t == NIL {
|
|
|
+ return 0
|
|
|
+ } else if t == TRUE {
|
|
|
+ return 1
|
|
|
+ }
|
|
|
+ panic(0)
|
|
|
+}
|
|
|
+
|
|
|
+func Sum3(p, q Trit) Trit {
|
|
|
+ switch Ord(p) {
|
|
|
+ case -1:
|
|
|
+ return q
|
|
|
+ case 0:
|
|
|
+ if False(q) {
|
|
|
+ return NIL
|
|
|
+ } else if Nil(q) {
|
|
|
+ return TRUE
|
|
|
+ } else {
|
|
|
+ return FALSE
|
|
|
+ }
|
|
|
+ case 1:
|
|
|
+ if False(q) {
|
|
|
+ return TRUE
|
|
|
+ } else if Nil(q) {
|
|
|
+ return FALSE
|
|
|
+ } else {
|
|
|
+ return NIL
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ panic(0)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func Sum3r(p, q Trit) Trit {
|
|
|
+ return CNot(CNot(Sum3(p, q)))
|
|
|
+}
|
|
|
+
|
|
|
+func CarryS(p, q Trit) Trit {
|
|
|
+ switch Ord(p) {
|
|
|
+ case -1:
|
|
|
+ return FALSE
|
|
|
+ case 0:
|
|
|
+ if True(q) {
|
|
|
+ return NIL
|
|
|
+ } else {
|
|
|
+ return FALSE
|
|
|
+ }
|
|
|
+ case 1:
|
|
|
+ if False(q) {
|
|
|
+ return FALSE
|
|
|
+ } else {
|
|
|
+ return NIL
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ panic(0)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func CarrySr(p, q Trit) Trit {
|
|
|
+ if False(p) && False(q) {
|
|
|
+ return FALSE
|
|
|
+ } else if True(p) && True(q) {
|
|
|
+ return TRUE
|
|
|
+ } else {
|
|
|
+ return NIL
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func Mul3(p, q Trit) Trit {
|
|
|
+ switch Ord(p) {
|
|
|
+ case -1:
|
|
|
+ return FALSE
|
|
|
+ case 0:
|
|
|
+ return q
|
|
|
+ case 1:
|
|
|
+ if False(q) {
|
|
|
+ return FALSE
|
|
|
+ } else if Nil(q) {
|
|
|
+ return TRUE
|
|
|
+ } else {
|
|
|
+ return NIL
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ panic(0)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func CarryM(p, q Trit) Trit {
|
|
|
+ if True(p) && True(q) {
|
|
|
+ return NIL
|
|
|
+ } else {
|
|
|
+ return FALSE
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func Mul3r(p, q Trit) Trit {
|
|
|
+ if Nil(p) && Nil(q) {
|
|
|
+ return NIL
|
|
|
+ } else {
|
|
|
+ if p == q {
|
|
|
+ return TRUE
|
|
|
+ } else {
|
|
|
+ return FALSE
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func Webb(p, q Trit) Trit {
|
|
|
+ return CNot(Or(p, q))
|
|
|
+}
|
|
|
+
|
|
|
+func Mod(t Trit) Trit {
|
|
|
+ return Or(t, Not(t))
|
|
|
+}
|