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