【问题标题】:String to List Interpreter in List Prolog stuck on 2 itemsList Prolog 中的 String to List Interpreter 卡在 2 个项目上
【发布时间】:2021-05-01 05:09:28
【问题描述】:

我编写了一种名为 List Prolog 的编程语言(其中谓词以 [n,predicate_name] 开头,变量是 [v,variable_name]),但在获取一些代码时遇到了麻烦(一种具有明确子句语法的算法,它接受一个字符串并转换它到 Prolog 术语或列表列表等)来处理带有 n 的查询,而不仅仅是每个列表(在字符串中)的 2 个项目。

顺便说一句,List Prolog 与 Prolog 不同,因为它包含需要用户编写自己的基本案例的语法,类似于用 C 编写的解释器,即

          [[n,compound213],["","",[v,t],[v,t]]],

          [[n,compound213],[[v,u],[v,u],[v,t],[v,t]]],

在查询中,[[n,grammar1],["[[\"aa\",b],1]",[v,t]]] 有效,即只有 2 个项目,即 [\"aa\",b],可以转换为字符串的一部分,但不能比这更大的数字,即 [\"aa\",b,\"c\",[]],所以 [[n,grammar1],["[[\"aa\",b,\"c\",[]],1]",[v,t]]] 没有没用。

注意:该算法旨在获取诸如"[\"a\",b,3]" 之类的字符串并返回一个术语,即["a",b,3],其中包含字符串、原子、数字、空列表以及更多此类列表。

% The query:

test(15,[[n,grammar1],["[[\"aa\",b,\"c\",[]],1]",[v,t]]],

% The code:

[
          [[n,grammar1],[[v,u],[v,t]],":-",
          [
                     [[n,compound],[[v,u],"",[],[v,t]]]
          ]
          ],

          [[n,compound213],["","",[v,t],[v,t]]],

          [[n,compound213],[[v,u],[v,u],[v,t],[v,t]]],

          [[n,compound],[[v,t],[v,u]],"->",
          ["[","]",
          [[n,compound213],[[v,t],[v,u]]]]],

          [[n,compound],[[v,t],[v,u]],"->",
          ["[",[[n,compound21],[[v,t],[v,v]]],"]",
          [[n,compound213],[[v,v],[v,u]]]]],

          [[n,compound212],["","",[v,t],[v,t]]],

          [[n,compound212],[[v,u],[v,u],[v,t],[v,t]]],

          [[n,compound21],[[v,t],[v,u]],"->",
          [[[n,item],[[v,i]]],
          % [[n,lookahead],["]"]],
          [[n,code],[[n,wrap],[[v,i],[v,itemname1]]],
          [[n,append],[[v,t],[v,itemname1],[v,v]]]],
          [[n,compound212],[[v,v],[v,u]]]]],

          [[n,compound21],[[v,t],[v,u]],"->",
          [[[n,item],[[v,i]]],",",
          
          %[[n,code],[[n,trace]]],
          
          [[n,compound21],[[],[v,compound1name]]],
          [[n,code],[[n,wrap],[[v,i],[v,itemname1]]],
          [[n,append],[[v,t],[v,itemname1],[v,v]]],
          [[n,append],[[v,v],[v,compound1name],[v,u]]]]]],

          [[n,item],[[v,t]],"->",["\"",[[n,word21],["",[v,t]]],
            "\""]],

          [[n,item],[[v,t]],"->",
          [[[n,number21],["",[v,u]]],[[n,code],
          [[n,stringtonumber],[[v,u],[v,t]]]]]],

          [[n,item],[[v,t]],"->",[[[n,word21_atom],["",[v,t1]]],
          [[n,code],[[n,atom_string],[[v,t],[v,t1]]]]]], % atoms

          [[n,item],[[v,t]],"->",[[[n,compound],[[],[v,t]]]]],

          [[n,number212],["","",[v,t],[v,t]]],

          [[n,number212],[[v,u],[v,u],[v,t],[v,t]]],

          [[n,number21],[[v,t],[v,u]],"->",
          [[v,a],[[n,commaorrightbracketnext]],
          [[n,code],[[n,stringtonumber],[[v,a],[v,a1]]],
          [[n,number],[[v,a1]]],
          [[n,stringconcat],[[v,t],[v,a],[v,v]]]],
          [[n,number212],[[v,v],[v,u]]]]],

          [[n,number21],[[v,t],[v,u]],"->",
          [[v,a],
          [[n,code],[[n,stringtonumber],[[v,a],[v,a1]]],
          [[n,number],[[v,a1]]],
          [[n,stringconcat],[[v,t],[v,a],[v,v]]]],
          [[n,number21],["",[v,numberstring]]],
          [[n,code],[[n,stringconcat],
          [[v,v],[v,numberstring],[v,u]]]]]],

          [[n,word212],["","",[v,t],[v,t]]],

          [[n,word212],[[v,u],[v,u],[v,t],[v,t]]],

          [[n,word21],[[v,t],[v,u]],"->",
          [[v,a],[[n,quote_next]],
          [[n,code],
          [[n,not],[[[n,=],[[v,a],"\""]]]],
          [[n,stringconcat],[[v,t],[v,a],[v,v]]]],
          [[n,word212],[[v,v],[v,u]]]]],

          [[n,word21],[[v,t],[v,u]],"->",
          [[v,a],
          [[n,code],
          [[n,not],[[[n,=],[[v,a],"\""]]]],
          [[n,stringconcat],[[v,t],[v,a],[v,v]]]],
          [[n,word21],["",[v,wordstring]]],
          [[n,code],
          [[n,stringconcat],[[v,v],[v,wordstring],[v,u]]]]]],


          [[n,word212_atom],["","",[v,t],[v,t]]],

          [[n,word212_atom],[[v,u],[v,u],[v,t],[v,t]]],

          [[n,word21_atom],[[v,t],[v,u]],"->",
          [[v,a],[[n,commaorrightbracketnext]],
          [[n,code],
          [[n,not],[[[n,=],[[v,a],"\""]]]],
          [[n,not],[[[n,=],[[v,a],"["]]]],
          [[n,not],[[[n,=],[[v,a],"]"]]]],
          [[n,stringconcat],[[v,t],[v,a],[v,v]]]],
          [[n,word212_atom],[[v,v],[v,u]]]]],

          [[n,word21_atom],[[v,t],[v,u]],"->",
          [[v,a],
          [[n,code],
          [[n,not],[[[n,=],[[v,a],"\""]]]],
          [[n,not],[[[n,=],[[v,a],"["]]]],
          [[n,not],[[[n,=],[[v,a],"]"]]]],
          [[n,stringconcat],[[v,t],[v,a],[v,v]]]],
          [[n,word21_atom],["",[v,wordstring]]],
          [[n,code],
          [[n,stringconcat],[[v,v],[v,wordstring],[v,u]]]]]],
          
          [[n,commaorrightbracketnext],"->",
          [[[n,lookahead],[","]]]],

          [[n,commaorrightbracketnext],"->",
          [[[n,lookahead],["]"]]]],
          
          [[n,quote_next],"->",
          [[[n,lookahead],["\""]]]],

          
          [[n,lookahead],[[v,a],[v,a],[v,b]],":-",
          [[[n,stringconcat],[[v,b],[v,d],[v,a]]]]]
],

% The desired result:

[[[[v,t],[["aa",b,"c",[]],1]]]]).

【问题讨论】:

    标签: string list prolog interpreter


    【解决方案1】:

    我通过取消注释该行来修复代码:

    [[n,lookahead],["]"]],
    

    取消注释以打开调试的行后,

    [[n,code],[[n,trace]]],
    

    这表明,如果没有前瞻语句来检查下一个字符是否是“]”,则代码在超过 2 个项目之后错误地跟随它所在的子句,失败,并且使用前瞻语句,它所在的子句仅在 n 项列表的末尾成功。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 2014-08-27
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多