Matrix 在Prolog中检查矩阵项
我需要编写一个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] ;
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