Recursion 简单递归Prolog函数
我目前正在尝试创建一个简单的函数,在给定第一个和最后一个数字的列表中打印整数 例如,函数调用:count(3,7,Z)将打印“Z=[3,4,5,6,7]” 以下是我迄今为止的尝试:Recursion 简单递归Prolog函数,recursion,prolog,Recursion,Prolog,我目前正在尝试创建一个简单的函数,在给定第一个和最后一个数字的列表中打印整数 例如,函数调用:count(3,7,Z)将打印“Z=[3,4,5,6,7]” 以下是我迄今为止的尝试: count(First,Last,Result):- First <= Last, append(First,Result,Result), count(First+1,Last,Result). 计数(第一个、最后一个、结果):- 第一个逐行: 计数(第一个、最后一个、结果):- 糟糕的风格:这
count(First,Last,Result):-
First <= Last,
append(First,Result,Result),
count(First+1,Last,Result).
计数(第一个、最后一个、结果):-
第一个逐行:
计数(第一个、最后一个、结果):-
糟糕的风格:这个名字暗示了另一个功能
首先您的程序有很多问题。首先,当您编写3+2
Prolog时,它不会像任何其他语言那样计算结果。您必须明确要求执行计算,并通过谓词is
将计算结果绑定到变量,例如,X是3+2,
,然后将X
绑定到5
,以用于规则尾部的其余部分
其次,写入append(First,Result,Result)
意味着“通过将First
追加到Result
中,您将再次获得Result
”,除非First
是空列表,否则该操作将始终失败(读取:productfalse
),因为如果您将某个内容追加到列表中,您获得的列表比开始时的列表更长。显然,您未能区分追加
和计数
中的两个结果
——它们实际上并不相同。另外请注意,append(A,B,C)
适用于列表,因此A
、B
和C
都必须是可以实例化为列表的列表或术语,否则将失败。这正是您的情况,因为First
始终是一个数字-肯定不是列表,而是它的成员。因此,您不应使用append
:使用列表构造和与=
的统一来将元素追加到列表中,并将获得的结果绑定到变量,例如X=[element | list]
最后,如果上述所有内容都正确,您的谓词仍然会失败,因为您没有定义归纳的基本情况。换句话说:谓词何时应该回答[]
?如前所述,First>Last
:在这种情况下,范围为空,并且Result
也必须为空。在您的程序中,当发生这种情况时,谓词显然会失败(请注意,当您写入foo(X,Y):-X>=0时,Y是X+1。
,这意味着每当X
小于零时就会失败)。作为递归的基本情况的空范围,谓词的计算迟早会在这里结束,因此它总是会失败
最后,你应该写下如下内容:
ints(First, Last, Interval) :- First > Last -> Interval = [] ;
NFirst is First + 1, ints(NFirst, Last, NInterval), Interval = [First | NInterval].
(我为谓词和变量提供了更多的声明性名称)。当然,这个谓词只有在第一个和最后一个完全实例化为数字时才起作用(不能反转)