Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 如何在turboprolog中模拟循环_Loops_Prolog - Fatal编程技术网

Loops 如何在turboprolog中模拟循环

Loops 如何在turboprolog中模拟循环,loops,prolog,Loops,Prolog,我想计算给定范围内奇数的总和,比如1到9是给定的输入。我的程序将显示1到9之间所有奇数的总和。虽然任务在理论上很简单,但作为turbo prolog的启动程序,我无法处理循环来计算总和。任何帮助都将不胜感激 提前感谢。我不打算为您编写完整的解决方案,但我可以给出如何以一般方式“循环”求和的想法。Prolog中的循环通常通过递归完成。递归绕过了这样一个事实:Prolog不会让您在实例化同一谓词子句中的变量后重新实例化它(除非您回溯)。以下是ISO Prolog语法 sum_values(First

我想计算给定范围内奇数的总和,比如1到9是给定的输入。我的程序将显示1到9之间所有奇数的总和。虽然任务在理论上很简单,但作为turbo prolog的启动程序,我无法处理循环来计算总和。任何帮助都将不胜感激


提前感谢。

我不打算为您编写完整的解决方案,但我可以给出如何以一般方式“循环”求和的想法。Prolog中的循环通常通过递归完成。递归绕过了这样一个事实:Prolog不会让您在实例化同一谓词子句中的变量后重新实例化它(除非您回溯)。以下是ISO Prolog语法

sum_values(First, Last, Sum) :-
    sum_values(First, Last, 0, Sum).

sum_values(First, Last, Sum, Sum) :-
    First > Last.
sum_values(First, Last, Acc, Sum) :-
    First =< Last,
    NewAcc is Acc + First,
    NewFirst is First + 1,
    sum_values(NewFirst, NewAcc, Sum).
这稍微短一点,但是没有可以重构的尾部递归

您需要对您的问题进行修改(这些是我知道的,因为我对TP的一些语法只稍微熟悉一点):

  • =/2
    替换
    is/2
    (我认为TP使用
    =/2
    进行表达式求值)

  • 您可能必须替换
    =谢谢@Louger添加标记。@Louger:因为这个问题不是特定于Turbo Prolog的,所以最好删除它。@false标题是“如何在Turbo Prolog中模拟循环”。我把它理解为Turbo-Prolog-specific,这可能会有一个与“普通”Prolog完全不同的答案,因为Turbo-Prolog倾向于做许多不同的事情。初学者通常会包括他们正在使用的系统的名称:这很好,因为他们不知道这是否相关。我们知道。因此,我们应该相应地重新标记,以便将来的用户将从中获利。@false好吧,真的,我对Turbo Prolog不太了解,不知道它是否有自己的循环功能。我确实知道,从我对Turbo Prolog的了解来看,它与大多数其他Prolog几乎没有什么关联。具体地说,我不认为它具有其他Prolog实现所具有的
    foreach
    interference
    ,等等。因此,如果有人用
    foreach
    给出了一个很好的答案,那么它就不是turboprolog用户的答案。也许我在这方面完全错了,TP确实有。不过,就你的观点而言,我应该按照我的第一直觉来评论,那就是问:“它必须是Turbo Prolog吗?”。非常感谢,先生,这可能会对@Louger有所帮助
    sum_values(First, Last, 0) :- First > Last.
    sum_values(First, Last, Sum) :-
        First =< Last,
        NewFirst is First + 1,
        sum_values(NewFirst, Last, PartialSum),
        Sum is PartialSum + First.