我对这个问题非常绝望(我对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
:(
我还在努力......谢谢!
答案 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
已经是数字并且X
为0
时才会成立。< / 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;一个变量到另一个变量,就像命令式语言一样。您确实在尝试统一 R
和R
,这是使用K
完成的。