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



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

例如

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

到目前为止,我的问题是:基本上,我试图通过它的伪代码来实现一种算法,它可以满足我的需求,但我的问题是,我似乎无法弄清楚如何在没有"其他"跟随的情况下使用if语句来实现这一点,或者在没有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<X",一旦它的值为false,程序就会终止并返回false。

所以我的两个问题是:

当"Xs<X"为假时,我如何使此程序不终止?

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

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

如果评估结果为false,则不会导致终止?

简单的答案是:

(   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:如果你真的想简单地将一个变量与另一个变量统一起来,而你不能简单地使用相同的变量名直接实现,那么你应该使用=:显式地统一

T1 = 1

最新更新