在Prolog中将字符串转换为列表

在Prolog中将字符串转换为列表,prolog,Prolog,我是一个Prolog新手,一直在解析列表中的字符串。我有一个字符串的形式。我想把多项式读成字符串,然后把它转换成字符串。 我想转换输入字符串 2x^3 + x^2 - 4x^1 - 8 到 如何实现此功能 此问题可通过两个步骤轻松解决: 词法分析/标记器:将字符串转换为表示表达式中每个可能元素的标记列表:数字、变量名和运算符。例如,这些表示可以是术语number(V)、vname(N)和op(op);您可能希望对分隔单项式的加法运算符和指数运算符使用不同的术语 语法分析/解析器:将语法规则

我是一个Prolog新手,一直在解析列表中的字符串。我有一个字符串的形式。我想把多项式读成字符串,然后把它转换成字符串。 我想转换输入字符串

2x^3 + x^2 - 4x^1 - 8 


如何实现此功能

此问题可通过两个步骤轻松解决:

  • 词法分析/标记器:将字符串转换为表示表达式中每个可能元素的标记列表:数字、变量名和运算符。例如,这些表示可以是术语
    number(V)
    vname(N)
    op(op)
    ;您可能希望对分隔单项式的加法运算符和指数运算符使用不同的术语
  • 语法分析/解析器:将语法规则应用于标记列表,以识别单项式并将其转换为所需的表示形式。在这种情况下,每个规则可以有一个子句的形式,该子句检查标记列表开头出现的内容,以查找单项式并将其转换
  • 示例规则可以是

    monom([number(N),vname(X),op(exp),number(E)|Ts],[[N,E]|Ms]) :-
      !, monom(Ts,Ms).
     monom([number(N),vname(X),op(+)|Ts],[[N,1]|Ms]) :-
      !, monom([op(+)|Ts],Ms).
    

    请注意,这些规则不会检查变量是否始终具有相同的名称。另一个问题是使用单项式的减号。但我希望你能处理好这件事

    不,只有一个变量在一个由defaultno命名的多项式上。用户可以根据需要输入总和。请重复,我仍在等待您的解决方案为什么是字符串?您的初始输入看起来非常像Prolog文本。你只需要在结尾加一个点。谢谢,但我真的不知道该怎么办。你能帮我一个和平的代码吗?我想你指的是第一步。字符串是字符列表,空格是分隔符,否则将被忽略,数字(无符号整数)是数字序列,名称是单个字母,运算符是
    +
    -
    或“^”中的一个。如果您设法为每个数字、名称或运算符构建一个字符列表,那么您可以使用
    name/2
    (查看手册)获取相应的原子项,然后构建一个术语,如我的答案所示,并将其作为参数。这很简单:你将从自己编写中学习。请帮助:(我不理解第一步:编写谓词
    tokens(Cs,Ts)
    从字符列表
    Cs
    构建令牌列表
    Ts
    ,如上所述。您需要知道如何递归访问列表,以及如何将字符串转换为名称为该字符串的术语(阅读Prolog系统的文档以了解更多信息;尝试使用
    atom_chars/2
    name/2
    预定义谓词)。如果每个数字、名称和运算符都作为单个字符写入,则每个字符对应一个令牌。您可以从本例开始。
    monom([number(N),vname(X),op(exp),number(E)|Ts],[[N,E]|Ms]) :-
      !, monom(Ts,Ms).
     monom([number(N),vname(X),op(+)|Ts],[[N,1]|Ms]) :-
      !, monom([op(+)|Ts],Ms).