我是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的列表,但我认为它没有相关性,因为我想知道的是如何我首先检测不完整的对,替换那些对,然后将其他部分随机地放在列表中。
答案 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')] ;
...
如果您尝试删除重复的解决方案,您可能会更好地理解该语言。