
Last chance! 50% off unlimited learning
Sale ends in
Creation and manipulation of relations.
relation(domain = NULL, incidence = NULL, graph = NULL,
charfun = NULL)
endorelation(domain = NULL, incidence = NULL, graph = NULL,
charfun = NULL)
homorelation(domain = NULL, incidence = NULL, graph = NULL,
charfun = NULL)
as.relation(x, ...)
is.relation(x)
List (or tuple) of (possibly named) sets (or vectors)
used as the domain, recycled as needed to fit the arity of the relation.
If domain
is not a list or tuple, it is converted to a list.
A numeric array with values in the unit interval, or
a logical array. Note that one-dimensional incidences are also
accepted. The names
/dimnames
attribute of
incidence
is used as domain if this is not explicitly given
using the domain
argument.
Either a set of equally sized tuples, or a list of (possibly, generic) vectors of same length where each component specifies one relation element, or a data frame where each row specifies one relation element. For the latter, the columns correspond to the domain sets, and the colnames are used as their labels if specified.
A characteristic function of the relation, i.e., a
predicate function taking
an R object.
Further arguments passed to as.relation()
methods (currently not used for those defined in the relations
package).
Given
Strictly speaking, the relation is the pair
The characteristic function
Relations with arity 2, 3, and 4 are typically referred to as
binary, ternary, and quaternary relations,
respectively. A homorelation on
Relations with the same domain can naturally be ordered according to
their graphs. I.e.,
The complement (or negation)
For binary crisp relations
For binary fuzzy relations
Package relations implements finite relations as an S3 class
which allows for a variety of representations (even though currently,
typically dense array representations of the incidences are employed).
Other than by the generator,
relations can be obtained by coercion via the generic function
as.relation()
, which has methods for at least logical and numeric
vectors, unordered and ordered factors, arrays including matrices, and
data frames. Unordered factors are coerced to equivalence relations;
ordered factors and numeric vectors are coerced to order relations.
Logical vectors give unary relations (predicates). A (feasible)
endorelation()
is a wrapper for relation()
, trying to
guess a suitable domain from its arguments to create an
endorelation. If a domain is given, all labels are combined and the
result (as a list) recycled as needed.
Basic relation operations are available as group methods: min()
and max()
give the meet and join, and range()
a
relation ensemble with these two.
Comparison operators implement the natural ordering in the relation
lattice. Where applicable, !
gives the complement (negation),
&
and |
intersection and union, and *
composition, respectively. Finally, t()
gives the transpose
and codual()
the codual.
There is a plot()
method for certain
crisp endorelations provided that package Rgraphviz is
available.
For crisp endorelations sym()
and asy()
give
the symmetric and asymmetric parts of
The summary()
method applies all predicates available
and returns a logical vector with the corresponding results.
S. A. Clark (1990), A folk meta-theorem in the foundations of utility theory. Mathematical Social Sciences, 19/3, 253--267. tools:::Rd_expr_doi("10.1016/0165-4896(90)90065-F").
S. Ovchinnikov (1991), Similarity relations, fuzzy partitions, and fuzzy orderings. Fuzzy Sets and Systems, 40/1, 107--126. tools:::Rd_expr_doi("10.1016/0165-0114(91)90048-U").
relation_incidence()
for obtaining incidences;
relation_domain()
for determining domain, arity, and
size;
relation_graph()
for determining the graph of a relation;
relation_charfun()
for determining the characteristic
function;
predicates for available predicate functions; and
algebra for further operations defined on relations.
require("sets") # set(), tuple() etc.
## A relation created by specifying the graph:
R <- relation(graph = data.frame(A = c(1, 1:3), B = c(2:4, 4)))
relation_incidence(R)
## extract domain
relation_domain(R)
## extract graph
relation_graph(R)
## both ("a pair of domain and graph" ...)
as.tuple(R)
## (Almost) the same using the set specification
## (the domain labels are missing).
R <- relation(graph = set(tuple(1,2), tuple(1,3),
tuple(2,4), tuple(3,4)))
## equivalent to:
## relation(graph = list(c(1,2), c(1,3), c(2,4), c(3,4)))
relation_incidence(R)
## Explicitly specifying the domain:
R <- relation(domain = list(A = letters[1:3], B = LETTERS[1:4]),
graph = set(tuple("a","B"), tuple("a","C"),
tuple("b","D"), tuple("c","D")))
relation_incidence(R)
## Domains can be composed of arbitrary R objects:
R <- relation(domain = set(c, "test"),
graph = set(tuple(c, c), tuple(c, "test")))
relation_incidence(R)
## Characteristic function ("a divides b"):
R <- relation(domain = list(1 : 10, 1 : 10),
charfun = function(a, b) b %% a == 0)
relation_incidence(R)
## R is a partial order: plot the Hasse diagram provided that
## Rgraphviz is available:
if(require("Rgraphviz")) plot(R)
## conversions and operators
x <- matrix(0, 3, 3)
R1 <- as.relation(row(x) >= col(x))
R2 <- as.relation(row(x) <= col(x))
R3 <- as.relation(row(x) < col(x))
relation_incidence(max(R1, R2))
relation_incidence(min(R1, R2))
R3 < R2
relation_incidence(R1 * R2)
relation_incidence(! R1)
relation_incidence(t(R2))
### endorelation
s <- set(pair("a","b"), pair("c","d"))
relation_incidence(relation(graph = s))
relation_incidence(endorelation(graph = s))
Run the code above in your browser using DataLab