我想做的事情:我想写一个尾部递归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