【问题标题】:Prolog operator priorityProlog 运算符优先级
【发布时间】:2012-12-29 21:55:28
【问题描述】:

用户输入以a:b>c>d>e...等格式给出。我想将输入解析为 :(a,>(b,>(c,>(d,e))) 这可能吗?有什么建议吗?我用这个进行了测试

prepare:-
    op(750,xfx,user:(:)), % change the default priority of : and >
    op(700,xfx,user:(>)),
    display(a: b > c),%this one worked fine and 
                      %the display value is :(a,>(b,c))
    display(a: b > c > d ). % I cannot have this works, 
                            %the error ERROR: 
                            %Syntax error: 
                            %Operator priority clash is thrown.

无法修改输入。任何建议都值得赞赏。谢谢!

【问题讨论】:

    标签: prolog operators iso-prolog


    【解决方案1】:

    也许首先:(:)/2(>)/2 已经是标准中定义的中缀运算符,如下所示:

    :- op(600, xfy, :). % ISO/IEC 13211-2 5.2.1, table 1
    :- op(700, xfx, >). % ISO/IEC 13211-1 6.3.4.4, table 7
    

    改变它们的优先级意味着你改变了它们的共同含义。这通常不是一个好主意。想一想:这就像您将(能够)更改 Java、C#、C++、Perl 或 PHP 中运算符的优先级。他们都不敢改变从C那里继承的优先级。

    但是,严格来说,你可以做到这一点。

    为尽量减少此类更改的不利影响,请尝试将声明保留在您自己的模块中。而且,在没有模块本地运算符的系统中,请确保您将安全地恢复到原始声明。

    您写了user:(>),它影响了特殊的用户模块。相反,编写您自己的模块。

    ...或者可能重新考虑要更改的运算符。

    一举将条款阅读到下一个时期。因此,如果您有如您所展示的规则,则运算符声明仅在执行prepare 时才会生效。因此,它对目标display/1 的参数没有影响。您可能已经加载、执行了 prepare 并 ;并重新加载它。

    要使操作符声明生效,要么直接在顶层执行它(这是一个快速的技巧);或将其作为指令写入文件或模块。

    然后是>-like 运算符,我将使用:> 代替它,需要像: 一样右关联,并且优先级低于:。您声明了xfx,这意味着没有关联性。

    ?- op(500,xfy,:>).
    true.
    
    ?- write_canonical(a:b:>c:>d).
    :(a,:>(b,:>(c,d)))
    true.
    

    【讨论】:

    • 非常感谢,把它改成 xfy 就可以了:)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 2011-06-21
    • 2013-02-24
    相关资源
    最近更新 更多