2014-05-02 238 views
0

我有一个这样的名单:列表序言名单替换元素

board([[16, -,15, -,14, -,13], 
     [ -,A, -, -, -,B,-], 
     [12, -,11, -,10, -,9], 
     [ -, -, -,C, -, -,-], 
     [8, -,7, -,6, -,5], 
     [- ,D, -, -, -,E,-], 
     [4, -,3, -, 2, -,1]]). 

我想在一个功能要素16 15,15 11,11 12和12 16。我知道,以取代如何更换在列表中的元素,但我不知道怎么用这个例子做

答案应该是这样的:

board([[12, -,16, -,14, -,13], 
     [ -,A, -, -, -,B,-], 
     [11, -,15, -,10, -,9], 
     [ -, -, -,C, -, -,-], 
     [8, -,7, -,6, -,5], 
     [- ,D, -, -, -,E,-], 
     [4, -,3, -, 2, -,1]]). 
+0

你能告诉我们你到目前为止试过的东西吗? –

+0

这个数字是循环的。我想旋转圆圈,并用第二,第二,第三,第三,第四和第四替换第一个元素,但我不能保留在一个列表中,如[16,15,12,11] – Krzysiek

回答

1

确定,所以我们需要做的第一件事就是确定我们如何将会取代最简单的价值观方式是将这些视为功能对。我们可以存储列表清单,而不是存储列表[16,15,12,11]; [[16,15],[15,12],[12,11],[11,16]]解决了我们在存储什么替换的问题。我们的下一步是打破投入。

parse_2d_list([]). 

parse_2d_list([H|Tail]) :- %this is my quick parser that breaks it up 
    replace_functor(H), %your replacer function 
    parse_2d_list(Tail). 

我上面的例子只是概述了基本的分析方法,你可能需要额外的变量来绑定输入和输出。

现在我们要通过我们的名单

replace_functor([H|Tail],[[Val|Rep]|RTail]],Output,Ac) :- %here I'm using Reps to represent our replacement value  
    H == Val, 
    append(Ac,Rep,Ac2), 
    replace_functor(Tail,[Val|Rep]|RTail]],Output,Ac2). 

这仅涉及单一的情况下进行搜索。我们需要巧妙地确定如何迭代替换列表。

另一种方法是,如果您不想处理辅助列表,则使用动态。

:- dynamic replace/2 

在这里,我们允许更换/ 2持有的价值和它的替代品,所以如果我说

assert(replace(16,15)). 

我在我的知识基础,以帮助创建结合事实。我们可以通过做

retract(replace(16,15)). 

在这种情况下,在最后清理它我们可以方便的更换为:

replace_functor([H|Tail],Output,Ac) :- 
    replace(Val,Rep), 
    H == Val, 
    append(Ac,Rep,Ac2), 
    replace_functor(Tail,Output,Ac2). 

你仍旧需要几个不同的谓词来收拾这个程序,但断言给你很多免费的模式匹配。

希望这足以让你走向正确的方向。

+0

嗯......在这一刻,我认为我的董事会写得不好......这应该是像这张图片一样工作http://s6.ifotos.pl/img/lllgif_enrewhn.gif – Krzysiek

+0

@Bart是的,我会订购它,所以第一个列表在列表中是A,第二个是B,依此类推。你不需要列表中的董事会信件。最重要的是,列表中的大写字母是按照prolog约定的变量,所以你会得到一些非常奇怪的绑定。 –

+0

所以要将这张图片保存在列表中,它会看起来像这样:board([[16,15,14,13],[12,11,10,9],[8,7,6,5],[ 4,3,2,1]])。 ? a,b,d,e没有c? – Krzysiek