Viết nó thành kiểu lý thuyết số


19

Viết một câu lệnh toán học, sử dụng các ký hiệu:

  • There exists at least one non-negative integer(viết là E, định lượng hiện sinh)
  • All non-negative integers(viết là A, định lượng phổ quát)
  • + (thêm vào)
  • * (phép nhân)
  • = (bình đẳng)
  • >, <(toán tử so sánh)
  • &(và), |(hoặc), !(không)
  • (, )(để nhóm)
  • tên biến

tương đương với tuyên bố

Tồn tại một số hữu tỷ a, sao cho π + e * a là hữu tỷ.

(tất nhiên, π= =3.1415 ... là hằng số toán học bằng chu vi chia cho đường kính của một vòng tròn và e= =2.7182 ...số của Euler )

Bạn phải chứng minh rằng tuyên bố của bạn thực sự tương đương với tuyên bố trên.

Rõ ràng, cách ngắn nhất để nói về vấn đề này là chứng minh tuyên bố đúng hay sai, và sau đó trả lời bằng một tuyên bố đúng hoặc sai, vì tất cả các tuyên bố đúng đều tương đương với nhau, cũng như tất cả các tuyên bố sai.

Tuy nhiên, giá trị thật của tuyên bố đã cho là một vấn đề chưa được giải quyết trong toán học : chúng ta thậm chí không biết liệu π+e có hợp lý không! Do đó, việc ngăn chặn các nghiên cứu toán học đột phá, thách thức là tìm ra một tuyên bố tương đương với đơn giản, chứng minh tính tương đương của nó và mô tả nó ngắn gọn nhất có thể.

Chấm điểm

E A + * = > < & |!mỗi lần thêm 1 vào điểm số. ()không thêm bất cứ điều gì vào điểm số. Mỗi tên biến thêm 1 vào điểm số.

Ví dụ: E x (A ba x+ba>x*(x+ba))điểm 13 ( E x A ba x + ba > x * x + ba)

Điểm số thấp nhất chiến thắng.


Ghi chú:

Tuyên bố miễn trừ trách nhiệm: Ghi chú này không được viết bởi OP.

  • Đây không phải là một thử thách . Câu trả lời không bắt buộc phải chứa mã.
  • Điều này tương tự, nhưng không, là một thử thách , vì bạn cần viết một tuyên bố và chứng minh nó tương đương với một tuyên bố khác.
  • Bạn được phép gửi một câu trả lời đúng (ví dụ: cho tất cả x, x = x Ax x=x) hoặc câu lệnh sai-tầm thường (ví dụ: cho tất cả x, x> x Ax x>x) nếu bạn có thể chứng minh tuyên bố trên là đúng / sai.
  • Bạn được phép sử dụng các biểu tượng bổ sung (tương tự như bổ đề trong bằng chứng golf), nhưng điểm sẽ được tính giống như bạn không sử dụng chúng.
    Ví dụ: nếu bạn xác định a => bcó nghĩa là (!a) | b, mỗi lần bạn sử dụng =>bằng chứng của mình, điểm của bạn sẽ tăng thêm 2.
  • Vì các hằng số không được liệt kê trong các ký hiệu được phép, bạn không được sử dụng chúng.
    Ví dụ: Câu lệnh 1 > 0có thể được viết là

    
    Forall zero: ( zero + zero = zero ) =>
    Forall one: ( Forall x: x * one = x ) =>
    one > zero
    

    ở điểm 23. (hãy nhớ rằng =>chi phí 2 mỗi lần sử dụng).

Gợi ý

  • Để sử dụng hằng số tự nhiên, bạn có thể làm E0, 0+0=0 & E1, At 1*t=t &(vì vậy bạn không cần =>cái nào mở rộng hơn); đối với các số lớn hơn 1, chỉ cần thêm một số

