Екзистенціальний гольф


22

У математиці багато символів. Деякі можуть сказати занадто багато символів. Тож давайте попрацюємо з математикою.

Давайте матимемо папір, який ми будемо малювати. Щоб почати папір порожній, ми скажемо, що це еквівалентно або .правдаправда

Якщо ми напишемо інші речі на папері, вони також будуть правдивими.

Наприклад

Р і Q

Вказує на те, що твердження і істинні.QПQ

Тепер скажемо, що якщо ми намалюємо коло навколо якогось твердження, це твердження є помилковим. Це представляє логічне не.

Наприклад:

не P і Q

Вказує, що неправдиво, а - істинно.QПQ

Ми навіть можемо розмістити коло навколо кількох субрепортажів:

ні (P і Q)

Оскільки частина всередині кола зазвичай читається як , ставлячи навколо себе коло, це означає . Ми можемо навіть гніздити колане  ( P  і  Q )П і Qні (П і Q)

ні (не P і Q)

Він читається як .ні ((ні П) і Q)

Якщо ми намалюємо коло, в якому нічого немає, це являє собою або . хибнепомилковий

помилковий

Оскільки порожній простір був істинним, то заперечення істинного є хибним.

Тепер, використовуючи цей простий візуальний метод, ми можемо фактично представити будь-яке твердження в логіці пропозицій.

Докази

Наступним кроком після представлення тверджень є можливість їх доведення. Для підтвердження у нас є 4 різні правила, які можна використовувати для перетворення графіка. Ми завжди починаємо з порожнього аркуша, який, як ми знаємо, є істинною істиною, а потім використовуємо ці різні правила для перетворення нашого порожнього аркуша паперу в теорему.

Наше перше правило висновку - Введення .

Введення

Ми назвемо кількість заперечень між під графіком та верхнім рівнем, це "глибина". Вставка дозволяє нам вводити будь-яке твердження, яке ми бажаємо, на непарній глибині.

Ось приклад того, як ми виконуємо вставку:

Приклад вставки

П

Стирання

Наступне правило умовиводу - Erazure . Ерасура говорить нам, що якщо у нас є рівномірне твердження, ми можемо видалити його повністю.

Ось приклад застосованого стирання:

Приклад стирання

Q2П1

Подвійний крій

Double Cut - еквівалентність. Що означає, на відміну від попередніх умовиводів, його також можна змінити. Подвійний виріз говорить нам, що ми можемо намалювати два кола навколо будь-якого під графіку, а якщо навколо під графіку є два кола, ми можемо видалити їх обидва.

Ось приклад Double Cut використовується

Приклад подвійного вирізу

Q

Ітерація

Ітерація також є еквівалентністю. 1 Це зворотний варіант називається Deiteration. Якщо у нас є оператор і розріз на одному рівні, ми можемо скопіювати це твердження всередині розрізу.

Наприклад:

Приклад ітерації

Дейтерація дозволяє нам повернути ітерацію . Виписка може бути видалена за допомогою Deiteration, якщо є її копія на наступному рівні вгору.


Цей формат подання та підтвердження не є моїм власним винаходом. Вони є незначною модифікацією схематичної логіки, які називаються Альфа екзистенціальними графіками . Якщо ви хочете детальніше прочитати про це, тонна літератури не є, але пов’язана стаття - хороший початок.


Завдання

Вашим завданням буде довести наступну теорему:

Лукасевич - Аксіома Тарксі

Це при перекладі на традиційну логіку символізується

((А(БА))(((¬С(D¬Е))((С(DЖ))((ЕD)(ЕЖ))))Г))(НГ).

Також відомий як Аксіома Лукасевіч-Тарського .

Це може здатися залученим, але екзистенціальні графіки дуже ефективні, коли мова йде про довжину доказу. Я вибрав цю теорему, тому що я думаю, що це відповідна довжина для веселої та цікавої головоломки. Якщо у вас виникають проблеми з цим, я б рекомендував спершу спробувати ще кілька основних теорем, щоб перевірити систему. Список їх можна знайти внизу публікації.

Це тому ваш рахунок буде загальною кількістю кроків у вашому доказі від початку до кінця. Мета - мінімізувати ваш рахунок.

Формат

Формат цього виклику є гнучким, ви можете надсилати відповіді у будь-якому форматі, який добре читається, включаючи формати, намальовані вручну або візуалізовані. Однак для наочності пропоную наступний простий формат:

  • Ми представляємо розріз з дужками, все, що ми ріжемо, поміщаємо всередину парен. Порожній зріз був би, ()наприклад.

  • Ми представляємо атоми лише їхніми літерами.

Як приклад наводимо формулювання мети в такому форматі:

