6

Tôi gặp một biểu thức, giả sử,Giảm một biểu thức boolean

a = 1 && (b = 1 || b != 0) && (c >= 35 || d != 5) && (c >= 38 || d = 6) 

Tôi hy vọng nó sẽ được giảm xuống,

a = 1 && b != 0 && (c >= 38 || d = 6) 

Có ai có bất cứ đề nghị? Con trỏ đến bất kỳ thuật toán nào?

Nota Bene: Karnaugh Map hoặc Quine-McCluskey không phải là một lựa chọn ở đây, tôi tin tưởng. Vì những phương pháp này không xử lý các trường hợp màu xám. Ý tôi là, biểu hiện chỉ có thể được giảm đi như xa như mọi thứ như, A hoặc A 'hoặc không có gì, hoặc nói đen hoặc trắng hoặc absense-of-màu. Nhưng ở đây tôi có màu xám, như các bạn có thể thấy.

Giải pháp: Tôi đã viết chương trình này ở Clojure. Tôi đã sử dụng bản đồ của bản đồ chứa hàm làm giá trị. Điều đó khá tiện dụng, chỉ là một vài quy tắc cho một vài kết hợp và bạn tốt. Cảm ơn câu trả lời hữu ích của bạn.

+0

Có giới hạn cho việc giảm bao nhiêu có thể được thực hiện trong thời gian đa thức. Ví dụ: nếu bạn luôn có thể giảm bất kỳ biểu thức biểu mẫu bình thường liên kết nào thành dạng đơn giản nhất của nó, bạn sẽ giải quyết được vấn đề 3SAT mở. – mbeckish

+0

@mbeckish: Điều đó nghe có vẻ đáng sợ với tôi. Trên thực tế, tôi không biết về những điều này cho đến khi bạn folks hướng tôi đi đúng hướng. Tôi đã suy nghĩ không chỉ 3SAT, mà còn là vấn đề nSAT. Bây giờ, tất cả đều không thể. –

+0

Đừng ngại giải quyết các vấn đề NP-hard. Đối với hầu hết trong số họ, phần cứng sẽ nằm trong một khu vực tương đối nhỏ của không gian vấn đề, trong giai đoạn chuyển tiếp giữa các vấn đề dễ xảy ra và dễ xảy ra. Nếu giải quyết vấn đề NP-hard luôn luôn là không thể, tôi sẽ không thể làm được. Nó phụ thuộc nhiều vào cách bạn mong đợi thuật toán của bạn để mở rộng quy mô. – twinterer

Trả lời

2

Tôi nghĩ bạn sẽ có thể đạt được những gì bạn muốn bằng cách sử dụng Constraint Handling Rules. Bạn sẽ cần phải viết các quy tắc đơn giản hóa các biểu thức OR và AND.

Khó khăn chính là kiểm tra sự ràng buộc ràng buộc cho bạn biết bạn có thể bỏ phần nào. Ví dụ: (c> = 35 || d! = 5) & & (c> = 38 || d = 6) đơn giản hóa thành (c> = 38 || d = 6) bởi vì trước đây bị kéo theo sau, tức là , cái sau cụ thể hơn. Đối với các biểu thức OR, bạn sẽ cần chọn phần tổng quát hơn.

Google đã tìm thấy paper on an extension of CHR with entailment check for user-defined constraints. Tôi không biết đủ CHR để có thể cho bạn biết liệu bạn có cần một phần mở rộng như vậy không.

+0

Cảm ơn, twinterer, tôi đang đọc về điều này. –

+0

Sau khi đọc một thời gian ngắn về lập trình Constraint, sau đó Constraint Logic Programming (mgibsonbr chỉ ra trong bài khác), sau đó Constraint Satisfaction Problems, sau đó Constraint Handling Rules, và sau đó Constraint Optimization, tôi tin rằng vấn đề của tôi nằm trong Constraint Optimization, và tôi cũng tin rằng mọi thuật toán backtracking sẽ hữu ích. Tôi đặc biệt nhìn vào B & B, và loại bỏ xô, nơi mà sau này không phải là một bản ngã backtracking. Tôi có đi đúng hướng không? –

+0

@AdeelAnsari: Có, bạn có thể xem đó là một loại vấn đề tối ưu hóa nếu bạn lấy số mệnh đề làm thước đo và bạn muốn tìm đại diện ngắn nhất. Thông thường, B & B là một lựa chọn tốt khi giải quyết các vấn đề COP, nhưng sẽ chỉ giúp nếu bạn có thể tính toán một số giới hạn thấp hơn cho số mệnh đề trong kết quả cuối cùng, nếu không thì đó là tìm kiếm hoàn chỉnh. Backtracking sẽ được bao gồm khi sử dụng CLP. CHR được dự định là "cam kết lựa chọn", tức là w/o backtracking, nhưng triển khai CHR trên CLP thực sự có backtracking (ví dụ: trong ECLiPSe). Cho dù loại bỏ xô giúp, tôi không biết. – twinterer

