You are on page 1of 2

dividesRelation@n_IntegerD :=

Select@Tuples@Range@nD, 2D, Divisible@ð@@2DD, ð@@1DDD &D

div6 = dividesRelation@6D;

inverseRelation@R_D := Reverse@R, 2D

Reverse@81, 2, 3<D;

mul6 = inverseRelation@div6D;

findDomain@R_D := Union@Flatten@R, 1DD

findDomain@div6D;

minimalElements@R_, S_ListD := Module@8M, s, t<,


M = S;
Do@
Do@
If@MemberQ@R, 8t, s<D, M = Complement@M, 8s<DD
, 8t, Complement@S, 8s<D<D
, 8s, S<D;
M
D

minimalElements@div6, Range@6DD
81<

minimalElements@div6, Range@2, 6DD


82, 3, 5<

maximalElements@R_, S_ListD := minimalElements@inverseRelation@RD, SD

maximalElements@div6, Range@6DD
84, 5, 6<

upperBoundQ@R_, S_List, u_D := Module@8s<,


Catch@
Do@If@! MemberQ@R, 8s, u<D, Throw@FalseDD
, 8s, S<D;
Throw@TrueD
D
D

upperBoundQ@div6, 81, 2, 3<, 6D


True

upperBoundQ@div6, 81, 2, 3, 4<, 6D


False
2 prac4..nb

upperBounds@R_, S_ListD := Module@8domR, d, U = 8<<,


domR = findDomain@RD;
Do@If@upperBoundQ@R, S, dD, AppendTo@U, dDD
, 8d, domR<D;
U
D

upperBounds@div6, 81, 2<D


82, 4, 6<

leastUpperBound@R_, S_ListD := Module@8U, M<,


U = upperBounds@R, SD;
M = minimalElements@R, UD;
If@Length@MD ¹ 1, Null, M@@1DDD
D

leastUpperBound@div6, 81, 2<D


2

leastUpperBound@div6, 81, 2, 3<D


6

leastUpperBound@div6, 84, 5<D

latticeQ@R_D := hasLUBs@RD && hasGLBs@RD

hasGLBs@R_D := hasLUBs@inverseRelation@RDD

hasLUBs@R_ ? partialOrderQD := Module@8domR, a, b<,


domR = findDomain@RD;
Catch@
Do@If@leastUpperBound@R, 8a, b<D === Null, Throw@FalseDD
, 8a, domR<, 8b, domR<D;
Throw@TrueD
D
D

latticeQ@dividesRelation@10DD
False

latticeQ@divisorLattice@20DD
True

You might also like