如何检查列表列表中的所有元素除了一个之外是否相同[Prolog]

如何检查列表列表中的所有元素除了一个之外是否相同[Prolog],prolog,Prolog,我想检查数组的元素是否小于0,除了由(X,Y)参数化的1个元素。 我尝试使用maplist,但无法保持相等。 我尝试的另一种选择是: verifyMatrix(X,Y,M) :- verifyMatrix(X,Y,0,M). verifyMatrix(,,_,[]) :- !. verifyMatrix(X,Y,I,[M|Ms]):- rowVerify(0,M), Ni is I, verifyMatrix(X,Y,Ni,Ms). verifyMatrix(

我想检查数组的元素是否小于0,除了由(X,Y)参数化的1个元素。 我尝试使用maplist,但无法保持相等。 我尝试的另一种选择是:

verifyMatrix(X,Y,M) :-
   verifyMatrix(X,Y,0,M).

verifyMatrix(,,_,[]) :-
   !. 
verifyMatrix(X,Y,I,[M|Ms]):-
   rowVerify(0,M),
   Ni is I,
   verifyMatrix(X,Y,Ni,Ms). 
verifyMatrix(X,Y,X,[M|Ms]):-
   rowVerify(Y,M),
   I is X,
   verifyMatrix(-1,-1,I,Ms).

rowVerify(,,[]) :- !. 
rowVerify(Ec,I,[R|Rs]):-
   ((R < 0) ; (Ec is I)),
   Ni is I,
   rowVerify(Ec,Ni,Rs).

rowVerify(Ec,R):-
   rowVerify(Ec,0,R).
验证矩阵(X,Y,M):- 验证矩阵(X,Y,0,M)。 验证矩阵(,,,,[]):- !. 验证矩阵(X,Y,I[M|Ms]):- 行验证(0,M), 倪是我,, 验证矩阵(X,Y,Ni,Ms)。 验证矩阵(X,Y,X[M|Ms]):- (Y,M), 我是X, 验证矩阵(-1,-1,I,Ms)。 行验证(,[]):-!。 rowVerify(Ec,I[R|Rs]):- ((R<0);(Ec为I)), 倪是我,, rowVerify(Ec、Ni、Rs)。 rowVerify(Ec,R):- 行验证(Ec、0、R)。
您试图同时解决所有问题,这让事情变得太难了。让我们首先编写一个谓词来验证列表(“行”)中的所有元素是否小于零,稍后我们将讨论这个特殊元素。我们可以通过以下方式进行验证:

less_zero(L) :-
    maplist(>(0), L).
我们还可以使用以下方法检查条件是否适用于所有元素(给定索引除外):

我们可以生成一个谓词,检查行索引是否与给定的行索引相同,并相应地将其路由到
less\u zero/1
less\u zero\u/2
,如:

verify_row(Row, I, I, ColJ) :-
    less_zero_except(Row, ColJ).
verify_row(Row, I, J, _) :-
    dif(I, J),
    less_zero(Row).
现在,我们也可以在矩阵级别上使用
forall/2

verifyMatrix(RowI, ColJ, Matrix) :-
    forall(nth0(I, Matrix, Row), verify_row(Row, I, RowI, ColJ)).
多向谓词 以上不是双向的:我们不能在这里传递矩阵,然后让Prolog确定非负值的坐标(假设该值存在)。但是,我们可以通过以下方式实现:

然后我们可以验证矩阵:

validate_matrix([], _, _, _).
validate_matrix([Row|T], RowI, ColJ, I) :-
    validate_row(Row, RowI, ColJ, I, 0),
    I1 is I+1,
    validate_matrix(T, RowI, ColJ, I1).
然后我们可以根据
验证矩阵/4
定义
验证矩阵/3

validate_matrix(ColI, RowJ, Matrix) :-
    validate_matrix(Matrix, ColI, RowJ, 0).
我们现在可以生成满足给定约束的矩阵,以及找出非负元素的坐标,并验证给定坐标对的矩阵:

?- validate_matrix(I, J, M).
M = [] ;
M = [[]] ;
M = [[], []] ;
M = [[], [], []] ;
M = [[], [], [], []] ;
M = [[], [], [], [], []] ;
M = [[], [], [], [], [], []] ;
M = [[], [], [], [], [], [], []] ;
M = [[], [], [], [], [], [], [], []] .

?- validate_matrix(I, J, [R1, R2, R3]).
R1 = R2, R2 = R3, R3 = [] ;
I = 2,
J = 0,
R1 = R2, R2 = [],
R3 = [_5416],
_5416 in 0..sup ;
I = 2,
J = 0,
R1 = R2, R2 = [],
R3 = [_5672, _5678],
_5672 in 0..sup,
_5678 in inf.. -1 ;
I = 2,
J = 0,
R1 = R2, R2 = [],
R3 = [_5916, _5922, _5928],
_5916 in 0..sup,
_5922 in inf.. -1,
_5928 in inf.. -1.

?- validate_matrix(I, J, [[1, -1], [-2, -3]]).
I = J, J = 0 ;
false.

?- validate_matrix(I, J, [[-1, -1], [-2, 3]]).
I = J, J = 1 ;
false.

?- validate_matrix(I, J, [[-1, 1], [-2, 3]]).
false.

?- validate_matrix(0, 1, [[-1, -1], [-2, 3]]).
false.

?- validate_matrix(1, 1, [[-1, -1], [-2, 3]]).
true ;
false.
使用
nth1/3
(或
nth0/3
,如果您喜欢从0开始索引)枚举大于等于0的矩阵元素:

?- Matrix =[[-1,-2,-3],[-4,-5,+6],[-7,-8,-9]], nth1(R,Matrix,Row), nth1(C,Row,Element), Element>=0.
Matrix = [[-1, -2, -3], [-4, -5, 6], [-7, -8, -9]],
R = 2,
Row = [-4, -5, 6],
C = 3,
Element = 6 ;
false.    
然后,使用
findall/3
验证该元素是否唯一且是否位于给定位置:

?- Matrix =[[-1,-2,-3],[-4,-5,+6],[-7,-8,-9]], 
findall(R-C, (nth1(R,Matrix,Row), 
nth1(C,Row,Element), Element>=0),[I-J]).
Matrix = [[-1, -2, -3], [-4, -5, 6], [-7, -8, -9]],
I = 2,
J = 3.
?- less_than_zero_except(2,3,[[-1,-2,-3],[-4,-5,+6],[-7,-8,-9]]).
true.

?- less_than_zero_except(I,J,[[-1,-2,-3],[-4,-5,+6],[-7,-8,-9]]).
I = 2,
J = 3.

?- less_than_zero_except(I,J,[[-1,-2,-3],[-4,-5,+6],[-7,-8,+9]]).
false.

?- less_than_zero_except(I,J,[[-1,-2,-3],[-4,-5,-6],[-7,-8,-9]]).
false.
因此,除了/3之外,我们可以将谓词
小于0定义为:

less_than_zero_except(I, J, Matrix) :-
    findall(R-C, (nth1(R,Matrix,Row), nth1(C,Row,Element), Element>=0), [I-J]).
此谓词可用于验证特定位置或查找此类位置:

?- Matrix =[[-1,-2,-3],[-4,-5,+6],[-7,-8,-9]], 
findall(R-C, (nth1(R,Matrix,Row), 
nth1(C,Row,Element), Element>=0),[I-J]).
Matrix = [[-1, -2, -3], [-4, -5, 6], [-7, -8, -9]],
I = 2,
J = 3.
?- less_than_zero_except(2,3,[[-1,-2,-3],[-4,-5,+6],[-7,-8,-9]]).
true.

?- less_than_zero_except(I,J,[[-1,-2,-3],[-4,-5,+6],[-7,-8,-9]]).
I = 2,
J = 3.

?- less_than_zero_except(I,J,[[-1,-2,-3],[-4,-5,+6],[-7,-8,+9]]).
false.

?- less_than_zero_except(I,J,[[-1,-2,-3],[-4,-5,-6],[-7,-8,-9]]).
false.

数组(列表)?还是矩阵?类似于[1,2,3]、[4,5,6]、[7,8,9]的矩阵
less_than_zero_except(I, J, Matrix) :-
    findall(R-C, (nth1(R,Matrix,Row), nth1(C,Row,Element), Element>=0), [I-J]).
?- less_than_zero_except(2,3,[[-1,-2,-3],[-4,-5,+6],[-7,-8,-9]]).
true.

?- less_than_zero_except(I,J,[[-1,-2,-3],[-4,-5,+6],[-7,-8,-9]]).
I = 2,
J = 3.

?- less_than_zero_except(I,J,[[-1,-2,-3],[-4,-5,+6],[-7,-8,+9]]).
false.

?- less_than_zero_except(I,J,[[-1,-2,-3],[-4,-5,-6],[-7,-8,-9]]).
false.