验证元素是否存在于 ProLog 中的矩阵中

Verify if an element is present in a matrix in ProLog

大家晚安,

我正忙着为我的逻辑编程类交付一个小项目,其中的主题是基于矩阵的操作。

好吧,其中一个被要求的操作是验证给定矩阵中是否存在某个元素,我遇到了一些问题,因为我通常对命令式编程有自己的想法。

目前,我达到了这个:

isElemPresent(_, []) :- !.
isElemPresent(Elem, [M|Mt]) :- isElemPresent(Elem,Mt) ; isElemPresentRow(Elem,M).
isElemPresentRow(Elem, [Elem|_]).
isElemPresentRow(Elem, [_|T]) :- isElemPresentRow(Elem, T).

如果有人能指导我实现目标,并尽可能告诉我代码中缺少什么,我将不胜感激。

% The element belongs to the list if it matches
% the head of the list

isElemPresent(X,[X|_]).


% The element belongs to the list if it is 
% in the head (another array) of the list.

isElemPresent(X,[A|_]):- isElemPresent(X,A).


% The element belongs to the list if it is
% in the queue of the list.

isElemPresent(X,[_|R]):- isElemPresent(X,R).

例如:

?- isElemPresent(4,[[1,2,5],[6,3,4]]).

Yes
is_elem_present(Elem, Matrix) :-
    member(Row, Matrix),
    member(Elem, Row).

?- is_elem_present(Elem, [[1,2,5],[6,3,4]]).
Elem = 1 ;
Elem = 2 ;
Elem = 5 ;
Elem = 6 ;
Elem = 3 ;
Elem = 4.

?- is_elem_present(2, [[1,2,5],[6,3,4]]).
true ;
false.

下面是如何使用索引:

is_elem_present(I, J, Elem, Matrix) :-
    nth0(I, Matrix, Row),
    nth0(J, Row, Elem).
?- forall(is_elem_present(I,J,Elem,[[1,2,5],[6,3,4]]), writeln([I,J]=Elem)).
[0,0]=1
[0,1]=2
[0,2]=5
[1,0]=6
[1,1]=3
[1,2]=4
true.