118 lines
2.4 KiB
Go
118 lines
2.4 KiB
Go
package formulae
|
|
|
|
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
|
|
* CONSTANTS
|
|
* ---------------------------------------------------------------- */
|
|
|
|
var Tautology = Formula{
|
|
kind: "taut",
|
|
expr: "1",
|
|
valence: 0,
|
|
subformulae: [](*Formula){},
|
|
}
|
|
|
|
var Contradiction = Formula{
|
|
kind: "contradiction",
|
|
expr: "0",
|
|
valence: 0,
|
|
subformulae: [](*Formula){},
|
|
}
|
|
|
|
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
|
|
* METHODS: Constructions
|
|
* ---------------------------------------------------------------- */
|
|
|
|
func Atom(expr string) Formula {
|
|
return Formula{
|
|
kind: "atom",
|
|
expr: expr,
|
|
valence: 0,
|
|
subformulae: [](*Formula){},
|
|
}
|
|
}
|
|
|
|
func NegatedAtom(expr string) Formula {
|
|
return Negation(Atom(expr))
|
|
}
|
|
|
|
func Generic(expr string) Formula {
|
|
return Formula{
|
|
kind: "generic",
|
|
expr: expr,
|
|
valence: 0,
|
|
subformulae: [](*Formula){},
|
|
}
|
|
}
|
|
|
|
func Negation(fml Formula) Formula {
|
|
return Formula{
|
|
kind: "not",
|
|
expr: "!" + " " + fml.expr,
|
|
valence: 1,
|
|
subformulae: [](*Formula){&fml},
|
|
}
|
|
}
|
|
|
|
func Conjunction2(fml1 Formula, fml2 Formula) Formula {
|
|
return Formula{
|
|
kind: "and2",
|
|
expr: "(" + fml1.expr + " && " + fml2.expr + ")",
|
|
valence: 2,
|
|
subformulae: [](*Formula){&fml1, &fml2},
|
|
}
|
|
}
|
|
|
|
func Conjunction(fmls []Formula) Formula {
|
|
var expr string = ""
|
|
var children = make([](*Formula), len(fmls))
|
|
for i, fml := range fmls {
|
|
if i > 0 {
|
|
expr += " && "
|
|
}
|
|
expr += fml.expr
|
|
children[i] = &fml
|
|
}
|
|
return Formula{
|
|
kind: "and",
|
|
expr: "(" + expr + ")",
|
|
valence: len(children),
|
|
subformulae: children,
|
|
}
|
|
}
|
|
|
|
func Disjunction2(fml1 Formula, fml2 Formula) Formula {
|
|
return Formula{
|
|
kind: "or2",
|
|
expr: "(" + fml1.expr + " || " + fml2.expr + ")",
|
|
valence: 2,
|
|
subformulae: [](*Formula){&fml1, &fml2},
|
|
}
|
|
}
|
|
|
|
func Disjunction(fmls []Formula) Formula {
|
|
var expr string = ""
|
|
var children = make([](*Formula), len(fmls))
|
|
for i, fml := range fmls {
|
|
if i > 0 {
|
|
expr += " || "
|
|
}
|
|
expr += fml.expr
|
|
children[i] = &fml
|
|
}
|
|
return Formula{
|
|
kind: "or",
|
|
expr: "(" + expr + ")",
|
|
valence: len(children),
|
|
subformulae: children,
|
|
}
|
|
}
|
|
|
|
func Implies(fml1 Formula, fml2 Formula) Formula {
|
|
return Formula{
|
|
kind: "implies",
|
|
expr: "(" + fml1.expr + " -> " + fml2.expr + ")",
|
|
valence: 2,
|
|
subformulae: [](*Formula){&fml1, &fml2},
|
|
}
|
|
}
|