0

从我班的旧决赛中:

这是一些序言代码:

mystery(1, 1).
mystery(N, F) :-
    N1 is N-1,
    mystery(N1,F1),
    F is F1*N.

问题一:P中的什么值统一

mystery(3, P).

问题2:如果Prolog产生并回答神秘问题后按下分号,解释器最终会报告“ERROR:Out of local stack”。为什么会发生这种情况,您如何修改谜题以避免错误?


问题1:我明白了

P = 6 ?

问题 2:如果我按分号来获取所有答案,我会得到一个 out of local stack 错误。我不确定这段代码试图完成什么或如何修复它,所以我不会离开本地堆栈。有任何想法吗?

4

2 回答 2

2

堆栈外错误可能是因为,当您深入了解mystery(1, F1)which resolves tomystery(1, 1)并要求更多解决方案时,您点击了下一个子句,该子句调用mystery(0, F1). 此时,它试图找到一个解决方案,但唯一匹配的子句调用了 for mystery(-1, F1),并且调用了 formystery(-2, F1)等等。这意味着在第一个数字回绕到 1 或出现堆栈溢出之前,将调用匹配项,因为每个待处理的匹配项都会占用堆栈空间。

于 2010-12-08T22:19:16.463 回答
0

@David Thornley 已经解释了为什么搜索更多答案会炸毁你的堆栈。您可以通过使用 cut 运算符来修复它:

mystery(1, F) :- !, F is 1.
mystery(N, F) :-
    N1 is N-1,
    mystery(N1,F1),
    F is F1*N.

此处的剪切使得如果第一个参数是1,则可能不应用第二个规则。

于 2010-12-08T22:39:20.687 回答