Matrix 在Prolog中检查矩阵项

Matrix 在Prolog中检查矩阵项,matrix,prolog,clpfd,meta-predicate,Matrix,Prolog,Clpfd,Meta Predicate,我需要编写一个Prolog谓词来检查: 如果行上的所有矩阵元素都是奇数,则程序应在行的末尾添加1 如果行中有1个或多个偶数,程序应在行的末尾添加0 这就是我现在拥有的: f([],[]). f(matrix,Xss). f([Xs|T],Xss):- Xs=[X|T2], (X mod 2 =:= 0 -> add2end(0,[X|T2],[X|Result]):- add2end(0,T2, Result), add2end(0,[],[0]), Xss=[Xs|T] ;

我需要编写一个Prolog谓词来检查:

  • 如果行上的所有矩阵元素都是奇数,则程序应在行的末尾添加
    1
  • 如果行中有1个或多个偶数,程序应在行的末尾添加
    0
  • 这就是我现在拥有的:

    f([],[]).
    f(matrix,Xss).
    f([Xs|T],Xss):-
        Xs=[X|T2],
    (X mod 2 =:= 0 ->
    add2end(0,[X|T2],[X|Result]):-
    add2end(0,T2, Result),
    add2end(0,[],[0]), Xss=[Xs|T] ;
       add2end(1,[X|T2],[X|Result]):-
    add2end(1,T2,Result),
        add2end(1,[],[1])), Xss=[Xs|T]..
    

    您可以这样做:

    f([], []).
    f([Row|Matrix], [NRow|NMatrix]):-
      f(Row, 1, NRow),
      f(Matrix, NMatrix).
    
    f([], LastElem, [LastElem]).
    f([Elem|Row], CurLastElem, [Elem|NRow]):-
      Elem mod 2 =:= 0 -> f(Row, 0, NRow) ; f(Row, CurLastElem, NRow).
    
    过程
    f/2
    将在行上递归,计算(并添加)每行的最后一个元素。 第一个子句是结束递归的基本情况。第二个子句将调用一个helper过程
    f/3
    ,其中第一个参数是要计算的行,第二个参数是最后一个元素的当前值,第三个参数将保存结果

    辅助程序
    f/3
    的第一个子句处理每行的基本情况。它会将当前LastElement添加到行中。 第二个子句测试行首,看它是偶数还是奇数。如果是偶数,则当前LastElement设置为零,并继续递归。如果元素为奇数,则它将继续递归,保持当前LastElement不变

    如果您注意到,每当您在一行中看到偶数元素时,实际上不需要继续递归
    f/3
    ,因为您知道最后一个元素将是0。。。但这种优化只是一种练习;)

    和没有问题

    我们根据、和定义了
    f/2

    示例查询:

    ?- f([[1,2,3],[5,5,5],[4,4,4]], Xss). Xss = [[1,2,3,0], [5,5,5,1], [4,4,4,0]]. % succeeds deterministically ?-f([1,2,3],[5,5,5],[4,4,4]],Xss)。 Xss=[[1,2,3,0],[5,5,5,1],[4,4,4,0].%决定性地成功
    我在代码编写方面有问题…我在代码编写方面有问题。。。我知道我应该有f([矩阵],[结果])。f([矩阵头|矩阵尾],[结果])。取一个矩阵头,从矩阵的第一个列表(行)中取第一个元素[第一个元素| 1行的另一个元素],并检查它是偶数还是非偶数(第一个元素):-第一个元素mod 2=0。如果是真的,我应该在列表add的末尾添加0([first element | Other elements of..],0,[first element | new tail]):-add(另一个el,0,new tail)。添加([],第一个元素,[第一个元素])。但我不知道这些东西是怎么用代码写的。
    :- use_module(library(lambda)).
    :- use_module(library(clpfd)).
    
    f(Xss,Yss) :-
       maplist(\Xs^Ys^(sum(Xs,#=,S),P #= S mod 2,append(Xs,[P],Ys)), Xss, Yss).
    
    ?- f([[1,2,3],[5,5,5],[4,4,4]], Xss). Xss = [[1,2,3,0], [5,5,5,1], [4,4,4,0]]. % succeeds deterministically