我刚开始学习Prolog并发现很难处理与列表相关的问题。 如果我有一个清单。在这个列表中,我有三个内部列表。
[[a,b,c], [d,e,f],[h,g]]
我需要编写一个名为“move(L,X,From,To,R)”的谓词,其中X是我要移动的字符(此字符必须是内部列表中的最后一个元素),From is我想要移动的列表索引,To是我想要移动到的列表的索引。 e.g。
move([[a,b,c], [d,e,f],[h,g]], f, 2, 3, R).
返回
R = [[a,b,c], [d,e],[h,g,f]]
又一个例子:
move([[a,b,c], [d,e,f],[h,g]], f, 2, 1, R).
返回
R = [[a,b,c,f], [d,e],[h,g]]
我写了一个帮助器谓词来确定一个字符是否是列表中的最后一个元素:
last([A], C):- A == C.
last([_|T], C):- last_one(T, C).
我花了几个小时思考它,但没有工作的解决方案。有什么帮助吗?
答案 0 :(得分:0)
我认为您必须证明以下内容:
move(L, X, From, To, R)
是您要运行的谓词,因此#1参数是列表列表(在示例中: L = [[a,b,c], [d,e,f],[h,g]]
); #3和#4参数是L的成员,因此您可以使用谓词 nth1(N, L, E)
,其中N是元素的顺序,L是列表,E是元素;每个元素都是另一个列表,现在您必须从列表中删除X并将其添加到列表To中。
对于它,首先你可以使用谓词' select/3
&#39 ;;对于第二个,您可以使用' append/3
'。
我尝试了以下规则,但它给出了主要列表的不同顺序:
move(L, X, F, T, R) :-
nth1(F, L, Lf),
nth1(T, L, Lt),
select(X, Lf, Rf),
append(Lt, [X], Rt),
select(Lf, L, Ra),
select(Lt, Ra, Rb),
append(Rb, [Rf], Rc),
append(Rc, [Rt], R).
使用此代码,您将获得以下内容:
move([[a,b,c], [d,e,f],[h,g]], f, 2, 3, R).
R = [[a,b,c], [d,e],[h,g,f]]
但:
move([[a,b,c], [d,e,f],[h,g]], f, 2, 1, R).
R = [[h,g], [d,e], [a,b,c,f]]