Prolog不';不返回值

Prolog不';不返回值,prolog,Prolog,我有以下代码: pair_list([X,Y],[[X,Y]]). pair_list([E,Z|X],[K|Y]):- [E,Z]==K, pair_list(X,Y). 当我运行它时,它为 ?- pair_list([1, 2, 3, 4, 5, 6], [[1, 2], [3, 4], [5, 6]]). true ; 但是当我跑的时候 ?- pair_list([1,2, 3, 4, 5, 6], X). 我只得到了false。 我的问题是为什么我不把X=[[1,2],[3,4],

我有以下代码:

pair_list([X,Y],[[X,Y]]).
pair_list([E,Z|X],[K|Y]):- [E,Z]==K, pair_list(X,Y).
当我运行它时,它为

?- pair_list([1, 2, 3, 4, 5, 6], [[1, 2], [3, 4], [5, 6]]).
true ;
但是当我跑的时候

?- pair_list([1,2, 3, 4, 5, 6], X).
我只得到了
false。


我的问题是为什么我不把
X=[[1,2],[3,4],[5,6]]
你就快到了:你所需要做的就是把
[E,Z]
移到头部,消除
K

pair_list([X,Y],[[X,Y]]).
pair_list([E,Z|X],[[E,Z]|Y]) :- pair_list(X,Y).

请注意,可以将base子句替换为基于空列表的子句:

pair_list([], []).
pair_list([E,Z|X],[[E,Z]|Y]) :- pair_list(X,Y).


还请注意,您的程序不会处理项目数为奇数的列表。为了解决这个问题,可以添加一个单独的基本子句来处理一个包含单个项目的列表,方法是删除该项目、与某个固定原子配对,或者做一些在这种情况下有用的事情。

==
(比较)更改为
=
(或者将
[E,Z]
移到头部)。如果列表中的项目数为奇数,则失败更有意义。@托马斯比,这取决于OP的要求,可能会出现列表中应该填充一些值的情况。如果我们假设OP的意思是他写列表的方式,那么这似乎表明当长度为奇数时要求失败。