无法将我的代码发送到 运行

Cant get my code to run

我对这个问题真的很绝望(我对 Prolog 不是很好)。 我被要求创建一个 reductionTheosophique, 换句话说,我必须执行以下操作:

如果给定 123,我将需要 return 总和:1+2+3=6。 这是我到目前为止得到的。

reduction(X,R) :-
   X >= 0,
   K is (K + (X mod 10)),
   T is  (X//10),
   reduction(T,R),
   R is K 

65=6+5=11=1+1=2:(

我还在努力...谢谢!

这对你有用吗?

reduction(0, 0) :- !.
reduction(X, R) :-
    X2 is X // 10,
    reduction(X2, R2),
    R is ((X mod 10) + R2).

你的代码的部分问题是你写了 K is (K + (X mod 10)) 并且只有当 K 已经是一个数字并且 X0 时才可能是真的.


这里有一个持续减少的版本:

reduction(0, 0) :- !.
reduction(X, R) :-
    X2 is X // 10,
    reduction(X2, R2),
    R is ((X mod 10) + R2),
    R < 10.
reduction(X, R) :-
    X2 is X // 10,
    reduction(X2, R2),
    R1 is ((X mod 10) + R2),
    R1 >= 10,
    reduction(R1, R).

它当然可以再减少一点,但这需要更多的思考,我已经喝了两杯红酒了。 :-)

它可能更简单一些(我正在喝第二杯咖啡,没有酒;)):

reduce(N, N) :- N < 10, !.
reduce(N, R) :-
    N >= 10,
    Y is N // 10,
    reduce(Y, R1),
    R2 is (N mod 10) + R1,
    reduce(R2, R).

检查您最初的尝试:

reduction(X,R) :-
   X >= 0,

您可以在此处检查 X >= 10 而不是检查 >= 0 并包括所需的 基本案例 ,正如我在上面所做的那样,X < 10.没有基本情况,您的谓词最终总是 return 失败或无限循环,因为 X < 0 没有有效情况,也没有其他子句。

   K is (K + (X mod 10)),

is/2 谓词用于计算右侧完全实例化的算术表达式(is/2 的第二个参数),并实例化左侧的变量([=19= 的第一个参数) ]) 具有该值。在这里,K 没有值,因此您将从 Prolog 得到一个 实例化错误 。如果 K 确实有一个值,它仍然必然会失败,除非 X mod 10 恰好为零,因为你在 Prolog 中说 K 的值是相同 K加上X mod 10,当然,如果X mod 10不为零,那是不可能的。

   T is (X//10),

这似乎没问题,因为 X 是已知的。

   reduction(T, R),
   R is K.

这两个加在一起就是个问题。假设 reduction(T, R) 如您所愿地成功(由于上述问题而不会成功),R 将被实例化,那么下面的表达式 R is K 将失败,除非 K 被实例化并且已经具有与 R 相同的值。这也是 prolog 初学者的一个常见错误,即 "assign" 一个变量到另一个变量,就像在命令式语言中一样。您确实在尝试 统一 RK,这是通过 R = K.

完成的