如何重写以下内容以便使用 if_?

Mar*_*nic 6 prolog

我正在做一些简单的练习来感受一下这门语言。

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_这里如何使用?

Wil*_*sem 0

if … then … else …在 Prolog 中,an在其他语言中的等价物是:

(condition -> if-true; if-false)
Run Code Online (Sandbox Code Playgroud)

其中conditionif-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)

您的if_/3谓词用于具体化谓词