Tôi đã viết a little app phân tích các biểu thức thành các cây cú pháp trừu tượng. Ngay bây giờ, tôi sử dụng một loạt các chẩn đoán đối với biểu thức để quyết định cách đánh giá tốt nhất truy vấn. Thật không may, có những ví dụ mà làm cho kế hoạch truy vấn vô cùng xấu.Tôi có thể tìm phương pháp nào để chuyển đổi một biểu thức boolean tùy ý thành dạng bình thường kết nghĩa hoặc không liên kết?
Tôi đã tìm ra cách để có thể đoán rõ hơn cách truy vấn nên được đánh giá, nhưng tôi cần đặt biểu thức của mình vào CNF hoặc DNF trước để nhận được câu trả lời đúng. Tôi biết điều này có thể dẫn đến thời gian và không gian có khả năng, nhưng đối với các truy vấn thông thường người dùng của tôi chạy điều này không phải là vấn đề.
Bây giờ, chuyển đổi sang CNF hoặc DNF là thứ mà tôi luôn làm bằng tay để đơn giản hóa các biểu thức phức tạp. (Vâng, có lẽ không phải mọi lúc, nhưng tôi biết cách thực hiện bằng cách sử dụng pháp luật của demorgan, luật phân phối, v.v.) Tuy nhiên, tôi không chắc chắn cách bắt đầu dịch thành một phương pháp có thể triển khai như một thuật toán . Tôi đã xem xét các bài báo về tối ưu hóa truy vấn, và một số bắt đầu với "đầu tiên chúng tôi đưa mọi thứ vào CNF" hoặc "đầu tiên chúng tôi đưa mọi thứ vào DNF", và họ dường như không giải thích phương pháp của họ để hoàn thành điều đó.
Tôi nên bắt đầu từ đâu?
Đủ để bắt đầu. Cảm ơn :) –
Bất kỳ con trỏ nào cho một cách "phân phối OR trên AND" khi có nhiều hơn một vài cụm từ (ví dụ: nhiều cấp độ AND và lồng nhau AND và nhiều biến)? – jamie
@Jamie: Bạn cần phải tạo một số nhân một cách đệ quy cho mỗi cặp. Nó không khác với FOILing :). Trong trường hợp xấu nhất, điều này mất thời gian theo cấp số nhân. (Chuyển đổi thành CNF hoặc DNF là trung tâm của bản gốc NP Hoàn thành vấn đề, thỏa đáng) –