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

If statement 用尾部递归Prolog程序查找满足特定条件的子列表,if-statement,recursion,prolog,tail-recursion,sublist,If Statement,Recursion,Prolog,Tail Recursion,Sublist,我想做的是: 我想写一个尾部递归Prolog程序,它搜索整数列表中最长的升序序列,并保存这个子列表的起始索引和结束索引 e、 g 到目前为止,我的问题是: 基本上,我试着用伪代码实现一个算法,它能满足我的需要,但我的问题是,我似乎不知道如何使用if语句来实现这个算法,而不使用“else”,它们在语句中有多个动作,或者不使用if longest_asc_sublist(List,_,_) :- longest_asc_sublist(List,1,1,1,0,1,1). longest_asc_s

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

e、 g

到目前为止,我的问题是: 基本上,我试着用伪代码实现一个算法,它能满足我的需要,但我的问题是,我似乎不知道如何使用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).
longest_asc_子列表(List,_,_):-longest_asc_子列表(List,1,1,0,1,1)。
最长的子列表([],V,K,K,u,V,u)。
最长的子列表([X,Xs | Xss],u,u,K,T,V,M):-
K1为K+1,T1为T+1,
XsM,!,%2.if条件
M1是T1,To1是K,From1是V,%statement
最长的_asc_子列表(Xss,To1,From1,K1,T1,V1,M1)。
我最大的问题是我不能让它超出“Xs 所以我的两个问题是:

当“Xs 有没有一种方法可以实现这样的if

(Xs < X ->
(T1 is 1, V1 is K)),
(Xs
(T1为1,V1为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
s在后面

(   if
->  then
;   true
),
(   if
->  then
;   true
)
现在关于
:如果你真的想简单地统一一个变量和另一个变量,而你不能直接使用同一个变量名,那么你应该明确地统一,使用
=

T1 = 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
s在后面

(   if
->  then
;   true
),
(   if
->  then
;   true
)
现在关于
:如果你真的想简单地统一一个变量和另一个变量,而你不能直接使用同一个变量名,那么你应该明确地统一,使用
=

T1 = 1

谢谢,这真的帮了我的忙,我不知道我可以说:否则就对了。在调用递归之前,我仍在试图找出如何管理所有变量,但我自己应该能够管理这些变量。^^^再次感谢您的帮助!我必须承认,我不理解
is
=
之间的区别,因为
=
操作符不允许我更改已经有值的变量,就像
is
操作符一样,但我通过将那些if语句转换为子句并使用额外的变量,成功地解决了这个问题,因为在我的例子中,两个if块都改变了不同的变量,所以我的else语句现在只需将相同的值赋给一个新变量,例如T3 is T1。@elefish,
is
运算符在左侧实例化一个变量,在右侧实例化一个经过计算且完全实例化的表达式。例如,
Y=12,Z=2,X是Y+2*Z。
将用
16
实例化
X
。如果未实例化
Y
Z
,则会发生错误。
=
运算符试图实例化同一术语的两侧,而不计算表达式。因此,
Y=12,Z=2,X=Y+2*Z
将导致
X=12+2*2
(相当于
X=+(12,*(2,2))
。谢谢,这真的帮了我的忙,我不知道我可以说:else true。我仍在试图在调用递归之前找出如何管理所有变量,但我自己应该能够管理这些变量。^^^再次感谢你的帮助!我不得不承认我不明白
之间的区别=
因为
=
操作符不允许我更改已经有值的变量,就像
操作符一样,但是我通过将那些if语句转换为子句并使用额外的变量来解决问题,因为在我的情况下,if块都会更改不同的变量,所以我的else语句现在只分配例如,T3等新变量的相同值是T1。@elefish,
is
运算符在左侧实例化一个变量,在右侧实例化一个计算的完全实例化的表达式。例如,
Y=12,Z=2,X是Y+2*Z。
将用
16
实例化
X
。如果
Y
Z
中的任何一个是如果不实例化,则会发生错误。
=
运算符试图实例化同一项的两侧,而不计算表达式。因此,
Y=12,Z=2,X=Y+2*Z
将导致
X=12+2*2
(相当于
X=+(12,*(2,2))