【发布时间】: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