我有一个这样的清单:
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 :(得分: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).
你仍然需要一些不同的谓词来清理这个程序,但是这个断言可以免费提供很多模式匹配。
希望这足以让你朝着正确的方向前进。