2011-01-21 8 views
10

tôi đã gặp phải một số mã obj-c và tôi tự hỏi nếu có một cách để đơn giản hóa nó:Logic: là (A &&! (B | | C)) || (B || C) giống như (A | | B | | C)?

#if (A && !(B || C)) || (B || C) 

là này giống như?

#if (A || B || C) 

Nếu không, có cách nào khác để xây dựng nó dễ đọc hơn không?

[edit] Tôi đã thử bảng chân lý trước khi đặt câu hỏi, nhưng nghĩ rằng tôi đã bỏ lỡ một điều gì đó vì tôi nghi ngờ rằng Foundation.framework/Foundation.h sẽ sử dụng hình thức phức tạp hơn này. Có lý do chính đáng cho nó không?

Dưới đây là mã gốc (từ Foundation.h):

#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE)) || (TARGET_OS_EMBEDDED || TARGET_OS_IPHONE) 
+0

tại sao không chỉ thực hiện một bảng chân lý nhỏ với kết quả và tự mình thử nghiệm? Chỉ có 8 đầu vào khác nhau | A = true, B = true, C = true | A = true, B = true. C = sai | Vân vân và vân vân. So sánh các bảng chân lý. Nếu các kết quả đầu ra giống nhau, thì logic của bạn là tương đương. – AndyPerfect

+3

Dấu ngoặc đơn của bạn trong tiêu đề của câu hỏi hơi khác so với câu hỏi. Nếu tiêu đề là chính xác, thì phần "! (B | | C) || (B || C)" có thể được thay thế bằng "true", để lại cho bạn "A && true", tương đương với chỉ A. Mặt khác, phiên bản câu hỏi có vẻ thiếu một cặp dấu ngoặc đơn, nếu không bạn có lỗi cú pháp. Ngoài ra, tôi đồng ý với các áp phích khác, tạo ra các bảng sự thật. – cobaltduck

+0

@Peter Perháč - cảm ơn bạn đã chỉnh sửa! – jpwco

Trả lời

12

Có. Giống như những người khác nói, bạn có thể bảng chân lý nó. Các quy tắc De Morgan cũng có thể hữu ích.

Tuy nhiên, tôi nghĩ tùy chọn tốt nhất là sử dụng Karnaugh Map. Chỉ mất vài phút để tìm hiểu, nhưng Karnaugh Maps cho phép bạn luôn tìm thấy biểu thức tối thiểu nhất cho logic logic. Các bảng chân lý có thể xác minh sự giảm thiểu, nhưng chúng không thể cung cấp cho bạn.

Đây là cách tôi đã nhận nó:

Thứ nhất, bố trí bảng:

  AB 
    00 01 11 10 
    0| | | | | 
C 1| | | | | 

Bây giờ, xem xét phương trình của bạn, B || C sẽ luôn gây ra sự thật:

  AB 
    00 01 11 10 
    0| | T | T | | 
C 1| T | T | T | T | 

Chỉ để lại hai trường hợp. Trong cả hai trường hợp, bên phải đánh giá sai. Đối với 000, phía bên trái cũng đánh giá là false (0 & &! (Bất kể) là sai). Đối với 100, 1 & &! (0 ||| 0) đánh giá là đúng. Vì vậy, tuyên bố là đúng sự thật. Điền vào:

  AB 
    00 01 11 10 
    0| F | T | T | T | 
C 1| T | T | T | T | 

Bây giờ, chúng tôi chỉ cần "bao quát" tất cả các sự thật. "C" sẽ bao gồm hàng dưới cùng. "B" sẽ bao gồm hình vuông ở giữa (trong bốn giá trị). Vì vậy, "B | | C" bao gồm tất cả trừ hình vuông bên phải trên cùng. Bây giờ, "A" sẽ bao gồm hình vuông bốn dấu cách bên phải.Đó là OK rằng điều này là thừa. Do đó, "A | | B | | C" bao gồm tất cả các ô vuông thực sự và bỏ qua các ô vuông duy nhất.

+0

đây là một câu trả lời tuyệt vời. 1 cho "Bản đồ Karnaugh". – jpwco

+1

Đây là câu trả lời hay hơn câu hỏi xứng đáng và giáo dục để khởi động. – jpwco

7

Nhận bút + giấy + thử nó, chỉ có 8 đầu vào có thể

+0

Đương nhiên tôi đã thử điều đó trước tiên. Tôi có uy tín mã nguồn được trên công thức này dường như mơ hồ: OSX's Foundation.h. Do đó tôi nghi ngờ scribblings của tôi. Nhưng có, +1 cho bản năng tuyệt vời đầu tiên của bạn. – jpwco

+0

Tôi là một nhà vật lý thực nghiệm - được lựa chọn làm toán hoặc thực hiện các phép đo Tôi đi cho giải pháp câm –

+2

Tôi cũng vậy, nhưng cái nào là câm và cái nào không phụ thuộc vào thử nghiệm. ;) – John

2

Có nó là như nhau. Sử dụng quy tắc De Morgan:

(A & &! (B || C)) || (B || C) = (A & &! B & &! C) || (B | | C). Vì vậy, điều thứ hai sẽ đúng khi A = 1 và B, C = 0. Nếu đó không phải là trường hợp phần thứ hai (B || C) sẽ đúng khi B || C. Vì vậy, nó là bằng đầu tiên.

0

Có, hai biểu thức tương đương nhau. (Tôi vừa viết một vài chức năng để kiểm tra tất cả tám khả năng.)

7
A | B | C | (B || C) | (!(B || C)) | (A && !(B || C)) | (A && (!(B || C)) || (B || C) | (A || B || C) 
------------------------------------------------------------------------------------------------------ 
T | T | T |  T |  F  |   F  |     T    |   T  
T | T | F |  T |  F  |   F  |     T    |   T 
T | F | T |  T |  F  |   F  |     T    |   T 
T | F | F |  F |  T  |   T  |     T    |   T 
F | T | T |  T |  F  |   F  |     T    |   T 
F | T | F |  T |  F  |   F  |     T    |   T 
F | F | T |  T |  F  |   F  |     T    |   T 
F | F | F |  F |  T  |   F  |     F    |   F 

Dựa trên hai cột cuối cùng, tôi sẽ nói có.

+0

Đã xảy ra sự cố với bảng này. Vui lòng kiểm tra lại. – detunized

+0

@detunized, vâng tôi & & # 39; & # 39; thay đổi hai cuối cùng thay vì || 'ed. Chúng bằng nhau – SwDevMan81

7

Chúng giống nhau. Bạn có thể sử dụng Truth Table Generator để kiểm tra. Cả hai biểu thức này chỉ cung cấp false trong một trường hợp, khi A, BCfalse.

+1

đó là một liên kết thông minh. Tôi sẽ chia sẻ nó với bạn bè toán-giáo viên của tôi. +1 – jpwco

1

Bạn cũng có thể nói:

(! Một & & (B || C)) || (B || C) viết lại thành (A & &! W) || W (1)

(1) ghi lại thành (A & &! W) || (A ||! A || W) (2)

(2) viết lại (A & &! W) || (A || W) || (! A || W) (3)

(3) ghi đè (A & &! W) || ! (A & &! W) || (A || W) (4)

(4) dẫn đến A || W và sau đó A || B || C

+0

Bạn cũng có thể nói 'A^(B | | C) 'không? – Jay