2

我已经在 prolog 中编写了一段时间的代码,它几乎值得编译,我所有的想法似乎都很可靠,所以它在编译时应该可以工作。它是一个程序,它查询数据库文件以获取子句列表,然后等待用户查询,然后它将从句子中选择所需的信息并适当地查询数据库,但有一段代码保留给我错误,抱怨标准谓词中不存在流模式,这可能是一个愚蠢的问题,但即使我已经做了所有的调查,如果有人可以帮助我,我还是无法找到解决这个问题的方法或指出我正确的方向,将不胜感激。

这是给出错误的代码块:

loop(STR):- 
           scan(STR,LIST),
           filter(LIST,LISroT1),
           pars(LIST1,LIST2),
           fail.

loop(STR):-    STR >< "",readquery(L),loop(L).

readquery(QUERY):-nl,nl,write("Query: "),readln(QUERY).

scan(STR,[TOK|LIST]):-
    fronttoken(STR,SYMB,STR1),!,
    upper_lower(SYMB,TOK),
    scan(STR1,LIST).

编译器抱怨的具体行是 fronttoken(STR,SYMB,STR),!, 任何帮助将不胜感激!

4

1 回答 1

1

由于我们正在查看代码的“ex[c]er[p]t”,因此很难确定出了什么问题,但是给定的证据表明了这一点: loop/1被调用之前readquery/1可以完成其工作来填充(绑定)参数STRloop/1.

请注意,它loop/1调用自身(递归地),并以重复/失败模式进行。但是第一次loop/1运行时,代码中没有显示参数STR将如何填充的迹象。

更清晰(更独立)的代码片段如下所示:

loop :- 
           readquery(STR),
           scan(STR,LIST),
           filter(LIST,LISroT1),
           pars(LIST1,LIST2),
           fail.

loop :-    loop.

这清楚地表明谓词loop实际上并没有返回任何结果(并且给定的代码片段还不够完整,无法清楚地说明整个程序完成了什么)。它假设 in 前面的子句failloop确定性的,因此在失败时,控制权会传递到 的第二个(递归)子句loop/0。如果不是这种情况,则可以通过将每个调用包装在内部来强制确定性once/1

于 2012-10-19T15:35:26.217 回答