我想创建一个谓词 divisors(X,[Y]),如果 X>1 并且 Y 是 X 的所有除数的列表,从 X 开始一直到 1,则该谓词为 true。
我的代码现在的样子:
divisors(1,[1]).
divisors(X,[Y,Z|Ys]) :-
X>0,
Y is X,
Y>Z,
divides(X,[Z|Ys]).
divides(X,[Y,Z|Ys]) :-
Y>Z,
0 is X mod Y,
divides(X,[Z|Ys]).
divides(X,[1]).
Run Code Online (Sandbox Code Playgroud)
但它有几个问题:
如果询问列表(例如?-divisors(10,X)),prolog 将返回错误。
?- 除数(X,[Y])。其中 [Y] 是不完整的除数列表,则为 true...
盖伊·编码器编辑
这个答案是由 OP 提出的,并发布在下面的评论中。
搬到这里以便其他人可以看到它。
divisors(X,R) :-
X > 1,
divisors(X,1,[],R).
divisors(X,D,R,R):-
D>X.
divisors(N,D0,R0,R) :-
divisors_0(N,D0,R0,R1),
D is D0 + 1,
divisors(N,D,R1,R).
divisors_0(N,D,R0,[D|R0]) :-
divides(N,D).
divisors_0(N,D,R0,R0).
divides(N,D) :-
0 is N mod D.
Run Code Online (Sandbox Code Playgroud)
Op 还指出了这个版本中的一些错误:
如果我询问像 (10,[1,2,3]) 这样的错误语句,它不会终止。
如果我询问类似 (X, …
prolog ×1