12 điểm bởi ohyecloudy 2023-12-17 | 3 bình luận | Chia sẻ qua WhatsApp
  • Giá trị trả về của hàm Enum.all? với danh sách rỗng là true
    • Các hàm all của Haskell, all của Python, và every? của Clojure cũng hoạt động giống hệt
  • Việc trả về true cho danh sách rỗng giúp triển khai dễ hơn
    • true && f(elem1) && f(elem2) ...
    • Nhưng không phải vì sự tiện lợi trong triển khai mà nó được làm như vậy
    • Mà là vì nó được triển khai sao cho phù hợp với định nghĩa chân lý hiển nhiên do rỗng (vacuous truth) trong logic học
  • Để hiểu vacuous truth, cần xem qua mệnh đề kéo theo vật chất
    • Nếu p là sai thì p → q luôn đúng
    • “Nếu Tượng Nữ thần Tự do ở Seoul thì Tháp Eiffel ở Pohang” là một mệnh đề đúng
      • Vì p, tức “Tượng Nữ thần Tự do ở Seoul”, là sai
    • Trong kiểu mệnh đề kéo theo này, khi p sai nên toàn bộ mệnh đề mặc nhiên đúng, đó được gọi là vacuous truth
  • Trong vacuous truth, với tập hợp rỗng thì bất kỳ mệnh đề nào cũng trở thành đúng
    • Lấy ví dụ “mọi chiếc điện thoại trong phòng đều đang tắt”
    • x là mọi vật trong phòng
    • P(x) là “x là điện thoại”
    • Q(x) là “x đang tắt”
    • Vì x là rỗng nên P(x) là sai. Theo vacuous truth, mệnh đề này luôn đúng.
  • Vì vậy, giá trị trả về của hàm Enum.all? với danh sách rỗng là true.

3 bình luận

 
tapu1125 2023-12-18

Mình học được thêm rồi hehe, cảm ơn bạn đã chia sẻ.
Về mặt toán học và khoa học máy tính thì là như vậy, nhưng khi code vẫn dễ bị rối nên có vẻ không nên áp dụng nhiều đâu haha.
Đặc biệt là trong câu lệnh if, danh sách rỗng được nhận diện là False nên rất dễ gây nhầm lẫn.

Theo Python thì như bên dưới.
all([]) == True
all([[]]) == False

 
p0rygon 2023-12-18

Vì vậy, tôi thiên về cách viết điều kiện một cách tường minh để người đọc code dễ hiểu hơn.
Ví dụ như dùng if len(arr) == 0: thay vì if not arr:.
Hoặc dùng if flag is False: thay cho if not flag:.

Theo tiêu chí của tôi, all([[]]) thì nên được viết lại thành all([biểu_thức_điều_kiện for ... in []]) để code dễ đọc hơn.

 
ohyecloudy 2023-12-18

À~ trong Python, danh sách rỗng là falsy value nên all([[]]) trả về False nhỉ. Vì truthyfalsy value khác nhau giữa các ngôn ngữ, nên khi dùng ngôn ngữ khác thỉnh thoảng mình lại mắc lỗi. :)

Tham khảo thêm thì Elixir chỉ coi nil hoặc falseFalsy values, nên Enum.all?([[]]) sẽ cho ra true.