【问题标题】:Prolog BacktrackingProlog 回溯
【发布时间】:2015-10-07 08:13:02
【问题描述】:

我正在尝试做一个单词计算器..从文件中读取单词..将它们转换为数字,然后计算结果..我设法做到了所有这些,但我认为我的程序中有两个错误..

我主要有两个功能……

提取(单词), 计算(字数,0)。

extract 将从文件中读取 .. 然后返回单词列表 .. 例如:[one,plus,three] .. 现在计算会将这些单词的值转换为数字并计算.. 我也设法做到了.. 现在的错误是:如果我在文件中遇到停止,我必须停止阅读并终止.. 所以如果 Words 是 [stop] End。 我尝试了以下...

execute :-
 extract(Words),
 Words = [stop],nl,print('Terminating ...'),!.
execute :-
 extract(Words),
 calculate( Words,0).

它成功终止了..但是当我多次提取时它会跳过行.. 我已经尝试过..

execute :-
 extract(Words),
 Words \= [stop],execute(Words).
execute(Words) :-
 calculate( Words,0).

如果单词没有停止..然后去计算..但它不起作用!

感谢您的帮助.. 谢谢你

【问题讨论】:

    标签: prolog backtracking


    【解决方案1】:

    回溯时不会消除副作用(此处为:从文件中读取并进入下一个学期)。您可以阅读一次,然后使用 if/then/else 或辅助谓词根据阅读词进行选择,例如:

    execute :-
            extract(Words),
            (   Words == [stop] -> nl, write('Terminating ...')
            ;   calculate(Words, 0)
            ).
    

    在 SWI-Prolog 中,考虑使用 library(pio) 进行通过 描述的纯文件读取,它按预期处理回溯。

    【讨论】:

    • 感谢您的回复..我已经尝试过这样做..它正在停止..打印..但它一直在读取..我希望它停止解析文件,仅此而已..我不能只说看到,告诉,然后停止阅读..非常感谢..感谢您的帮助
    • s(X) 参考pio
    猜你喜欢
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多