2015-12-05 142 views
0

我对我的CS任务有些麻烦。我试图调用之前在一个新规则中创建的另一条规则,该规则将计算幂函数的阶乘(例如Y =(N^X)!)。我认为我的代码的问题是exp(Y,X,N)中的Y在我称为阶乘(Y,Z)时没有继续,尽管我并不完全确定。我一直在试图找到一个这样的例子,但我一直无法找到任何东西。Prolog递归(功率函数的阶乘)

我不期待答案,因为这是家庭作业,但任何帮助将不胜感激。

这里是我的代码:

/* 1.2: Write recursive rules exp(Y, X, N) to compute mathematical function Y = X^N, where Y is used 
to hold the result, X and N are non-negative integers, and X and N cannot be 0 at the same time 
as 0^0 is undefined. The program must print an error message if X = N = 0. 
*/ 

exp(_,0,0) :- 
    write('0^0 is undefined'). 

exp(1,_,0). 

exp(Y,X,N) :- 
    N > 0, !, N1 is N - 1, exp(Y1, X, N1), Y is X * Y1. 

/* 1.3: Write recursive rules factorial(Y,X,N) to compute Y = (X^N)! This function can be described as the 
factorial of exp. The rules must use the exp that you designed. 
*/ 

factorial(0,X) :- 
    X is 1. 

factorial(N,X) :- 
    N> 0, N1 is N - 1, factorial(N1,X1), X is X1 * N. 

factorial(Y,X,N) :- 
    exp(Y,X,N), factorial(Y,Z). 
+1

注意,您会在'factorial/3'的主体中得到一个关于'Z'的单例变量警告。你的问题可能在那里。如果你得到一个单例错误警告,并且你不知道该怎么做,请尝试用'_'替换该变量。如果由此产生的表达没有意义,你可以告诉你有更深的问题。 –

+0

@DanielLyons好了,所以我解决了你现在提出的问题,看起来问题似乎是程序执行X^N,但是它不会继续计算它的阶乘。 – Jordanthedud

+0

尝试使用'trace'来调试它。我的期望是,你有一个有趣的顺序变量,你可能意味着像'factorial(Y,X,N): - exp(F,X,N),阶乘(Y,F)'。 –

回答

1

在阶乘/ 3中提到的变量z(只提到一次;所谓的“单变量”,永远不能得到统一用什么...)。

注意到问题的注释,将它短路到_将不起作用,您必须将它与一个合理的值统一起来(你想要计算/将子句的头部与exp相关联,并且通过参数析取factorial =>引入一些参数“中间”/头部未提及)。

编辑:我会重新命名你的变量,你也许你会本身更清楚你做了什么:

factorial(Y,X,Result) :- 
    exp(Y,X,Result), factorial(Y,UnusedResult). 

现在你应该可以看到你的阶乘/ 3计算真的是什么,以及如何解决它。

+0

读两个句子:我说如果你用'_'替换一个单例,结果是没有意义的(在这种情况下它不会),那么你的推理是有缺陷的。一些初学者与单变量变量警告纠缠在一起,这有助于向他们展示问题。 –

+0

你的建议对我毫无意义。单身警告不是致命的,代码的含义也是相同的。我建议恰恰相反,要认真思考单身人士出现的“参数位置”的意义。 OP只是偶然地写下了一些变量名,甚至没有想到每个代表什么...... –

+0

除了错误的根源在哪里,我们同意所有的事情。真正的错误在学生的脑海里。他们来自C,他们不明白单身人士警告的严重程度。我的建议并没有改变对Prolog的含义 - 但是做出改变往往有助于学生_看到Prolog正在做什么的心理模型是有缺陷的。我们有同样的目标:让OP认真思考这个位置的含义。请记住,90%的Prolog问题来自于经验丰富的程序员程序员,从Prolog开始。他们的直觉往往是更深层次的问题。 –