我已经在prolog中编写了一段时间的代码并且它已经接近编译了,并且我的所有想法似乎都很可靠,所以它在编译时应该可以正常工作。它是一个程序,它查询数据库文件中的子句列表,然后它等待用户查询,然后它将从句子中选择它需要的信息并适当地查询数据库但是有一段代码保持不变给我错误抱怨标准谓词中不存在flowpattern这可能是一个愚蠢的问题,但即使我已经做了所有调查,我无法找到如果有人可以帮助我解决这个问题或如何解决这个问题指出我正确的方向,将非常感激。
以下是给出错误的代码块:
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).
编译器抱怨的具体行是前置(STR,SYMB,STR),!, 任何帮助将是一个非常感谢!
答案 0 :(得分:1)
由于我们正在查看代码的“ex [c] er [p] t”,因此很难确定出现了什么问题,但是给出的证据指出:loop/1
正在在readquery/1
之前调用可以将参数填充(绑定)STR
到loop/1
。
请注意loop/1
调用自身(递归),并以重复/失败模式执行此操作。但是第一次运行loop/1
时,代码中没有任何迹象表明参数STR
将如何填充。
更清晰(更自包含)的代码片段如下:
loop :-
readquery(STR),
scan(STR,LIST),
filter(LIST,LISroT1),
pars(LIST1,LIST2),
fail.
loop :- loop.
这清楚地表明谓词loop
实际上并没有返回任何结果(并且给定的代码片段不够完整,无法明确整个程序的完成情况)。它假定fail
中loop
之前的子句是确定性的,因此在失败时,控制转到loop/0
的第二个(递归)子句。如果不是这种情况,可以通过将每个调用包装在once/1
内来强制确定性。