miscelleaneous

Random Lean experiments

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
def check n (A : Vector (Vector Bool n) n) := Id.run do
  for ha : a in [:n] do
    for hb : b in [a+1:n] do
      for hc : c in [b+1:n] do
        if (A[a][b] && A[b][c] && !A[a][c]) || (!A[a][b] && !A[b][c] && A[a][c]) || (A[a][b] && A[b][c] && A[a][c]) then
        -- if (A[a][b] && A[b][c] && !A[a][c]) || (A[a][b] && !A[b][c] && !A[a][c]) || (!A[a][b] && A[b][c] && !A[a][c]) then
        -- if (A[a][b] && A[b][c] && !A[a][c]) || (A[a][b] && !A[b][c] && !A[a][c]) || (!A[a][b] && A[b][c] && !A[a][c]) || (A[a][b] && A[b][c] && A[a][c]) then
          return false
  return true

def f n := Id.run do
  let mut ans := 0
  for i in [:2^(n*(n-1)/2)] do
    let mut A := Vector.replicate n (Vector.replicate n true)
    let mut cnt := 0
    for ha : a in [:n] do
      for hb : b in [a+1:n] do
        A := A.set a <| A[a].set b <| i >>> cnt &&& 1 == 1
        cnt := cnt + 1
    ans := ans + (check n A).toNat
  return ans

def main := do
  for i in [1:8] do
    IO.println <| f i