5
Tôi thích khái niệm ở đây, nhưng tuyên bố thực sự khó viết và tôi bị ấn tượng bởi bất kỳ giải pháp nào cho dù điểm số. Tôi đã đề nghị sử dụng một cái gì đó đơn giản hơn để nhiều người tham gia hơn.
xnor

1
Bạn yêu cầu một câu lệnh toán học tương đương với câu đã cho. Theo nghĩa nào thì chúng nên tương đương ? Nếu tôi đúng, tuyên bố đã cho là sai. Vì vậy, sự tương đương của nó với các báo cáo khác là khó để tôi có thể nắm bắt. Ví dụ: nó có tương đương với Có tồn tại một số hữu tỷ a không, sao cho i + e * a là hữu tỷ (trong đó i là đơn vị tưởng tượng)?
Luis Mendo

1
Ghi chú hiện tại chỉ cần nói You are allowed to submit a trivially-true (e.g., for all x, x = x Ax x=x) or a trivially-false statement (e.g., for all x, x > x Ax x>x) if you can prove the statement above is true/false.. Tuyên bố bây giờ không được chứng minh cũng không bị từ chối, vì vậy tôi thực sự không phiền nếu vấn đề trở nên nhàm chán vì vấn đề như vậy đã được giải quyết
l4m2

1
Câu hỏi như được viết dường như chủ yếu chôn vùi lede, và tránh giải thích những gì đang thực sự xảy ra, vì vậy tôi đã viết một lời giải thích nhỏ trong các ghi chú (rằng sự không tầm thường của thách thức nằm ở giá trị sự thật chưa biết hiện tại của tuyên bố đã đưa ra) .
Lynn

I'd be impressed by any solution no matter the score.Điểm số chỉ nhằm mục đích cho những người có thể giải quyết vấn đề này
l4m2

Câu trả lời:


27

671

E a (a+a>a*a & (E b (E c (E d (A e (A f (f<a | (E g (E h (E i ((A j ((!(j=(f+f+h)*(f+f+h)+h | j=(f+f+a+i)*(f+f+a+i)+i) | j+a<e & (E k ((A l (!(l>a & (E m k=l*m)) | (E m l=e*m))) & (E l (E m (m<k & g=(e*l+(j+a))*k+m)))))) & (A k (!(E l (l=(j+k)*(j+k)+k+a & l<e & (E m ((A n (!(n>a & (E o m=n*o)) | (E o n=e*o))) & (E n (E o (o<m & g=(e*n+l)*m+o))))))) | j<a+a & k=a | (E l (E m ((E n (n=(l+m)*(l+m)+m+a & n<e & (E o ((A p (!(p>a & (E q o=p*q)) | (E q p=e*q))) & (E p (E q (q<o & g=(e*p+n)*o+q))))))) & j=l+a+a & k=j*j*m))))))) & (E j (E k (E l ((E m (m=(k+l)*(k+l)+l & (E n (n=(f+m)*(f+m)+m+a & n<e & (E o ((A p (!(p>a & (E q o=p*q)) | (E q p=e*q))) & (E p (E q (q<o & j=(e*p+n)*o+q))))))))) & (A m (A n (A o (!(E p (p=(n+o)*(n+o)+o & (E q (q=(m+p)*(m+p)+p+a & q<e & (E r ((A s (!(s>a & (E t r=s*t)) | (E t s=e*t))) & (E s (E t (t<r & j=(e*s+q)*r+t))))))))) | m<a & n=a & o=f | (E p (E q (E r (!(E s (s=(q+r)*(q+r)+r & (E t (t=(p+s)*(p+s)+s+a & t<e & (E u ((A v (!(v>a & (E w u=v*w)) | (E w v=e*w))) & (E v (E w (w<u & j=(e*v+t)*u+w))))))))) | m=p+a & n=(f+a)*q & o=f*r)))))))) & (E m (m=b*(h*f)*l & (E n (n=b*(h*f+h)*l & (E o (o=c*(k*f)*i & (E p (p=c*(k*f+k)*i & (E q (q=d*i*l & (m+o<q & n+p>q | m<p+q & n>o+q | o<n+q & p>m+q))))))))))))))))))))))))))

