Prolog按位置排序列表

时间:2014-06-19 02:47:05

标签: list prolog

我对Prolog很新,我正在尝试查看列表并检查每个元素是否在列表的正确位置。例如,假设你有一个颜色列表,每个颜色都分配了一个数值0或1.我想检查列表中所有偶数位置的值是否为0,奇数位置的值是否为1(开始列表)在0是偶数)。

red = 0
blue = 1
yellow = 0
orange = 1
green = 1
list1 = [red, blue, yellow, orange]
list2 = [red, yellow, orange, blue]

所以基本上在上面的例子中,我希望列表1返回true,因为它的值为[0,1,0,1]而list2返回false,因为它的值为[0,0,1, 1]

2 个答案:

答案 0 :(得分:1)

对于任何编程语言,您必须遵循其语法规则。你的代码似乎是Javascript,而不是Prolog。可以改为

color(red, 0).
color(blue, 1).
...
colors(list1, [red, blue, yellow, orange]).
...

完成后,我们可以写

check_colors(List) :-
  colors(List, Cs),
  forall(nth0(I, Cs, C), (N is I mod 2, color(C, N))).

您很可能需要使用自己的“列表访问”替换forall / 2。从I = 0开始

check_colors(List) :-
  colors(List, Cs),
  check_colors(Cs, 0).

并在递归调用之前递增它。递归将在空列表

上完成(隐式导致true
check_colors([], _).

请尝试编写剩下的程序......

答案 1 :(得分:0)

我想到的最简单的方法如下:

color(red,0).
color(blue,1).
color(yellow,0).
color(orange,1).
color(green,1).

%base cases.    
colors([X]):-color(X,_).
colors([]).

colors([X,Y|Xs]):-
    color(X,Cx), %X is a color with Cx ( 0 or 1)
    color(Y,Cy), %Y is a color with Cy ( 0 or 1)
    \+member(X,[Y|Xs]), % X is not  in the list
    Cx=\=Cy, % they are different
    colors([Y|Xs]). % continue recursion.
相关问题