【发布时间】:2017-02-22 00:01:05
【问题描述】:
我有一个阶乘谓词fact(N,F),其中N 或F 或两者都以数字为界。
例如,我可以拥有fact(3,F) 或fact(N,6)。
这是我的谓词,它有效,但我不太明白如何。我使用了trace,但仍然无法理解它。
fact(0,1).
fact(N,F) :-
fact(N1,F1),
N is N1 + 1,
F is N * F1.
【问题讨论】:
-
你也可以手动“单步”遍历它:
fact(3, F)不匹配fact(0, 1)(因为 3 和 0 不能统一),所以 Prolog 将匹配下一个子句fact(N, F)和 @ 987654331@。然后它再次调用fact(N1, F1)并根据第一个子句提出N1 = 0和F1 = 1,依此类推。注意,在找到解之后,它会尝试找到更多并且不会终止,导致堆栈溢出。 -
我很好奇:如果你不知道它是如何工作的,你是怎么写这个谓词的?
-
@lurker:这很好理解:另一个版本可能会产生实例化错误。
-
@lurker:嗯,我是从这个版本开始的:
factorial(0, 1). factorial(N, F):- N > 0, N1 is N - 1, factorial(N1, F1), F is N * F1.,一直尝试直到我明白为止。
标签: prolog factorial failure-slice