Matrix 用分解法实现矩阵的Prolog转置

Matrix 用分解法实现矩阵的Prolog转置,matrix,prolog,logic,Matrix,Prolog,Logic,首先,我知道在其他问题中还有其他代码可以对矩阵进行转置,但我的问题是具体的: 在一次家庭作业中,我被要求构建一个分解/3代码,将每个列表的第一个元素与其余元素分开 在这之后,我被要求创建一个代码来transpose/3a矩阵。(如果输入不是矩阵,它可能会失败,目的不是检查它是否是矩阵) 到目前为止,我有以下代码:decompose/3,transpose/3,和transpose1/3(transpose和transpose1是相同的,但基本情况不同) 因此,在本例中,输入矩阵是[3 x 2],

首先,我知道在其他问题中还有其他代码可以对矩阵进行转置,但我的问题是具体的:

在一次家庭作业中,我被要求构建一个
分解/3
代码,将每个列表的第一个元素与其余元素分开

在这之后,我被要求创建一个代码来
transpose/3
a矩阵。(如果输入不是矩阵,它可能会失败,目的不是检查它是否是矩阵)

到目前为止,我有以下代码:
decompose/3
transpose/3
,和
transpose1/3
(transpose和transpose1是相同的,但基本情况不同)

因此,在本例中,输入矩阵是[3 x 2],对这两种情况都很好,但如果我的矩阵有4行以上,
transpose
不再工作,并且由于基本情况
transpose1([[x],[Y],[Z],[B]],[[x,Y,Z,B]])。
它最多可以操作4行,但如果矩阵更大,然后结果是
false

知道如何操作我的代码吗?如何使基本情况适用于矩阵中的任意行数?为什么这不起作用


谢谢大家!

为什么您的基本情况不只是
transpose1([],[])。
而不是
transpose1([[X],[Y],[Z],[B]],[[X,Y,Z,B]])。
?递归是在元素用完时完成的,而不是在最后一个元素上完成的。另外,如前所述,每行中的一个元素将与当前表达的两个谓词子句相匹配。这样做时,它就不再运行了。那么我是如何得到代码的,如果我输入:
transpose1([1,2],[3,4],[5,6],[5,6]],R)。
它根据跟踪停止在这里<代码>失败:(10)分解([]、[]、[]、[]、[]、[]、[u G1273、[u G1288])?蠕变。如果我使用你告诉我的,它会产生相同的错误,但也会失败,有3行。我不明白。它显然还有其他问题,但基本情况确实需要使用空列表,而不是一个元素的列表。这就是将您限制为4行的原因。那样做是不对的。您是否测试了您的
分解
?分解返回:
L1=[1,3,5],L2=[2,8],[4],[6]。
输入:
Decompose([1,2,8],[3,4],[5,6]],L1,L2)。
这很好,我还有另一个分解代码,显然效率较低,所以我不使用它。但我仍然认为transpose在L2中存在一些问题,因为它是一个列表列表。这就是我们尝试的原因<代码>转换1([[X],[Y],[Z],[B],[[X,Y,Z,B]])
我想
分解
是在处理空列表。
分解
在结束时,当它执行最后一个元素(例如,
分解([[a],[B]],X,Y])时返回
结果是
a=[a,B]
,而不是
Y=[]
)。如果将其修改为只返回
[]
,则
转置([],[])
将作为基本情况。
%4. transpose(M, R)
%Input transpose([[1,2],[3,4],[5,6]], R).

decompose([], [], []).
decompose([[H|T]|T0], [H|L1], [T|L2]) :- 
    decompose(T0, L1, L2).

transpose(M,[L1|Z]):-                       #This code works for 3 rows
    decompose(M,L1,L2),
    transpose(L2,Z).

transpose1([[X],[Y],[Z],[B]],[[X,Y,Z,B]]).  #This code works for up to 4 rows
transpose1([H|T],[L1|R]):-    
    decompose([H|T],L1,L2),
    transpose1(L2,R).