如何在prolog中创建两个列表,一个是偶数列表,另一个是奇数列表?

如何在prolog中创建两个列表,一个是偶数列表,另一个是奇数列表?,prolog,Prolog,我有个问题 我们有一个未分类的列表: (1 4 5 3 6 7) 你能帮我列两张单子吗 一个奇数递增列表: (1 3 5 7) (6 4) 和另一个偶数递减列表: (1 3 5 7) (6 4) 不要使用排序 我正在尝试这个计划。但在序言中,我不知道怎么做 在这里: 好吧,首先,我们可以很容易地将偶数与赔率分开,如下所示: separate_even_odd([], [], []). separate_even_odd([X|Xs], [X|Even], Odd) :- 0 is

我有个问题

我们有一个未分类的列表:

(1 4 5 3 6 7)
你能帮我列两张单子吗

一个奇数递增列表:

(1 3 5 7)
(6 4)
和另一个偶数递减列表:

(1 3 5 7)
(6 4)
不要使用排序

我正在尝试这个计划。但在序言中,我不知道怎么做

在这里:


好吧,首先,我们可以很容易地将偶数与赔率分开,如下所示:

separate_even_odd([], [], []).
separate_even_odd([X|Xs], [X|Even], Odd) :-
  0 is X mod 2,
  separate_even_odd(Xs, Even, Odd).
separate_even_odd([X|Xs], Even, [X|Odd]) :-
  1 is X mod 2,
  separate_even_odd(Xs, Even, Odd).
这并不是非常有效——尾部递归版本不会更难,使用条件表达式也会更有效,但这似乎是一个非常直接的开始。这当然不能完全满足您的要求:

?- separate_even_odd([1,4,5,3,6,7], X, Y).
X = [4, 6],
Y = [1, 5, 3, 7]
因为我们不能排序,所以我们需要维护一个已排序的列表。由于基本案例列表是空的,所以我们只需要想出一种方法将值插入到排序列表中,从而维护sort属性。在这样或那样的情况下,这并不难:

insert_into_sorted_list(X, [], [X]).
insert_into_sorted_list(X, [Y|Ys], [X, Y|Ys]) :-
  X =< Y.
insert_into_sorted_list(X, [Y|Ys], [Y|Zs]) :-
  X > Y,
  insert_into_sorted_list(X, Ys, Zs).
您可以看到它是有效的:

?- insert_into_sorted_list(=<, 8, [1,2,4,5,6], X).
X = [1, 2, 4, 5, 6, 8] 

?- insert_into_sorted_list(>, 8, [6,5,4,3,2,1], X).
X = [8, 6, 5, 4, 3, 2, 1].

?- insert_into_sorted_list(<, 8, [6,5,4,3,2,1], X).
X = [6, 5, 4, 3, 2, 1, 8] ;
false.

?- insert_into_sorted_list(<, 0, [1,2,4,5,6], X).
X = [0, 1, 2, 4, 5, 6].

?- insert_into_sorted_list(<, 3, [1,2,4,5,6], X).
X = [1, 2, 3, 4, 5, 6].
?- separate_even_odd([1,4,5,3,6,7], Even, Odd).
Even = [6, 4],
Odd = [1, 3, 5, 7]
检查一下,它可以工作:

?- insert_into_sorted_list(=<, 8, [1,2,4,5,6], X).
X = [1, 2, 4, 5, 6, 8] 

?- insert_into_sorted_list(>, 8, [6,5,4,3,2,1], X).
X = [8, 6, 5, 4, 3, 2, 1].

?- insert_into_sorted_list(<, 8, [6,5,4,3,2,1], X).
X = [6, 5, 4, 3, 2, 1, 8] ;
false.

?- insert_into_sorted_list(<, 0, [1,2,4,5,6], X).
X = [0, 1, 2, 4, 5, 6].

?- insert_into_sorted_list(<, 3, [1,2,4,5,6], X).
X = [1, 2, 3, 4, 5, 6].
?- separate_even_odd([1,4,5,3,6,7], Even, Odd).
Even = [6, 4],
Odd = [1, 3, 5, 7]

你能和我们分享一些你尝试过的东西吗?我是prolog新手。请帮帮我。我不擅长Prolog你确定你需要Prolog而不是Common Lisp?您的列表是用Lisp表示法,而不是用Prolog表示法。我被迫用Prolog制作。您有没有学习过任何在线Prolog教程?读序言吗?在尝试这样的问题之前,您需要从这里开始,了解基本知识(如何编写列表、简单列表递归谓词等)。嗨,你说的尾部递归是什么意思?它与递归有什么不同?你的解决方案是递归的,不是吗?@AdrianMann如果递归调用是函数做的最后一件事,那么函数就是尾部递归的。它是递归函数的一个重要子类,因为它们可以非常高效地实现,本质上是作为一个goto,许多语言(包括现代Prolog实现)都会注意到尾部递归并对其进行优化。