1

Tôi tin rằng những điều này được thực hiện thường xuyên trong constraint logic programming. Đáng tiếc là tôi không đủ kinh nghiệm để cung cấp chi tiết chính xác hơn, nhưng đó phải là điểm khởi đầu tốt.

Nguyên tắc chung rất đơn giản: biến không liên kết có thể có bất kỳ giá trị nào; khi bạn kiểm tra nó so với sự bất bình đẳng, tập hợp các giá trị có thể bị hạn chế bởi một hoặc nhiều khoảng thời gian. Khi/nếu những khoảng thời gian đó hội tụ với một điểm duy nhất, biến đó sẽ bị ràng buộc với giá trị đó. Nếu, OTOH, bất kỳ sự bất bình đẳng nào được coi là không thể giải quyết được cho mọi giá trị trong khoảng thời gian, lỗi logic [lập trình] xảy ra.

Xem thêm this, để biết ví dụ về cách thực hiện điều này trong thực tế sử dụng swi-prolog. Hy vọng rằng bạn sẽ tìm thấy các liên kết hoặc tham chiếu đến các thuật toán cơ bản, vì vậy bạn có thể tái tạo chúng trong nền tảng lựa chọn của bạn (thậm chí có thể tìm các thư viện sẵn sàng).

Cập nhật: Tôi đã cố tạo lại ví dụ của bạn bằng swi-prolog và clpfd, nhưng không nhận được kết quả mà tôi mong đợi, chỉ những kết quả gần đúng. Dưới đây là mã của tôi:

?- [library(clpfd)]. 
simplify(A,B,C,D) :- 
    A #= 1 , 
    (B #= 1 ; B #\= 0) , 
    (C#>= 35 ; D #\= 5) , 
    (C#>= 38 ; D #= 6). 

Và kết quả của tôi, trên backtracking (ngắt dòng chèn vào cho dễ đọc):

10 ?- simplify(A,B,C,D). 

A = 1, 
B = 1, 
C in 38..sup ; 

A = 1, 
B = 1, 
D = 6, 
C in 35..sup ; 

A = 1, 
B = 1, 
C in 38..sup, 
D in inf..4\/6..sup ; 

A = 1, 
B = 1, 
D = 6 ; 

A = 1, 
B in inf.. -1\/1..sup, 
C in 38..sup ; 

A = 1, 
D = 6, 
B in inf.. -1\/1..sup, 
C in 35..sup ; 

A = 1, 
B in inf.. -1\/1..sup, 
C in 38..sup, 
D in inf..4\/6..sup ; 

A = 1, 
D = 6, 
B in inf.. -1\/1..sup. 

11 ?- 

Vì vậy, chương trình mang lại 8 kết quả, trong số những người 2 bạn đã quan tâm trên (5th và thứ 8):

A = 1, 
B in inf.. -1\/1..sup, 
C in 38..sup ; 

A = 1, 
D = 6, 
B in inf.. -1\/1..sup. 

Các khác là không cần thiết, và có thể có thể được loại bỏ sử dụng đơn giản, các quy tắc logic automatable:

1st or 5th ==> 5th   [B == 1 or B != 0 --> B != 0] 
2nd or 4th ==> 4th   [C >= 35 or True --> True ] 
3rd or 1st ==> 1st ==> 5th [D != 5 or True --> True ] 
4th or 8th ==> 8th   [B == 1 or B != 0 --> B != 0] 
6th or 8th ==> 8th   [C >= 35 or True --> True ] 
7th or 3rd ==> 3rd ==> 5th [B == 1 or B != 0 --> B != 0] 

Tôi biết đó là một chặng đường dài phía sau là một giải pháp chung, nhưng như tôi đã nói, hy vọng đó là một sự khởi đầu ...

T.B. Tôi đã sử dụng "thông thường" VÀ và HOẶC (,;) vì những thứ của clpfd (#/\#\/) đã cho kết quả rất lạ mà tôi không thể hiểu bản thân ... có thể ai đó có kinh nghiệm hơn có thể truyền một số ánh sáng lên đó ...

+0

Cảm ơn, bạn thân. Nó rất đẹp với bạn. Tôi đang nhìn vào nó, và cố gắng tiêu hóa. –

Các vấn đề liên quan