(((A((B(A))))(((((C)((D((E)))))(((C((D(F))))(((E(D))((E(F))))))))(G))))((H(G))))

Цей формат є приємним, оскільки він читається як у людському, так і в машинному стані, тому включити його у свою посаду було б непогано.

LАТЕХ

Спробуйте в Інтернеті!

Що стосується вашої фактичної роботи, то я рекомендую олівець та папір при розробці. Я вважаю, що текст просто не такий інтуїтивний, як папір, коли мова йде про екзистенційні графіки.

Приклад підтвердження

У цьому прикладі доказу ми доведемо наступну теорему:

Закон контрапозитивів

(АБ)(¬Б¬А)

Доказ:

Приклад доведення 1

Теореми практики

Ось кілька простих теорем, які ви можете використовувати для практики системи:

Друга аксіома Лукасевича

Друга аксіома Лукасевича

Аксіома Мередіта

Аксіома Мередіта

1: Більшість джерел використовують більш складну та потужну версію Ітерації , але для спрощення цієї проблеми я використовую цю версію. Вони функціонально рівноцінні.


Я відчуваю, що це питання краще підходить для спантеличення
Conor O'Brien

4
@ ConorO'Brien Чому? Головоломка в основному стосується відповідей, а не оптимізації. На це питання дуже легко відповісти, що робить його здебільшого проблемою для гольфу.
Пшеничний майстер

Неймовірність може бути пов'язана з оптимізацією. Я відчуваю, що цей виклик може знайти кращий дім із загадкою, але це, звичайно, лише моя думка
Конор О'Брайен

4
@connorobrien proof-golf - давно відома частина цієї спільноти, і це може довго тривати.
Натаніел

1
Ось сайт із веселим інтерактивним Flash-аплетом про такі види виразів: markability.net
Woofmao

Відповіді:


7

19 сходинок

  1. (()) [подвійний зріз]
  2. (AB()(((G)))) [вставка]
  3. (AB(A)(((G)))) [ітерація]
  4. (((AB(A)))(((G)))) [подвійний зріз]
  5. (((AB(A))(((G))))(((G)))) [ітерація]
  6. (((AB(A))(((G))))((H(G)))) [вставка]
  7. (((AB(A))(((G)(()))))((H(G)))) [подвійний зріз]
  8. (((AB(A))(((DE()(C)(F))(G))))((H(G)))) [вставка]
  9. (((AB(A))(((DE(C)(DE(C))(F))(G))))((H(G)))) [ітерація]
  10. (((AB(A))(((DE(CD(F))(DE(C))(F))(G))))((H(G)))) [ітерація]
  11. (((AB(A))(((E(CD(F))(DE(C))(F)((D)))(G))))((H(G)))) [подвійний зріз]
  12. (((AB(A))(((E(CD(F))(DE(C))(E(D))(F))(G))))((H(G)))) [ітерація]
  13. (((AB(A))(((G)((CD(F))(DE(C))(E(D))((E(F)))))))((H(G)))) [подвійний зріз]
  14. (((AB(A))(((G)((CD(F))(DE(C))(((E(D))((E(F)))))))))((H(G)))) [подвійний зріз]
  15. (((AB(A))(((G)((C((D(F))))(DE(C))(((E(D))((E(F)))))))))((H(G)))) [подвійний зріз]
  16. (((AB(A))(((G)((DE(C))(((C((D(F))))(((E(D))((E(F)))))))))))((H(G)))) [подвійний зріз]
  17. (((AB(A))(((G)((D(C)((E)))(((C((D(F))))(((E(D))((E(F)))))))))))((H(G)))) [подвійний зріз]
  18. (((AB(A))(((G)(((C)((D((E)))))(((C((D(F))))(((E(D))((E(F)))))))))))((H(G)))) [подвійний зріз]
  19. (((A((B(A))))(((G)(((C)((D((E)))))(((C((D(F))))(((E(D))((E(F)))))))))))((H(G)))) [подвійний зріз]

Практикуйте теореми

Друга аксіома Лукасевича: 7 кроків

  1. (()) [подвійний зріз]
  2. (A()(B)(C)) [вставка]
  3. (A(A(B))(B)(C)) [ітерація]
  4. (A(AB(C))(A(B))(C)) [ітерація]
  5. ((AB(C))(A(B))((A(C)))) [подвійний зріз]
  6. ((AB(C))(((A(B))((A(C)))))) [подвійний зріз]
  7. ((A((B(C))))(((A(B))((A(C)))))) [подвійний зріз]

