你的程序有很多问题。首先,当您编写3 + 2
Prolog 时,不会像任何其他语言那样计算结果。您必须明确要求进行计算并将计算结果通过谓词绑定到变量,is
例如,X is 3 + 2, ...
然后您将不得不在规则尾部的其余部分中使用。X
5
其次,写作append(First, Result, Result)
意味着“通过附加First
到Result
你再次获得”,除非是空列表,否则Result
它总是会失败(阅读:生产) ,因为如果你将某些东西附加到一个列表中,你会获得一个比你开始时更长的列表。您显然无法区分and中的两个s - 它们确实不一样。另请注意,这适用于列表,因此,并且必须都是可以实例化为列表的列表或术语,否则它将失败。这正是您的情况,因为它始终是一个数字 - 绝对不是列表,而是它的成员。所以你不应该使用:使用列表构造和统一false
First
Result
append
count
append(A, B, C)
A
B
C
First
append
=
将元素附加到列表并将获得的结果绑定到变量,例如X = [Element | List]
.
最后,如果以上所有内容都正确,您的谓词仍然会失败,因为您没有定义归纳的基本情况。换句话说:你的谓词什么时候应该回答[]
?正如 CapelliC 所说,这必须发生在First > Last
: 在这种情况下,范围是空的,并且Result
也必须是空的。在您的程序中,当这种情况发生时,谓词显然会失败(请注意,当您编写 时foo(X, Y) :- X >= 0, Y is X + 1.
,这意味着无论何时X
小于零都失败)。作为递归的基本情况的空范围,你的谓词的评估迟早会在那里结束,所以它总是会失败。
最后,您应该编写如下内容:
ints(First, Last, Interval) :- First > Last -> Interval = [] ;
NFirst is First + 1, ints(NFirst, Last, NInterval), Interval = [First | NInterval].
(我为您的谓词和变量提供了更多的声明性名称)。当然,这个谓词只有在 First 和 Last 完全实例化为数字时才有效(它不能反转)。