我需要写一个Prolog谓词来检查:
1
的末尾。0
的末尾。?- 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]..
答案 0 :(得分:2)
clpfd和Prolog lambdas没问题!
:- use_module(library(lambda)).
:- use_module(library(clpfd)).
我们根据meta-predicate maplist/3
,sum/3
,(#=)/2
和append/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。但是,这种优化仍然是一种练习;)