使用尾递归Prolog程序查找满足特定条件的子列表

时间:2013-12-08 17:00:55

标签: if-statement recursion prolog tail-recursion sublist

我想做什么: 我想写一个尾递归Prolog程序,它搜索整数列表中最长的升序,并保存该子列表的起始和结束索引。

e.g。

?- longest_asc_sublist([1,2,3,2,8,4,7,8,10,11,7,-1],From,To).
From = 6,
To = 10.

到目前为止,我的问题是什么: 基本上我已经尝试通过它的伪代码来实现算法,它可以完成我所需要的,但我的问题是我似乎无法弄清楚如何使用if语句使其工作,而不使用'else',在他们的陈述中有多个动作,或者在没有if的

的情况下做
longest_asc_sublist(List,_,_) :- longest_asc_sublist(List,1,1,1,0,1,1).
longest_asc_sublist([],V,K,K,_,V,_).
longest_asc_sublist([X,Xs|Xss],_,_,K,T,V,M) :-

                            K1 is K+1, T1 is T+1,

                            Xs < X, !,           % this would be an if condition
                            T1 is 1, V1 is K,    % and this the statement

                            T1 > M, !,                       % 2.if condition
                            M1 is T1, To1 is K, From1 is V,  % statement

                            longest_asc_sublist(Xss,To1,From1,K1,T1,V1,M1).

我最大的问题是我无法超越“Xs&lt; X”,一旦评估为false,程序就会终止并返回false。

所以我的两个问题是:

如果“Xs&lt; X”为假,我怎么能不让这个程序终止?

有没有办法实现这些?如果是这样的话?:

(Xs < X ->
(T1 is 1, V1 is K)),

如果它的评估结果为假,它会导致终止吗?

1 个答案:

答案 0 :(得分:1)

简单的答案,无需进入您的代码,是:

(   condition
->  if condition is true
)

相当于:

(   condition
->  if condition is true
;   false
)

(正如你已经注意到的那样)

您可能需要的是:

(   condition
->  if condition is true
;   true
)

if-else then-else if-then...如下所示:

(   if
->  then
;   else if
->  then
    % and so on
)

当两个if彼此相继时,当然,

(   if
->  then
;   true
),
(   if
->  then
;   true
)

现在关于is:如果你真的想简单地将一个变量与另一个变量统一,并且你不能通过简单地使用相同的变量名来直接完成它,那么你应该明确地统一,使用{ {1}}:

=