2017-03-09 23 views
0

我剛剛開始使用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

你爲什麼不傳遞控制'+'和'-',你可以把它稱爲'sign'第二個參數? –

+1

*但是要將'X'從正向計數切換到負向計數根本不起作用。*您的意思是您有一些您嘗試過的代碼,但它不工作?你有關於你的代碼的問題嗎?也許你可以展示你的嘗試。 – lurker

+0

您是否正確發佈了示例:是X = -1; X = -2「正確或假設爲」X = -1; X = 2; X = -2;'?兩者都可以完成,但只要檢查是否容易犯錯。 –

回答

2

您可以使用蓄電池0開始,被throught的順序,各時間「發出」更新了它的結果,所以:

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

現在每次統一X與蓄電池:

userInput(X,X). 

當然遞歸情況下(S)已確定下一個項目,你可以使用下面的指南:

  • 如果數字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 

替代

是更容易被簡單地首先指出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).