List Prolog中的分离列表

List Prolog中的分离列表,list,prolog,clpfd,logical-purity,List,Prolog,Clpfd,Logical Purity,我真的很难理解如何让我的代码显示由偶数和奇数组成的隔离列表。我甚至不知道我缺乏什么理解。显然,我对这门语言还不熟悉,必须在学校使用它。我的命令性和功能性思维不会让我知道这个lol到底是怎么回事 现在,不,我不是要你做我的家庭作业!我只是请求你帮我看看我缺乏理解是什么。我也找到了类似的答案,但我无法将它们转换为我应该编写此函数的方式 请,再一次,不要像我以前经常被责骂那样责骂我。请帮我看看我的理解有什么不足。请不要只给我答案和代码片段而不解释 这是: is_even(H) :- 0 is m

我真的很难理解如何让我的代码显示由偶数和奇数组成的隔离列表。我甚至不知道我缺乏什么理解。显然,我对这门语言还不熟悉,必须在学校使用它。我的命令性和功能性思维不会让我知道这个lol到底是怎么回事

现在,不,我不是要你做我的家庭作业!我只是请求你帮我看看我缺乏理解是什么。我也找到了类似的答案,但我无法将它们转换为我应该编写此函数的方式

请,再一次,不要像我以前经常被责骂那样责骂我。请帮我看看我的理解有什么不足。请不要只给我答案和代码片段而不解释

这是:

is_even(H) :-
   0 is mod(H, 2).

segregate(List, Even, Odd) :- segregator(List, Even, Odd).

segregator([], [], []).
segregator([H|T], E, O) :-
    is_even(H),
    % I feel here is where I am supposed to build the list, 
    % but I have no clue how since Even or Odd has not been unified.
    segregator(T, E, O),
    write('Even is '), write(E), nl.
segregator([H|T], E, O) :-
    % Same here as above.
    segregator(T, E, O),
    write('Odd is '), write(O), nl.
逻辑上纯粹的实现非常简单,这得益于:

我们希望通过有限的答案序列成功完成一些示例查询:

?- Xs = [1,2,3,4,5,6,7], list_evens_odds(Xs,Es,Os).
Xs = [1,2,3,4,5,6,7],
Es = [  2,  4,  6  ],
Os = [1,  3,  5,  7] ;
false.

?- list_evens_odds(Ls,[2,4],[1,3]).
Ls = [2,4,1,3] ? ;
Ls = [2,1,4,3] ? ;
Ls = [2,1,3,4] ? ;
Ls = [1,2,4,3] ? ;
Ls = [1,2,3,4] ? ;
Ls = [1,3,2,4] ? ;
no
我们期望失败的查询呢

最后,最一般的查询是:

编辑2015-05-06 这里有另一种方法来做它

将元谓词与zeven_t/2或zodd_t/2一起使用

两者都取得了决定性的成功。使用list_evens_lobbits/3的等效查询则不然。

逻辑上纯粹的实现非常简单,这要归功于:

我们希望通过有限的答案序列成功完成一些示例查询:

?- Xs = [1,2,3,4,5,6,7], list_evens_odds(Xs,Es,Os).
Xs = [1,2,3,4,5,6,7],
Es = [  2,  4,  6  ],
Os = [1,  3,  5,  7] ;
false.

?- list_evens_odds(Ls,[2,4],[1,3]).
Ls = [2,4,1,3] ? ;
Ls = [2,1,4,3] ? ;
Ls = [2,1,3,4] ? ;
Ls = [1,2,4,3] ? ;
Ls = [1,2,3,4] ? ;
Ls = [1,3,2,4] ? ;
no
我们期望失败的查询呢

最后,最一般的查询是:

编辑2015-05-06 这里有另一种方法来做它

将元谓词与zeven_t/2或zodd_t/2一起使用


两者都取得了决定性的成功。使用list\u evens\u赔率/3的等效查询不适用。

您的is\u even谓词看起来不错。你的隔离名单,偶数,奇数:-隔离名单,偶数,奇数。不会伤害任何东西,但没有任何作用。分离器[]、[]、[]是正确的基本情况。您现在需要的是修复其他两个分离器规则,这两个规则目前无法提供关于E和O的组成的任何方向。反复思考。如果H是偶数,那么E和O在分离器[H | T],E,O中应该是什么样子?H怎么了?如果H不是偶数\+is_evenH会发生什么?这可能会出现在你的第三个seggerator子句中。因此,你的第二个seggerator/3子句描述了当第一个列表的头是偶数时列表之间的关系。所以它会说,分离器[H | T],[H | E],O:-是| u evenH。。。。在你的第三条中,你需要一个奇怪的情况。所以检查\+是公平的。非常感谢你们!我知道我的逻辑是朝着正确的方向发展的,但统一这些清单一直是我的问题。我不明白为什么我不能把它们统一起来。你的is_谓词看起来很好。你的隔离名单,偶数,奇数:-隔离名单,偶数,奇数。不会伤害任何东西,但没有任何作用。分离器[]、[]、[]是正确的基本情况。您现在需要的是修复其他两个分离器规则,这两个规则目前无法提供关于E和O的组成的任何方向。反复思考。如果H是偶数,那么E和O在分离器[H | T],E,O中应该是什么样子?H怎么了?如果H不是偶数\+is_evenH会发生什么?这可能会出现在你的第三个seggerator子句中。因此,你的第二个seggerator/3子句描述了当第一个列表的头是偶数时列表之间的关系。所以它会说,分离器[H | T],[H | E],O:-是| u evenH。。。。在你的第三条中,你需要一个奇怪的情况。所以检查\+是公平的。非常感谢你们!我知道我的逻辑是朝着正确的方向发展的,但统一这些清单一直是我的问题。我不明白为什么我不能统一他们。
?- list_evens_odds(Ls,[2,4,5],[1,3]).
no
?- list_evens_odds(Ls,[2,4],[1,3,6]).
no
?- list_evens_odds([_,_,_],[2,4],[1,3]).
no
?- assert(clpfd:full_answer).
yes

?- list_evens_odds(Ls,Es,Os).
Ls = [],   Es = [],   Os = []                              ? ;
Ls = [_A], Es = [_A], Os = [], _A mod 2#=0, _A in inf..sup ? ...
bool01_t(1,true).
bool01_t(0,false).

zeven_t(Z,Truth) :- Z mod 2 #= 0 #<==> B, bool01_t(B,Truth).

%zodd_t(Z,Truth) :- Z mod 2 #= 1 #<==> B, bool01_t(B,Truth).
zodd_t(Z,Truth)  :- Z mod 2 #=         B, bool01_t(B,Truth). % tweaked
?- tpartition(zeven_t,[1,2,3,4,5,6,7],Es,Os). Es = [2,4,6], Os = [1,3,5,7]. ?- tpartition(zodd_t ,[1,2,3,4,5,6,7],Os,Es). % argument order differs Es = [2,4,6], Os = [1,3,5,7].