我正在做一些简单的练习来感受一下这门语言。
is_list([]).
is_list([_|_]).
my_flatten([],[]).
my_flatten([X|Xs],RR) :-
my_flatten(Xs,R),
(is_list(X), !, append(X,R,RR); RR = [X | R]).
Run Code Online (Sandbox Code Playgroud)
这是一个使用 cut 的版本,用于将列表展平一级的谓词。
my_flatten([],[]).
my_flatten([X|Xs],RR) :-
my_flatten(Xs,R),
if_(is_list(X), append(X,R,RR), RR = [X | R]).
Run Code Online (Sandbox Code Playgroud)
这是我想写的方式,但它不起作用。也不is_list(X) = true
作为if_
条件。我打算在if_
这里如何使用?
if … then … else …
在 Prolog 中,an在其他语言中的等价物是:
(condition -> if-true; if-false)
Run Code Online (Sandbox Code Playgroud)
其中condition
、if-true
、 为if-false
您需要填写的项目。
因此,在这种特定情况下,您可以通过以下方式实现:
my_flatten([],[]).
my_flatten([X|Xs],RR) :-
my_flatten(Xs,R),
( is_list(X)
-> append(X,R,RR)
; RR = [X | R] ).
Run Code Online (Sandbox Code Playgroud)
或者我们可以递归地展平:
my_flatten([],[]).
my_flatten([X|Xs],RR) :-
my_flatten(Xs,R),
( flatten(X, XF)
-> append(XF,R,RR)
; RR = [X | R] ).
Run Code Online (Sandbox Code Playgroud)