2011-12-11 32 views
12

Tôi đang nghiên cứu các vấn đề về đồ chơi để giúp tôi đồng hóa ý tưởng kết hợp mẫu trong Mathematica. Các mã sau đây không hành xử như tôi mong đợi, và tôi không thể tìm ra những gì là sai với sự hiểu biết của tôi về PatternTest.Một hành vi không mong muốn của PatternTest trong Mathematica

MatchQ[{2, 1, 2, 5}, {x__?(FromDigits[{#}] > 3 &), y__}] 

tôi mong đợi đoạn mã này để kiểm tra xem danh sách {2,1,2,5} có thể được viết như hai liên tiếp (không rỗng) trình tự như vậy mà số nguyên chúng tôi nhận được từ các chuỗi đầu tiên lớn hơn 3. Kể từ {Sequence[2,1],Sequence[2,5]} là một cách để viết lại danh sách như vậy mà giữ FromDigits[{2,1}] > 3, tôi mong đợi mã đó trả về giá trị True. Tuy nhiên, đó không phải là trường hợp.

Điều gì sai với cách diễn giải mã của tôi?

Trả lời

14

Các tài liệu cho PatternTest (aka ?) nói

Trong một hình thức như __?test mọi phần tử trong chuỗi kết hợp bởi __ phải nhường True khi thử nghiệm được áp dụng.

Vì vậy, mã của bạn sẽ không hoạt động như bạn mong đợi.

Cách hay để xem cách hoạt động của mô hình là sử dụng ReplaceList. Something gần mã của bạn là

In[1]:= ReplaceList[{3, 4, 2, 1}, 
      {___, x__?(FromDigits[{##}] > 3 &), y___} :> {{x}, {y}}] 

Out[1]= {{{4}, {2, 1}}} 

Tuy nhiên, nếu bạn sử dụng Condition (/;) thay vì thử nghiệm mô hình, sau đó bạn có thể nhận được các hành vi mà bạn đang tìm kiếm

In[2]:= ReplaceList[{3, 4, 2, 1}, 
      {___, x__, y___} :> {{x}, {y}} /; FromDigits[{x}] > 3] 

Out[2]= {{{3, 4}, {2, 1}}, {{3, 4, 2}, {1}}, {{3, 4, 2, 1}, {}}, 
     {{4}, {2, 1}}, {{4, 2}, {1}}, {{4, 2, 1}, {}}, {{2, 1}, {}}} 
+0

Đó là thật nhanh! +1 –

+0

@Leonid: Sức mạnh của sự trì hoãn không biết giới hạn! – Simon

+0

Tôi nghĩ rằng phản ứng đã được viết nhanh hơn tôi đặt cùng một bình luận, gần như cùng một lúc. –

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