无法让我的代码运行

时间:2015-02-01 02:56:57

标签: prolog

我对这个问题非常绝望(我对Prolog不太满意)。 我被要求创造一个减少神秘主义者, 换句话说,我必须做以下事情:

如果我给了,让我们说,123,我需要返回总和: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 :(

我还在努力......谢谢!

2 个答案:

答案 0 :(得分:0)

这对你有用吗?

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时才会成立。< / p>


这是一个继续减少的版本:

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).

它当然可以减少一点,但这需要更多的思考,我可以做两杯红色。 : - )

答案 1 :(得分:0)

它可能会更简单一些(我的第二杯咖啡,没有葡萄酒;)):

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。如果没有基本情况,您的谓词将始终最终返回失败或无限循环,因为X < 0没有有效的案例而且没有其他条款。

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

is/2谓词用于评估右侧的完全实例化算术表达式(is/2的第二个参数),并在左侧实例化变量(第一个参数为is/2)有这个价值。在这里,K没有值,因此您将从Prolog获得实例化错误。如果K确实有值,那么除非X mod 10恰好为零,否则它仍然必然会失败,因为您在Prolog中说K的值是该K的值{ {1}}加X mod 10,如果X mod 10不为零,这当然是不可能的。

   T is (X//10),

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

   reduction(T, R),
   R is K.

这两者是一个问题。假设reduction(T, R)按照您的意愿成功(由于上述问题,它不会成功),R将被实例化,那么以下表达式R is K将失败,除非{ {1}}已实例化,并且已与K具有相同的值。这也是prolog初学者常常错误地分配&#34;一个变量到另一个变量,就像命令式语言一样。您确实在尝试统一 RR,这是使用K完成的。