Аксіома Мередіт: 11 кроків

  1. (()) [подвійний зріз]
  2. (()(D(A)(E))) [вставка]
  3. ((D(A)(E))((D(A)(E)))) [ітерація]
  4. ((D(A)(E))((D(A)(E(A))))) [ітерація]
  5. ((D(A)(E))(((E(A))((D(A)))))) [подвійний зріз]
  6. (((E)((D(A))))(((E(A))((D(A)))))) [подвійний зріз]
  7. (((E)((C)(D(A))))(((E(A))((D(A)))))) [вставка]
  8. (((E)((C)(D(A)(C))))(((E(A))((D(A)))))) [ітерація]
  9. (((E)((C)((A)(C)((D)))))(((E(A))((D(A)))))) [подвійний зріз]
  10. (((E)((C)((A)(((C)((D)))))))(((E(A))((D(A)))))) [подвійний зріз]
  11. (((E)((C)((A(B))(((C)((D)))))))(((E(A))((D(A)))))) [вставка]

Пошук доказів Haskell

(Що, ти думав, я збираюся це зробити вручну? :-P)

Це лише спроба вставки, подвійного введення та ітерації. Тому все ще можливо, ці рішення можна побити за допомогою стирання, подвійного усунення або дейтерації.

{-# LANGUAGE ViewPatterns #-}

import Control.Applicative hiding (many)
import Data.Char
import Data.Function hiding ((&))
import qualified Data.Map as M
import Data.Maybe
import qualified Data.MultiSet as S
import qualified Data.PQueue.Prio.Min as Q
import System.IO
import Text.ParserCombinators.ReadP

type Var = Char

data Part
  = Var Var
  | Not Conj
  deriving (Eq, Ord)

instance Show Part where
  show (Var s) = [s]
  show (Not c) = "(" ++ show c ++ ")"

newtype Conj = Conj
  { parts :: S.MultiSet Part
  } deriving (Eq, Ord)

instance Show Conj where
  show (Conj (S.toAscList -> [])) = ""
  show (Conj (S.toAscList -> g:gs)) =
    show g ++ concat ["" ++ show g1 | g1 <- gs]

true :: Conj
true = Conj S.empty

not_ :: Conj -> Conj
not_ = Conj . S.singleton . Not

(&) :: Conj -> Conj -> Conj
Conj as & Conj bs = Conj (S.union as bs)

intersect :: Conj -> Conj -> Conj
intersect (Conj as) (Conj bs) = Conj (S.intersection as bs)

diff :: Conj -> Conj -> Conj
diff (Conj as) (Conj bs) = Conj (S.difference as bs)

splits :: Conj -> [(Conj, Conj)]
splits =
  S.foldOccur
    (\a o bcs ->
       [ (Conj (S.insertMany a o1 bs), Conj (S.insertMany a (o - o1) cs))
       | (Conj bs, Conj cs) <- bcs
       , o1 <- [0 .. o]
       ])
    [(true, true)] .
  parts

moves :: Bool -> Conj -> [(Conj, String)]
moves ev a =
  (do (b, c) <- splits a
      andMoves ev b c) ++
  (do (p, _) <- S.toOccurList (parts a)
      partMoves ev p (Conj (S.delete p (parts a))))

andMoves :: Bool -> Conj -> Conj -> [(Conj, String)]
andMoves ev a b = [(a, "insertion") | not ev]

partMoves :: Bool -> Part -> Conj -> [(Conj, String)]
partMoves ev (Not a) b =
  [(a1 & b, why) | (a1, why) <- notMoves ev a] ++
  [ (not_ (diff a d) & b, "iteration")
  | (d, _) <- splits (intersect a b)
  , d /= true
  ]
partMoves _ (Var _) _ = []

notMoves :: Bool -> Conj -> [(Conj, String)]
notMoves ev a =
  (case S.toList (parts a) of
     [Not b] -> [(b, "double cut")]
     _ -> []) ++
  [(not_ a1, why) | (a1, why) <- moves (not ev) a]

partSat :: Part -> Bool -> M.Map Var Bool -> [M.Map Var Bool]
partSat (Var var) b m =
  case M.lookup var m of
    Nothing -> [M.insert var b m]
    Just b1 -> [m | b1 == b]
partSat (Not c) b m = conjSat c (not b) m

conjSat :: Conj -> Bool -> M.Map Var Bool -> [M.Map Var Bool]
conjSat c False m = do
  (p, _) <- S.toOccurList (parts c)
  partSat p False m
conjSat c True m = S.foldOccur (\p _ -> (partSat p True =<<)) [m] (parts c)

readConj :: ReadP Conj
readConj = Conj . S.fromList <$> many readPart

readPart :: ReadP Part
readPart =
  Var <$> satisfy isAlphaNum <|> Not <$> (char '(' *> readConj <* char ')')

parse :: String -> Maybe Conj
parse s = listToMaybe [c | (c, "") <- readP_to_S readConj s]

partSize :: Part -> Int
partSize (Var _) = 1
partSize (Not c) = 1 + conjSize c

conjSize :: Conj -> Int
conjSize c = sum [partSize p * o | (p, o) <- S.toOccurList (parts c)]

data Pri = Pri
  { dist :: Int
  , size :: Int
  } deriving (Eq, Show)

instance Ord Pri where
  compare = compare `on` \(Pri d s) -> (s + d, d)

search ::
     Q.MinPQueue Pri (Conj, [(Conj, String)])
  -> M.Map Conj Int
  -> [[(Conj, String)]]
search (Q.minViewWithKey -> Nothing) _ = []
search (Q.minViewWithKey -> Just ((pri, (a, proof)), q)) m =
  [proof | a == true] ++
  uncurry search (foldr (addMove pri a proof) (q, m) (moves True a))

addMove ::
     Pri
  -> Conj
  -> [(Conj, String)]
  -> (Conj, String)
  -> (Q.MinPQueue Pri (Conj, [(Conj, String)]), M.Map Conj Int)
  -> (Q.MinPQueue Pri (Conj, [(Conj, String)]), M.Map Conj Int)
addMove pri b proof (a, why) (q, m) =
  case M.lookup a m of
    Just d
      | d <= d1 -> (q, m)
    _
      | null (conjSat a False M.empty) ->
        ( Q.insert (Pri d1 (conjSize a)) (a, (b, why) : proof) q
        , M.insert a d1 m)
    _ -> (q, m)
  where
    d1 = dist pri + 1

prove :: Conj -> [[(Conj, String)]]
prove c = search (Q.singleton (Pri 0 (conjSize c)) (c, [])) (M.singleton c 0)

printProof :: [(Conj, String)] -> IO ()
printProof proof = do
  mapM_
    (\(i, (a, why)) ->
       putStrLn (show i ++ ". `" ++ show a ++ "`  [" ++ why ++ "]"))
    (zip [1 ..] proof)
  putStrLn ""
  hFlush stdout

main :: IO ()
main = do
  Just theorem <- parse <$> getLine
  mapM_ printProof (prove theorem)

4

22 кроки

(((())(())))

(((AB())(CDE(F)()))H(G))

(((AB(A))(CDE(F)(CD(F)))(G))H(G))

(((A((B(A))))(((((C))DE(F)(C((D(F)))))(G))))((H(G))))

(((A((B(A))))(((((C)DE)DE(F)(C((D(F)))))(G))))((H(G))))

(((A((B(A))))(((((C)((D((E)))))((((((D))E(F)))(C((D(F)))))))(G))))((H(G))))

(((A((B(A))))(((((C)((D((E)))))((((((D)E)E(F)))(C((D(F)))))))(G))))((H(G))))

(((A((B(A))))(((((C)((D((E)))))((((((D)E)((E(F)))))(C((D(F)))))(G))))))((H(G))))


Кілька речей, які я навчився виконувати цю головоломку:

  • Зменшіть подане подання. Це передбачає обернення подвійних скорочень та ітерацій. Наприклад, ця аксіома зводиться до (((AB(A))(((C)DE)(CD(F))(E(D))(E(F)))(G))H(G))після реверсування подвійних розрізів та (((AB(A))(()CDE(F)))H(G)))після повторних ітерацій.

  • Шукайте бродячих атомів. Наприклад, Н використовується як фіктивна змінна, і тому її можна вставити в будь-яку точку.


