2016-05-28 10 views
0

私は1からNの階乗を印刷するプログラムを書いて、引数として式を渡します。プロローグは:

factorial(1, 1). 
factorial(A, B) :- 
    A > 0, 
    C is A-1, 
    factorial(C, D), 
    B is A*D. 

print_fact(X) :- 
    print_fact_iter(1, X). 

print_fact_iter(X, Max) :- 
    X < Max+1, 
    factorial(X, N), 
    write("factorial("), 
    write(X), 
    write(") = "), 
    write(N), 
    nl, 
    Next is X+1, 
    print_fact_iter(Next, Max). 

階乗(1)= 1

階乗(2)= 2

階乗(3)6

階乗を=(4)= 24

階乗(5)= 120

しかし、私はNext is X+1,を削除し、X+1Nextを交換するとき、それは奇妙な何かを出力します。

print_fact_iter_weird(X, Max) :- 
    X < Max+1, 
    factorial(X, N), 
    write("factorial("), 
    write(X), 
    write(") = "), 
    write(N), 
    nl, 
    print_fact_iter_weird(X+1, Max). 

階乗(1)= 1

階乗を( 1 + 1)= 2

階乗(1 + 1 + 1)= 6

階乗(1 + 1 + 1 + 1)= 24

階乗(1 + 1 + 1 + 1 + 1)= 120

コンピューティングは、実際に正しいが、X+1が低減されていないと思われます引数として渡され、文字列として解釈されますか?

+0

[この回答](http://stackoverflow.com/questions/37481942/counting-occurrences-in-list#answer-37483710)をご覧ください。あなたの問題について説明します。 – lurker

答えて

0

foo(X + 1)のように、述語をチェックするとき、プロローグは決して整数式を評価しません。

"X + 1"は、プロローグで、タイプとして "+"があり、Xと1の2つの要素を持つ用語であることに注意してください。つまりX + 1 < => +(X、1)です。もう1つの例は次のとおりです。1 + 1 + 1 < => +(1、+(1,1))

この用語は、ステートメント変数で統一されたものです。

整数式を評価するには、最初の例のように "is"を使用する必要があります。