Các điều kiện rõ ràng hơn bằng cách sử dụng định luật De Morgan (Ruby on Rails)

Demorgon's Law 1

Giới thiệu:

Luận đề De Morgan, hay còn gọi là định lý De Morgan, được phát biểu và chứng minh bởi nhà toán học và lô gíc học người Anh sinh trưởng tại Ấn Độ tên là Augustus De Morgan (1806-1871). Nguyên thủy, định lý này được chứng minh trong lý thuyết tập họp.

Định lý này được phát biểu và dùng lại trong lô gíc và đại số Bool như sau:

        overline{A.B} = overline{A} + overline{B}
        overline{A+B} = overline{A} . overline{B}

Từ hai mệnh đề trên cùng với bảng chân trị của phép hội (A.B) và phép nghịch đảo (overline{A}) người ta có thể chứng minh rằng mọi mệnh đề lô gíc đều có thể được biểu diễn bằng một mệnh đề mà chỉ bao gồm hai phép toán hội và phép nghịch đảo.

Tham khảo: http://vi.wikipedia.org/wiki/Lu%E1%BA%ADt_De_Morgan

Sau đây ta sẽ ứng dụng định luật De Morgan vào trong lệnh Ruby on Rails để viết rõ ràng câu lệnh điều kiện.

1. Ta có đoạn lệnh sau :

def allow_access_to_site?

!(signed_out? && untrusted_ip?)

end

 

Với đoạn lệnh trên nếu không chú ý, người lập trình có thể định nghĩa sai các phép toán.

2. Trở về với De–Morgan

De–Morgan đã xây dựng hai nguyên tắc quan trọng của suy luận logic, chúng ta áp dụng trong code ruby như sau:

# One

!(a && b) == !a || !b

# Two

!(a || b) == !a && !b

Với điều kiện ở mục 1 áp dụng vào định luật 2 của De–Morgan

# Gốc

!(signed_out? && untrusted_ip?)

#Chuyển đổi sử dụng định luật thứ 2

# A = signed_out?

# B = untrusted_ip?

(! signed_out?) || (! untrusted_ip?)

 

Với đoạn code trên mục đích của ta muốn nói rằng muốn định nghĩa rõ điều kiện kiểm tra signed_in và trusted_ip

Ta chuyển đổi đơn giản hóa hơn nữa

# Đơn giản hóa A:

(! signed_out ? ) == signed_in?

( signed_in ? ) || ( !?untrusted_ip )

# Đơn giản hóa B :

(! untrusted_ip?) == trusted_ip?

( signed_in ? ) || ( ? trusted_ip )

# Hủy bỏ dấu ngoặc đơn

signed_in ? || trusted_ip ?

Điều tôi muốn nói cuối cùng là với các mệnh đề điều kiện thì hãy viết rõ ràng

Before:

def allow_access_to_site?

! (signed_out? && untrusted_ip?)

end

After:

def allow_access_to_site?

signed_in? || trusted_ip?

end

Ref: Clearer Conditionals using De Morgan’s Laws

Add a Comment

Scroll Up