请为prolog任务编写解决方案

时间:2012-03-21 20:21:28

标签: arrays list prolog

我有一个矩阵M x N,我需要切换索引为[1,N][M,N]的元素的位置。

更新

我是Prolog的新手,这是我的解决方案,返回false :(

main([FirstRow|Tail],X):-
    last(FirstRow, A),
    last(Tail, LastRow),
    last(LastRow, B),
    skipLastItem(FirstRow,FirstRowWithoutA),
    skipLastItem(LastRow,LastRowWithoutB),
    append(FirstRowWithoutA,[B],FirstRowNew),
    append(LastRowWithoutB,[A],LastRowNew),
    assign([FirstRowNew],X),
    skipLastItem(Tail,Middle),
    appendAllElements(Middle,X),
    append(X,LastRowNew,X).

appendAllElements([X|Tail],List):-
    append(List,X,NewList),
    appendAllElements(Tail,NewList).

appendAllElements([],_).

assign(Item,Item).

skipLastItem([_],[ ]) :- !.
skipLastItem([H|T],[H|S]) :-
skipLastItem(T,S).

1 个答案:

答案 0 :(得分:3)

这听起来像是家庭作业,所以我在这里会有点模糊......

从更换列表中的一个值的简单问题开始。写一个递归谓词

swap_list(X,N,A,B,Y)

应该读作“对于列表X,在位置N,删除值A并将其替换为B给出列表Y”。

现在我们可以将其扩展到矩阵的情况。写第二个递归谓词

swap_matrix(X,M,N,A,B,Y)

应该被理解为“对于矩阵X,在位置(M,N),去除元素A并用B替换它给出矩阵Y”。此递归的基本情况(M=0将包含对swap_list的调用。

现在,您可以使用以下内容交换两个位置(M1,N1)和(M2,N2):

swap(X,M1,N1,M2,N2,Y) :-
    swap_matrix(X,M1,N1,A,B,Z),
    swap_matrix(Z,M2,N2,B,A,Y).

请注意,我们会先将B插入矩阵Z,然后才知道它是什么 - 在第二次swap_matrix调用之前,B未分配值。