2011-01-28 23 views

Trả lời

12

Mathematica có cơ chế có thể xác định được tính tổng quát tương đối của các quy tắc trong các trường hợp đơn giản, ví dụ nó hiểu rằng ___ (BlankNullSequence) tổng quát hơn __ (BlankSequence). Vì vậy, khi nó có thể, nó sắp xếp lại các định nghĩa toàn cục theo nó. Điều quan trọng là nhận ra rằng mặc dù phân tích như vậy nhất thiết phải là cú pháp. Do đó, trong khi PatternTest (?)Condition (/;) với một số biến vị ngữ đơn giản như đôi khi có thể được phân tích, sử dụng chúng với biến vị ngữ do người dùng xác định sẽ nhất thiết làm cho việc sắp xếp lại không thể liên quan đến các quy tắc được xác định tương tự, để Mathematica giữ nguyên các quy tắc đó theo thứ tự họ đã được nhập. Điều này là do, PatternTestCondition buộc trình so khớp mẫu gọi cho người đánh giá để xác định thực tế của trận đấu và điều này khiến không thể trả lời câu hỏi về tính tổng quát tương đối của các quy tắc ở định nghĩa - thời gian. Ngay cả đối với các quy tắc hoàn toàn cú pháp, không phải lúc nào cũng có thể xác định được tính tổng quát tương đối của chúng. Vì vậy, khi điều này không thể được thực hiện, hoặc Mathematica không thể làm điều đó, nó giữ các quy tắc theo thứ tự chúng được nhập vào.

Tất cả điều này là về các quy tắc toàn cầu, được tạo bởi Set hoặc SetDelayed hoặc các toán tử gán khác. Đối với các quy tắc địa phương, như trong ví dụ của bạn, không có sắp xếp lại bất kỳ thứ gì, chúng được áp dụng theo thứ tự chúng có trong danh sách các quy tắc. Tất cả các quy tắc trong danh sách các quy tắc vượt quá quy tắc đầu tiên áp dụng cho biểu thức (phụ), được bỏ qua cho biểu thức con đó và quy trình ứng dụng quy tắc cụ thể - biểu thức (phụ) được viết lại theo quy tắc khớp đầu tiên, và sau đó quy trình ứng dụng quy tắc tiếp tục với các biểu thức phụ khác. Ngay cả khi biểu mẫu mới của biểu thức viết lại (phụ) khớp với một số quy tắc hơn nữa trong danh sách quy tắc, chúng không được áp dụng trong quy trình áp dụng quy tắc này. Nói cách khác, đối với một quy trình ứng dụng quy tắc duy nhất, cho bất kỳ biểu thức (phụ) cụ thể nào, không quy tắc hoặc chỉ áp dụng một quy tắc. Nhưng ở đây cũng có một vài sự tinh tế. Ví dụ: ReplaceAll (/.) áp dụng quy tắc từ biểu thức lớn hơn cho biểu thức con, trong khi Replace với đặc tả mức rõ ràng thực hiện theo cách ngược lại. Điều này có thể quan trọng trong những trường hợp như thế này:

In[1]:= h[f[x, y]] /. {h[x_f] :> a, f[args__] :> b} 

Out[0]= a 

In[2]:= Replace[h[f[x, y]], {h[x_f] :> a, f[args__] :> b}, {0, Infinity}] 

Out[2]= h[b] 

tôi đã đề cập quy tắc sắp xếp lại ở một vài nơi trong cuốn sách của tôi: here, here, và here. Trong trường hợp hiếm hoi khi Mathematica sắp xếp lại các quy tắc theo cách không thỏa đáng, bạn có thể thay đổi thứ tự thủ công bằng các thao tác trực tiếp với DownValues (hoặc các giá trị khác ...), ví dụ như DownValues[f] = Reverse[DownValues[f]]. Những trường hợp như vậy xảy ra đôi khi, nhưng thay vì hiếm khi xảy ra, và nếu chúng xảy ra, hãy đảm bảo có một lý do chính đáng để giữ thiết kế hiện có và tiến hành sắp xếp lại quy tắc thủ công.

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