Практичні рішення теореми:

Рішення для другої аксіоми Лукасевича: [8 кроків]

(())

(()AB(C))

((AB(C))AB(C))

((A((B(C))))A((B))(C))

((A((B(C))))A(A(B))(C))

((A((B(C))))(((A(B))((A(C))))))

Рішення для аксіоми Мередіта: [12 кроків]

(())

(()(A)D(E))

(((A)D(E))(A)D(E(A)))

(((((A)D))(E))(A)D(E(A)))

(((((A(B))D)(C))(E))(A)D(E(A)))

(((((A(B))(C)D)(C))(E))(A)D(E(A)))

(((((A(B))(((C)((D)))))(C))(E))(((((A)D))(E(A)))))


Я оновив, щоб включити моє повне рішення. Весела головоломка! Будь ласка, дайте мені знати, як я можу покращити свою посаду.
Логікабль

Як правило, тут відповіді не приховані - припущення, що читання відповіді означає "спойлер" до рішення. Також у нас є MathJax, використовуючи \$як початок / кінець, який, на мою думку, полегшить читання вашого рішення. Сподіваюся, вам тут приємно провести час :)
FryAmTheEggman

Я оновив кількість використаних правил (доказ залишається тим самим). Чи може хтось, хто добре форматує, допомогти покращити мою відповідь?
Логікабл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.