2012-12-29 151 views
3

用户输入的格式为a:b> c> d> e ...等等。我想解析输入:(a,>(b,>(c,>(d,e)))是否可能,并有任何建议可以这样做?我用此测试Prolog运算符优先级

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. 

输入不能修改任何建议是感激感谢

回答

3

也许第一和foremostly:!无论(:)/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;并重新加载它。

要使操作符声明有效,可以直接在顶层执行(这是一个快速入侵);或者将其作为指令写入文件或模块中。

然后>式的操作,我会用它:>它的地方,必须是右关联像:及以下:优先。你宣称xfx这意味着没有关联性。

?- op(500,xfy,:>). 
true. 

?- write_canonical(a:b:>c:>d). 
:(a,:>(b,:>(c,d))) 
true. 
+1

非常感谢你,把它改成xfy,它工作正常:)。 – temp