Làm thế nào nó hoạt động

Đầu tiên, nhân với các mẫu số chung có ý nghĩa của a và (π + e · a) để viết lại điều kiện như: tồn tại a, b, c ∈ (không phải tất cả bằng 0) với a · π + b · e = c hoặc a · π - b · e = c hoặc −a · π + b · e = c. Ba trường hợp là cần thiết để giải quyết các vấn đề dấu hiệu.

Sau đó, chúng ta sẽ cần viết lại phần này để nói về π và e thông qua các xấp xỉ hợp lý: đối với tất cả các xấp xỉ hợp lý π₀ <π <π₁ và e₀ <e <e₁, chúng ta có một · π₀ + b · e₀ <c <a · π₁ + b · e₁ hoặc a · π₀ - b · e₁ <c <a · π₁ + b · e₀ hoặc −a · π₁ + b · e₀ <c <−a · π₀ + b · e₁. (Lưu ý rằng bây giờ chúng tôi nhận được miễn phí các điều kiện không phải là không có điều kiện.

Bây giờ là đến phần khó. Làm thế nào để chúng ta có được những xấp xỉ hợp lý? Chúng tôi muốn sử dụng các công thức như

2/1 · 2/3 · 4/3 · 4/5 ⋯ (2 · k) / (2 · k + 1) <π / 2 <2/1 · 2/3 · 4/3 · 4/5 (2 · k) / (2 · k + 1) · (2 ​​· k + 2) / (2 · k + 1),

((k + 1) / k) k <e <((k + 1) / k) k + 1 ,

nhưng không có cách rõ ràng để viết định nghĩa lặp của các sản phẩm này. Vì vậy, chúng tôi xây dựng một chút máy móc mà lần đầu tiên tôi mô tả trong bài Quora này . Định nghĩa:

chia (d, a): = b, a = d · b,

powerOfPrime (a, p): = ∀b, ((b> 1 và chia (b, a)) chia (p, b)),

được thỏa mãn iff a = 1, hoặc p = 1, hoặc p là số nguyên tố và a là một sức mạnh của nó. Sau đó

isDigit (a, s, p): = a <p và ∃b, (powerOfPrime (b, p) và ∃qr, (r <b và s = ​​(p · q + a) · b + r))

được thỏa mãn iff a = 0 hoặc a là một chữ số của số cơ sở s. Điều này cho phép chúng tôi biểu diễn bất kỳ tập hữu hạn nào bằng cách sử dụng các chữ số của một số số cơ sở. Bây giờ chúng ta có thể dịch các phép tính lặp bằng cách viết, đại khái, tồn tại một tập hợp các trạng thái trung gian sao cho trạng thái cuối cùng nằm trong tập hợp và mọi trạng thái trong tập hợp là trạng thái ban đầu hoặc theo một bước từ một trạng thái khác trong trạng thái khác bộ.

Thông tin chi tiết có trong mã dưới đây.

Tạo mã trong Haskell

{-# LANGUAGE ImplicitParams, TypeFamilies, Rank2Types #-}

-- Define an embedded domain-specific language for propositions.
infixr 2 :|

infixr 3 :&

infix 4 :=

infix 4 :>

infix 4 :<

infixl 6 :+

infixl 7 :*

data Nat v
  = Var v
  | Nat v :+ Nat v
  | Nat v :* Nat v

instance Num (Nat v) where
  (+) = (:+)
  (*) = (:*)
  abs = id
  signum = error "signum Nat"
  fromInteger = error "fromInteger Nat"
  negate = error "negate Nat"

data Prop v
  = Ex (v -> Prop v)
  | Al (v -> Prop v)
  | Nat v := Nat v
  | Nat v :> Nat v
  | Nat v :< Nat v
  | Prop v :& Prop v
  | Prop v :| Prop v
  | Not (Prop v)

-- Display propositions in the given format.
allVars :: [String]
allVars = do
  s <- "" : allVars
  c <- ['a' .. 'z']
  pure (s ++ [c])

showNat :: Int -> Nat String -> ShowS
showNat _ (Var v) = showString v
showNat prec (a :+ b) =
  showParen (prec > 6) $ showNat 6 a . showString "+" . showNat 7 b
showNat prec (a :* b) =
  showParen (prec > 7) $ showNat 7 a . showString "*" . showNat 8 b

showProp :: Int -> Prop String -> [String] -> ShowS
showProp prec (Ex p) (v:free) =
  showParen (prec > 1) $ showString ("E " ++ v ++ " ") . showProp 4 (p v) free
showProp prec (Al p) (v:free) =
  showParen (prec > 1) $ showString ("A " ++ v ++ " ") . showProp 4 (p v) free
showProp prec (a := b) _ =
  showParen (prec > 4) $ showNat 5 a . showString "=" . showNat 5 b
showProp prec (a :> b) _ =
  showParen (prec > 4) $ showNat 5 a . showString ">" . showNat 5 b
showProp prec (a :< b) _ =
  showParen (prec > 4) $ showNat 5 a . showString "<" . showNat 5 b
showProp prec (p :& q) free =
  showParen (prec > 3) $
  showProp 4 p free . showString " & " . showProp 3 q free
showProp prec (p :| q) free =
  showParen (prec > 2) $
  showProp 3 p free . showString " | " . showProp 2 q free
showProp _ (Not p) free = showString "!" . showProp 9 p free

-- Compute the score.
scoreNat :: Nat v -> Int
scoreNat (Var _) = 1
scoreNat (a :+ b) = scoreNat a + 1 + scoreNat b
scoreNat (a :* b) = scoreNat a + 1 + scoreNat b

scoreProp :: Prop () -> Int
scoreProp (Ex p) = 2 + scoreProp (p ())
scoreProp (Al p) = 2 + scoreProp (p ())
scoreProp (p := q) = scoreNat p + 1 + scoreNat q
scoreProp (p :> q) = scoreNat p + 1 + scoreNat q
scoreProp (p :< q) = scoreNat p + 1 + scoreNat q
scoreProp (p :& q) = scoreProp p + 1 + scoreProp q
scoreProp (p :| q) = scoreProp p + 1 + scoreProp q
scoreProp (Not p) = 1 + scoreProp p

-- Convenience wrappers for n-ary exists and forall.
class OpenProp p where
  type OpenPropV p
  ex, al :: p -> Prop (OpenPropV p)

instance OpenProp (Prop v) where
  type OpenPropV (Prop v) = v
  ex = id
  al = id

instance (OpenProp p, a ~ Nat (OpenPropV p)) => OpenProp (a -> p) where
  type OpenPropV (a -> p) = OpenPropV p
  ex p = Ex (ex . p . Var)
  al p = Al (al . p . Var)

-- Utility for common subexpression elimination.
cse :: Int -> Nat v -> (Nat v -> Prop v) -> Prop v
cse uses x cont
  | (scoreNat x - 1) * (uses - 1) > 6 = ex (\x' -> x' := x :& cont x')
  | otherwise = cont x

-- p implies q.
infixl 1 ==>

p ==> q = Not p :| q

-- Define one as the unique n with n+n>n*n.
withOne ::
     ((?one :: Nat v) =>
        Prop v)
  -> Prop v
withOne p =
  ex
    (\one ->
       let ?one = one
       in one + one :> one * one :& p)

-- a is a multiple of d.
divides d a = ex (\b -> a := d * b)

-- a is a power of p (assuming p is prime).
powerOfPrime a p = al (\b -> b :> ?one :& divides b a ==> divides p b)

-- a is 0 or a digit of the base-p number s (assuming p is prime).
isDigit a s p =
  cse 2 a $ \a ->
    a :< p :&
    ex
      (\b -> powerOfPrime b p :& ex (\q r -> r :< b :& s := (p * q + a) * b + r))

-- An injection from ℕ² to ℕ, for representing tuples.
pair a b = (a + b) ^ 2 + b

-- πn₀/πd < π/4 < πn₁/πd, with both fractions approaching π/4 as k
-- increases:
-- πn₀ = 2²·4²·6²⋯(2·k)²·k
-- πn₁ = 2²·4²·6²⋯(2·k)²·(k + 1)
-- πd = 1²⋅3²·5²⋯(2·k + 1)²
πBound p k cont =
  ex
    (\s x πd ->
       al
         (\i ->
            (i := pair (k + k) x :| i := pair (k + k + ?one) πd ==>
             isDigit (i + ?one) s p) :&
            al
              (\a ->
                 isDigit (pair i a + ?one) s p ==>
                 ((i :< ?one + ?one :& a := ?one) :|
                  ex
                    (\i' a' ->
                       isDigit (pair i' a' + ?one) s p :&
                       i := i' + ?one + ?one :& a := i ^ 2 * a')))) :&
       let πn = x * k
           πn = πn + x
       in cont πn πn πd)

-- en₀/ed < e < en₁/ed, with both fractions approaching e as k
-- increases:
-- en₀ = (k + 1)^k * k
-- en₁ = (k + 1)^(k + 1)
-- ed = k^(k + 1)
eBound p k cont =
  ex
    (\s x ed ->
       cse 3 (pair x ed) (\y -> isDigit (pair k y + ?one) s p) :&
       al
         (\i a b ->
            cse 3 (pair a b) (\y -> isDigit (pair i y + ?one) s p) ==>
            (i :< ?one :& a := ?one :& b := k) :|
            ex
              (\i' a' b' ->
                 cse 3 (pair a' b') (\y -> isDigit (pair i' y + ?one) s p) ==>
                 i := i' + ?one :& a := (k + ?one) * a' :& b := k * b')) :&
       let en = x * k
           en = en + x
       in cont en en ed)

-- There exist a, b, c ∈ ℕ (not all zero) with a·π/4 + b·e = c or
-- a·π/4 = b·e + c or b·e = a·π/4 + c.
prop :: Prop v
prop =
  withOne $
  ex
    (\a b c ->
       al
         (\p k ->
            k :< ?one :|
            Bound p k $ n πn πd ->
               eBound p k $ \en en ed ->
                 cse 3 (a * πn * ed) $ \x ->
                   cse 3 (a * πn * ed) $ \x ->
                     cse 3 (b * en * πd) $ \y ->
                       cse 3 (b * en * πd) $ \y ->
                         cse 6 (c * πd * ed) $ \z ->
                           (x + y :< z :& x + y :> z) :|
                           (x :< y + z :& x :> y + z) :|
                           (y :< x + z :& y :> x + z))))

main :: IO ()
main = do
  print (scoreProp prop)
  putStrLn (showProp 0 prop allVars "")

Hãy thử trực tuyến!


"được thỏa mãn iff a = 1, hoặc p là số nguyên tố và a là sức mạnh của nó" - bạn cũng có thể có p = 1. Mặc dù p> 1 được ngụ ý bởi isDigit, nơi duy nhất bạn sử dụng nó.
Ørjan Johansen

@ RjanJohansen Cảm ơn, tôi đã sửa ghi chú đó. (Thực ra không có vấn đề gì thiết lập powerOfPrimeisDigitkết thúc đại diện trong các trường hợp bất ngờ, miễn là có cách nào đó để đại diện cho mọi tập hợp hữu hạn.)
Anders Kaseorg

2
Nếu tôi acó điểm 7 hoặc cao hơn, tôi nghĩ, thì nó sẽ đáng để thêm một ex (\a' -> a' := a :& ... )trình bao bọc isDigit.
Ørjan Johansen

@ RjanJohansen Chắc chắn, tiết kiệm 68. Cảm ơn!
Anders Kaseorg

Tôi tin rằng bạn cần phải yêu cầu k>0, vì eBoundđưa ra mẫu số 0 (và một tử số 0) trong k==0trường hợp này, vì vậy tất cả các phương án đều thất bại.
Ørjan Johansen

3

270

E1                                                                              { Exist 1, defined when Any k introduced }
Ec1 Ec2 Ec3 Ec4 Ec5 Ak k*1=k & c3>1 & ( En0 An n<n0 |                           { for large enough n, |(c1-c4)e+c3(4-pi)/8+(c2-c5)|<1/k }
Ex Ep Ew Emult At (Eb ((b>1 & Eh b*h=t) &! Eh h*p=b)) |                         { x read in base-p, then each digit in base-w. t as a digit }
Ee1 Ee2 Ehigher Elower e2<p & lower<t & ((higher*p+e1)*p+e2)*t+lower=x &        { last digit e1, this digit e2 }
    { Can infer that e2=w+1 | e1<=e2 & u1<=u2 & i1<=i2 & s1<=s2 & t1<=t2, so some conditions omitted }
Ei1 Es1 Et1 Eu1 (((u1*w)+i1)*w+t1)*w+s1=e1 &                                    { (u,i,t,s) }
Ei2 Es2 Et2 Eu2 i2<w & s2<w & t2<w & (((u2*w)+i2)*w+t2)*w+s2=e2 &               { e2=1+w is initial state u=i=0, s=t=1 }
(e2=w+1 | e1=e2 | i2=i1+1+1 & s2=s1*(n+1) & t2=t1*n &                           { i=2n, s=(n+1)^n, mult=t=n^n, s/mult=e }
Eg1 Eg2 g1+1=(i2+i2)*(i2+i2) & g1*u1+mult=g1*u2+g2 & g2<g1) &                   { u/mult=sum[j=4,8,...,4n]1/(j*j-1)=(4-pi)/8. mult=g1*(u2-u1)+g2 }
(t>1 | i2=n+n & t2=mult & Ediff Ediff2                                          { check at an end t=1 }
c1*s2+c2*mult+c3*u2+diff=c4*s2+c5*mult+diff2 & k*(diff+diff2)<mult))            { |diff-diff2|<=diff+diff2<mult/k, so ...<1/k }

a|b&ca|(b&c)vì tôi nghĩ việc loại bỏ các dấu ngoặc đơn này làm cho nó trông đẹp hơn, dù sao chúng cũng miễn phí.

Đã sử dụng JavaScript "(expr)".replace(/\{.*?\}/g,'').match(/[a-z0-9]+|[^a-z0-9\s\(\)]/g)để đếm mã thông báo.


Tại sao bạn có thể lấy mult = t? Ngoài ra, vì xchỉ có thể có nhiều chữ số chính xác, bạn sẽ cần cho phép e1 = e2 = 0đủ lớn t. Ngoài ra, bạn sẽ cần thêm dấu ngoặc đơn hoặc định hướng khác cho các cấu trúc mơ hồ như thế nào _ & _ | _.
Anders Kaseorg

@AndersKaseorg Tôi nhân mọi mục mult. Không thấy bất kỳ vấn đề nào mult=t2ở cuối. e1=e2=0nên được sửa nhưng không chắc chắn, vì vậy tôi hiện không thay đổi nhận thức.
l4m2

Nếu a & b | c(a & b) | cthì bạn t*1=tchắc chắn ở sai chỗ. Ngoài ra, bạn đã không loại trừ các giải pháp tầm thường c1 = c4 & c2 = c5 & c3 = 0 & diff = diff2.
Anders Kaseorg

@AndersKaseorg Lý do của tôi tại sao diff≠diff2làm việc?
l4m2

Dù sao tôi có thể sử dụng !(c2=c5)như chúng ta đã biết elà không hợp lý, vì vậy ngay cả khi điểm số công việc này không tăng
l4m2
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.