【问题标题】:Prolog - How can obtain the prefix form of a math calculation given its usual form?Prolog - 给定通常的形式,如何获得数学计算的前缀形式?
【发布时间】:2016-11-10 13:53:55
【问题描述】:

我是 prolog 的新手,我想编写一个计算器。为此,我需要编写一个谓词来处理给定的算术表达式,以通常的形式(中缀形式)编写,以便获得其前缀形式。 表达式的元素将被分组到具有 3 个元素的子列表中,其形式如下 [operator, term1, term2],因此这些术语可以在它们的轮流列表中。 应该定义一个称为 parse 的谓词并像下面的例子一样工作:

?-parse([1,+,2,*,3],PF).
PF=[+,1,[*,2,3]] 

【问题讨论】:

    标签: prolog expression dcg


    【解决方案1】:

    您可以使用atom_to_term/3=../2 来获得算术表达式的前缀形式。 atomic_list_concat/2 将从您的输入列表中创建一个原子,然后atom_to_term 将构建一个术语(这将是您的算术表达式的中缀表示)。然后,使用univ(=..),就可以递归地得到前缀符号。

    即:

    parse(LExp, PF):-
      atomic_list_concat(LExp, Exp),
      atom_to_term(Exp, Term, _),
      parse1(Term, PF).
    
    parse1(Term, PF):-
      Term =.. [PF].
    parse1(Term, [Op, Left, Right]):-
      Term =.. [Op, TLeft, TRight],
      parse1(TLeft, Left),
      parse1(TRight, Right).
    

    测试用例:

    ?- parse([1,+,2,*,3],PF).
    PF = [+, 1, [*, 2, 3]]
    

    【讨论】:

    • 太棒了。我对此只有一个问题:它如何知道算术运算的正确优先级(例如,如果您有 x 或 / 它应该首先将它们分组,然后是 + -)?
    • 另外,你能解释一下表达式 =.. 的作用吗?
    • @DiogoBoto:它使用 prolog 中定义的运算符。基本上它用表达式构建一个术语,Prolog 知道运算符的优先级。然后 parse1 只是为该表达式构建一个前缀树。检查答案中提供的链接以获取有关 univ (=..) 谓词的信息。
    猜你喜欢
    • 2014-04-30
    • 1970-01-01
    • 2016-04-20
    • 2018-05-19
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    相关资源
    最近更新 更多