尝试在序言中打印简单数字时出现意外错误

Unexpected error when am trying to print a simple number in prolog

我正在做一个练习,我必须做一些事情。正在创建一个计算 pow(2,c) 的“函数”,其中 c 是一个计数器,如果计数器大于我放置的静态数字,则“函数”必须 returns 数字 c。问题是,当我试图测试它时,编译器运行了几个错误,之后程序停止运行,我不知道为什么有人可以帮助我? 我正在测试它: 数 (2,1,C,6,M)。其中 6 是我设置的静态数字,它与计数器 C 进行比较,其中 C 是工作正常的“函数”pow3 的结果。 主要问题出在“功能”编号。 我的代码

num(A,B,C,D,M) :- pow3(A,B,C),Y is (B+1),num(A,Y,C,D,M).
num(A,B,C,D,M) :- C > D,M is C.

pow3(X,Y,Z) :- powend(X,Y,1,Z),!.

powend(_,0,A,Z) :- Z is A.
powend(X,Y,A,Z) :- Y1 is Y - 1, A1 is A*X, powend(X,Y1,A1,Z).

我得到的错误是:

 1) trail stack overflow 
 2) cstr stack overflow
 3) global stack overflow
 4) local stack overflow
 5) Program terminated 

您的代码的问题是,一旦计算出第一个幂,变量 C 就会变成常量 1

为了解决这个问题,在每次递归调用时,必须使用一个新变量 C1

此外,必须明确定义执行递归情况的条件。

num(_, _, C, D, M) :- C > D, M is C.
num(A, B, C, D, M) :- C =< D, pow3(A,B,C1), Y is B+1, num(A,Y,C1,D,M).

示例:

?- num(2,0,1,6,M).
M = 8 ;
false.