检查Prolog中的矩阵项

时间:2012-08-19 16:03:05

标签: matrix prolog

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

  1. 如果行上的所有矩阵元素都是奇数,则程序应添加到行1的末尾。
  2. 如果行中有一个或多个偶数程序应添加到行0的末尾。
  3. ?- 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(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]..
    

2 个答案:

答案 0 :(得分:2)

Prolog lambdas没问题!

:- use_module(library(lambda)).
:- use_module(library(clpfd)).

我们根据 maplist/3sum/3(#=)/2append/3来定义f/2

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   

答案 1 :(得分:0)

您可以这样做:

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将通过Rows计算(并添加)每行的最后一个元素。 第一个子句是结束递归的基本情况。第二个子句将调用辅助程序f/3,其中第一个参数将是要计算的行,第二个参数是最后一个元素的当前值,第三个参数将保存结果。

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

如果你注意到每当你在一行中看到偶数元素时就可以优化这个过程,那么就不需要继续f/3的递归,因为你知道最后一个元素将是0。但是,这种优化仍然是一种练习;)