我想做什么: 我想写一个尾递归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)),
如果它的评估结果为假,它会导致终止吗?
答案 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}}:
=