【问题标题】:An unexpected behavior of PatternTest in MathematicaMathematica 中 PatternTest 的意外行为
【发布时间】:2011-12-11 22:37:48
【问题描述】:

我正在研究玩具问题,以帮助我吸收 Mathematica 中模式匹配的概念。以下代码的行为与我预期的不同,我无法弄清楚我对 PatternTest 的理解有什么问题。

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

我希望这段代码检查列表{2,1,2,5} 是否可以写成两个连续(非空)序列,这样我们从第一个序列中得到的整数大于 3。因为{Sequence[2,1],Sequence[2,5]} 是一个重写列表以使FromDigits[{2,1}] > 3 成立的方法,我希望该代码返回值True。然而,事实并非如此。

我对代码的解释有什么问题?

【问题讨论】:

    标签: wolfram-mathematica


    【解决方案1】:

    PatternTest(又名?)的文档说

    __?test 之类的形式,序列中与__ 匹配的每个元素 应用测试时必须产生True

    因此,您的代码不会像您希望的那样工作。

    查看模式如何工作的一个好方法是使用ReplaceList。 接近你的代码的东西是

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

    但是,如果您使用 Condition (/;) 而不是模式测试,那么您可以获得您正在寻找的行为

    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}, {}}}
    

    【讨论】:

    • @Leonid:拖延的力量是无限的!
    • 我认为回复的速度比我写评论的速度要快,大致同时。
    • @Simon 非常感谢!我从您的回复中得到了很多提示:## 代替 #,ReplaceList 来测试模式,以及 / 之间的区别;和 __?test.
    • +1:希望这个评论没问题,但是你们回答 MMA 问题的速度太快了!当我注意到有人在标签下提出问题时,我知道一个很好的答案的几个问题已经回答了:(。(这有好有坏,我很难参与其中所以,对所有提问者都有好处!)
    • @nixeagle:你不是第一个抱怨这个的人!较难的问题或具有多种方法的问题更容易获得一个词。对于较简单的问题,您必须幸运并在发布问题时检查网站(这是我的方法,因为 rss 提要也是慢的)。其他人拿more extreme measures.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 2020-03-01
    • 2018-01-07
    • 1970-01-01
    • 2010-10-03
    • 2015-06-01
    • 1970-01-01
    相关资源
    最近更新 更多