Prolog - 如何用另一个列表中的其他元素替换列表中的元素

时间:2014-05-20 15:36:11

标签: list prolog

我是Prolog的新手,我在使用列表方面遇到了麻烦 我有两个长度相同的列表,一个是完整的,另一个是不完整的 每个列表都包含此表格(Shape, Color)的对 所以首先我必须定义完整列表:

CompleteList([(Square,Blue),(Circle,Red),(Triangle, Green),(Circle,Blue)]).

给出第二个列表(不完整)。类似的东西:

IncompleteList = [(Square,Blue),_ , (Circle,_) , _ ].

然后我有这个仿函数'检查',以检测不完整的对,如(Circle,_)和空格_,并替换为完整列表中的元素。
  最后的列表必须具有相同的元素,顺序无关紧要,但不完整列表中的原始片段必须保持在同一位置。     所以:

check(IncompleteList, CompleteList). 

IncompleteList离开:

IncompleteList = [(Square,Blue),_ , (Circle,_) , _ ].

到此:

IncompleteList = [(Square,Blue),(Triangle, Green),(Circle,Blue),(Circle,Red)].

IncompleteList = [(Square,Blue),(Circle,Blue),(Circle,Red),(Triangle, Green)].

...

对于这个例子,列表的长度是4,但实际上我正在使用长度为9的列表,但我认为它没有相关性,因为我想知道的是如何我首先检测不完整的对,替换那些对,然后将其他部分随机地放在列表中。

1 个答案:

答案 0 :(得分:0)

我希望你能够体会到Prolog声明能力,向你展示一个简单的解决方案,基于select / 3:

equalize([], []).
equalize(A, B) :-
    select(X, A, A1),
    select(X, B, B1),
    equalize(A1, B1).

示例:

?- Incomplete = [('Square','Blue'),_,('Circle',_),_], equalize([('Square','Blue'),('Circle','Red'),('Triangle','Green'),('Circle','Blue')], Incomplete).
Incomplete = [ ('Square', 'Blue'), ('Circle', 'Red'), ('Circle', 'Blue'), ('Triangle', 'Green')] ;
Incomplete = [ ('Square', 'Blue'), ('Circle', 'Red'), ('Circle', 'Blue'), ('Triangle', 'Green')] ;
...

如果您尝试删除重复的解决方案,您可能会更好地理解该语言。