public static void Main()
Console.Write("Enter A: ");
var a = Console.ReadLine()!.ToCharArray().Select(c => int.Parse(c.ToString()));
Console.Write("Enter R: ");
var i = Console.ReadLine()!.ToCharArray().Select(c => int.Parse(c.ToString()));
var r = i.Chunk(2).Select(p => (p[0], p[1])).ToList();
Console.WriteLine($"Reflexive: {IsReflexive(a, r)}");
Console.WriteLine($"Symmetric: {IsSymmetric(r)}");
Console.WriteLine($"Transitive: {IsTransitive(r)}");
static bool IsReflexive(IEnumerable<int> set, IEnumerable<(int, int)> relations)
return set.All(x => relations.Contains((x, x)));
static bool IsSymmetric(IEnumerable<(int, int)> relations)
return relations.All(r => relations.Contains((r.Item2, r.Item1)));
static bool IsTransitive(IEnumerable<(int, int)> relations)
.Where(r => r.Item1 != r.Item2)
.SelectMany(r1 => relations.Select(r2 => (r1, r2)))
.Where(r => r.r1.Item2 == r.r2.Item1)
.All(r => relations.Contains((r.r1.Item1, r.r2.Item2)));
static void PrintTransitiveTable(IEnumerable<(int, int)> relations)
foreach (var relation1 in relations.Where(r => r.Item1 != r.Item2))
foreach (var relation2 in relations.Where(r => relation1 != r).Where(r => relation1.Item2 == r.Item1))
Console.WriteLine($"({relation1.Item1}, {relation1.Item2}) | ({relation2.Item1}, {relation2.Item2}) | ({relation1.Item1}, {relation2.Item2}) | {relations.Contains((relation1.Item1, relation2.Item2))}");