无法将我的代码发送到 运行
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
已经是一个数字并且 X
是 0
时才可能是真的.
这里有一个持续减少的版本:
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" 一个变量到另一个变量,就像在命令式语言中一样。您确实在尝试 统一 R
和 K
,这是通过 R = K
.
完成的
我对这个问题真的很绝望(我对 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
已经是一个数字并且 X
是 0
时才可能是真的.
这里有一个持续减少的版本:
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" 一个变量到另一个变量,就像在命令式语言中一样。您确实在尝试 统一 R
和 K
,这是通过 R = K
.