Prolog:将表达式作为参数传递

时间:2016-05-28 03:02:57

标签: prolog factorial

我正在编写一个程序来打印从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).
  

factorial(1)= 1

     

factorial(2)= 2

     

factorial(3)= 6

     

factorial(4)= 24

     

factorial(5)= 120

但是,当我删除Next is X+1,并将Next替换为X+1时,会打印出奇怪的内容:

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).
  

factorial(1)= 1

     

阶乘(1 + 1)= 2

     

阶乘(1 + 1 + 1)= 6

     

阶乘(1 + 1 + 1 + 1)= 24

     

阶乘(1 + 1 + 1 + 1 + 1)= 120

计算确实是正确的但似乎X+1在作为参数传递并被解释为字符串时没有减少?

1 个答案:

答案 0 :(得分:0)

正如你所说,prolog在检查谓词时从不评估整数表达式,例如在foo(X + 1)中。

记住&#34; X + 1&#34;在prolog中,是一个带有&#34; +&#34;作为类型和两个元素,X和1.即,X + 1&lt; =&gt; +(X,1)。另一个例子是:1 + 1 + 1&lt; =&gt; +(1,+(1,1))

这个术语与声明变量统一。

为了评估整数表达式,&#34;是&#34;应该使用,就像你的第一个例子一样。