我刚刚开始使用Prolog,而且我真的陷入困境,我已经尝试了好几天才能让它工作多年,所以真的希望有人可以提供帮助。我被要求做到如果有人进入
userInput(X).
将会出现什么
X=0; X=1; X=-1; X=2; X=-2;
依此类推无限。
我知道如何使用以下方式无限向上执行此操作:
between(0, inf, X).
我也知道如何使用以下方式无限向下执行此操作:
example(X):- var(X), X=0.
example(X):- var(X), example(Y), X is Y-1.
据我所知,这也可以使用+
进行正向迭代。
但让X
从正数转为负数计数根本不起作用。
非常感谢任何帮助。
答案 0 :(得分:2)
您可以使用以0
开头的累加器,并按顺序更新,每次"发出"结果如此:
userInput(X) :-
userInput(0,X).
现在每次使用累加器统一X
:
userInput(X,X).
递归案例当然必须确定下一个项目,您可以使用以下指南:
X
小于或等于零,则新X2
为X2 is -X+1
;和X
大于零,则新的X2
为X2 is -X
。您可以将其写为:
userInput(X,R) :-
X =< 0,
!,
X2 is -X+1,
userInput(X2,R).
userInput(X,R) :-
X2 is -X,
userInput(X2,R).
或者把它们放在一起:
userInput(X) :-
userInput(0,X).
userInput(X,X).
userInput(X,R) :-
X =< 0,
!,
X2 is -X+1,
userInput(X2,R).
userInput(X,R) :-
X2 is -X,
userInput(X2,R).
这会产生:
?- userInput(X).
X = 0 ;
X = 1 ;
X = -1 ;
X = 2 ;
X = -2 ;
X = 3 ;
X = -3 ;
X = 4 ;
X = -4 ;
X = 5 ;
X = -5 ;
X = 6 ;
X = -6 ;
X = 7 ;
X = -7
<强>替代强>:
更简单的替代方案就是首先说明0
是userInput/1
:
userInput(0).
然后使用累加器来处理以1
开头的其他情况:
userInput(X) :-
userInput(1,X).
现在每次迭代,您将X
统一为结果,并-X
作为结果,并且在递归情况下,您递增X
。所以:
userInput(X,X).
userInput(X,NX) :-
NX is -X.
userInput(X,R) :-
X1 is X+1,
userInput(X1,R).
或者把它们放在一起:
userInput(0).
userInput(X) :-
userInput(1,X).
userInput(X,X).
userInput(X,NX) :-
NX is -X.
userInput(X,R) :-
X1 is X+1,
userInput(X1,R).