检查对角线是否相同

时间:2019-05-21 05:28:58

标签: prolog

我正在尝试编写一个谓词以除去外部检查,对角线是否对角线是否在序言中具有相同的值(int) 例如:

same_Diagonal([[0,11,54,45],[16,1,6,9],[35,7,1,5],[27,3,9,1]])

    [0,11,54,45]
    [16,1,6,9]
    [35,7,1,5]
    [27,3,9,1]

首先,我们先去除外部,然后得到

[1,6,9]
[7,1,5]
[3,9,1]

并获取第一个列表的第一个元素的头,然后递归进行。

[1,5]
[9,1]

我已经成功移除了外部,因为当我键入

withoutHead([[0,11,54,45],[16,1,6,9],[35,7,1,5],[27,3,9,1]],X).

它可以成功显示

X = [[1, 6, 9], [7, 1, 5], [3, 9, 1]].

但是当比较对角线值时我失败了,这是我的代码

% withoutHead(+ ListOfList, -ListOfList)
% parameter1: the ListOfList is input
% parameter2: the ListOfList process output
withoutHead([HeadRow|TailRow],Squares):-
maplist(removeHead,TailRow,Squares).

% removeHead(+List, -List)
% parameter1: the List is each row
% parameter2: the List is tail of each row
removeHead([Head|Tail], Tail).


same_Diagonal([HeadRow|TailRow]):-
    withoutHead([HeadRow|TailRow],[[Diagonal|Tail]|Back]),
    same_Diagonal(Back).

,当我输入正确的输入时,我想返回“ true”,但它仍然给出“ false”。 谁能告诉我这是什么问题?

3 个答案:

答案 0 :(得分:2)

谓词必须将左上角的值与所有其他对角线统一。

same_diagonal([],_).
same_diagonal([[UpperLeft|_]|NextRows], Diagonal) :-
    Diagonal = UpperLeft,
    without_head(NextRows, SquareMatrix),    
    same_diagonal(SquareMatrix, Diagonal).

或者,您可以定义diagonal使其在矩阵的所有对角线上回溯:

diagonal([[UpperLeft|_]|_], UpperLeft).
diagonal([_ | NextRows], Diagonal) :-
    without_head(NextRows, SquareMatrix),
    diagonal(SquareMatrix, Diagonal).

[eclipse]: diagonal([[0, 11, 54, 45], [16, 1, 6, 9], [35, 7, 1, 5], [27, 3, 9, 1]], D).

D = 0
Yes (0.00s cpu, solution 1, maybe more) ? ;

D = 1
Yes (0.00s cpu, solution 2, maybe more) ? ;

D = 1
Yes (0.00s cpu, solution 3, maybe more) ? ;

D = 1
Yes (0.00s cpu, solution 4, maybe more) ? ;

No (0.00s cpu)

这可以与setof/3结合使用,后者会修剪重复的结果,并使用setof(D,diagonal(..., D),[_])来检查所有对角线是否相同。

答案 1 :(得分:2)

使用findall/3nth1/3,建立一个列表[X1, ..., Xn],其中XiM中第i个列表的第i个项目,并得到尾巴D。然后,使用maplist/2检查D中的所有项目是否都与{{​​1}}相同。

X

答案 2 :(得分:1)

在这里将程序分成两个谓词可能会很有用:

  1. diag/2生成给定列表的对角线;和
  2. are_same/1检查值是否全部相同。

优点是我们以后可以重用两个谓词以用于不同的应用程序。

我们可以如下实现diag/2

diag(M, D) :-
    diag(M, 0, D).

diag([], _, []).
diag([R|Rs], I, D) :-
    (  nth0(I, R, X)
    -> D = [X|Ds],
       I1 is I+1,
       diag(RS, I1, Ds)
    ;  D = []
    ).

这也适用于非平方矩阵。

are_same/1可以实现为:

are_same([]).
are_same([H|T]) :-
    maplist(==(H), T).

所以现在我们可以将它们组合为:

same_diag(M) :-
    diag(M, D),
    are_same(D).

因此,以上内容适用于“ 0×0矩阵”和非平方矩阵。