替换列表prolog列表中的元素

时间:2014-05-02 12:21:00

标签: prolog

我有一个这样的清单:

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]]).  

1 个答案:

答案 0 :(得分: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

这里我们允许replace / 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).

你仍然需要一些不同的谓词来清理这个程序,但是这个断言可以免费提供很多模式匹配。

希望这足以让你朝着正确的方向前进。