如何使用一个变量向上和向下迭代到无穷大

时间:2017-03-09 18:53:07

标签: loops recursion

我刚刚开始使用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从正数转为负数计数根本不起作用。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您可以使用以0开头的累加器,并按顺序更新,每次"发出"结果如此:

userInput(X) :-
    userInput(0,X).

现在每次使用累加器统一X

userInput(X,X).

递归案例当然必须确定下一个项目,您可以使用以下指南:

  • 如果数字X小于或等于零,则新X2X2 is -X+1;和
  • 如果数字X大于零,则新的X2X2 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

<强>替代

更简单的替代方案就是首先说明0userInput/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).