Prolog代码示例:统一

时间:2010-12-08 22:03:05

标签: stack prolog unification

来自我班级的旧决赛:

这是一些prolog代码:

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

问题1:与

中的P统一了什么值
mystery(3, P).

问题2:如果在Prolog产生并按下分号后按下分号,解释器最终将报告“错误:超出本地堆栈”。为什么会发生这种情况,你怎么能修改神秘以避免错误?


问题1: 我得到了

P = 6 ?

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

2 个答案:

答案 0 :(得分:2)

堆栈外错误可能是因为,当你下到mystery(1, F1)并解析为mystery(1, 1)并要求更多解决方案时,你会点击下一个调用mystery(0, F1)的子句。此时,它尝试找到一个解决方案,但唯一匹配mystery(-1, F1)调用的子句,并且调用mystery(-2, F1)等等。这意味着需要匹配,直到第一个数字回绕到1或者你得到堆栈溢出,因为每个挂起的匹配都占用了堆栈空间。

答案 1 :(得分:0)

@David Thornley已经解释了为什么寻找更多的答案会炸毁你的筹码。您可以使用剪切运算符来修复它:

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

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