我试图做一个谓词,需要两个向量/列表,并使用第一个作为过滤器。例如:PROLOG列表过滤器谓词不是正确或错误
?- L1=[0,3,0,5,0,0,0,0],L2=[1,2,3,4,5,6,7,8],filter(L1,L2,1).
L1 = [0, 3, 0, 5, 0, 0, 0, 0],
L2 = [1, 2, 3, 4, 5, 6, 7, 8] .
这就是我得到,但我想true
或false
如果L2具有3
为0
s的忽略第二个元素,5
作为第四个元素,等等,这就是“过滤器“条件。 我从输入中得知,L1和L2总是长度= 8,只有L1有0
s。
我的代码是:
filter(_,_,9).
filter([Y|T],V2,Row):-
Y=:=0,
NewRow is Row + 1,
filter([Y|T],V2,NewRow).
filter([Y|T],V2,Row):-
Y=\=0,
nth(Row,[Y|T],X1),
nth(Row,V2,X2),
X1=:=X2,
NewRow is Row + 1,
filter([Y|T],V2,NewRow).
nth(1,[X|_],X).
nth(N,[_|T],R):- M is N-1, nth(M,T,R).
我知道有第一的第一个元素进行比较,以第二的第n个这样的功能的更好的方法,例如,删除第一个使用递归的头但我只想知道为什么我没有得到true
或false
或任何“返回”值。
有人可以帮助我?得到它的工作
新代码:
permutation([1,2,3,4,5,6,7,8],X),filter([1,2,3,4,0,0,0,0],X,1,R).
X = R, R = [1, 2, 3, 4, 5, 6, 7, 8] ;
X = R, R = [1, 2, 3, 4, 5, 6, 8, 7] ;
X = R, R = [1, 2, 3, 4, 5, 7, 6, 8] ;
X = R, R = [1, 2, 3, 4, 5, 7, 8, 6] .
现在我可以得到所有以1开头的排列:预期行为的
filter([],R,_,R).
filter([Y|T],V2,Row,R):-
Y=:=0,
NewRow is Row + 1,
filter(T,V2,NewRow,R).
filter([Y|T],V2,Row,R):-
Y=\=0,
nth(Row,V2,X2),
Y=:=X2,
NewRow is Row + 1,
filter(T,V2,NewRow,R).
例,2,3,4。 如果有人知道更好的方式来实现相同的PLZ份额,但我已经得到了我所需要的=)。
谢谢谁接受了两个“我”的编辑(第二个是在时间上发生冲突,与我第一次的OP编辑)审查人员 - 的别人,耻辱你! – pnuts 2013-05-11 00:19:37
我不明白发生了什么,但我添加了第n个谓词,但是它缺少一些文本,我添加了O.o,pnuts,你知道我的代码有什么问题吗? – 2013-05-11 00:32:16
对不起,我只是在帮助翻译,我知道ZILCH关于PROLOG(而且对其他方面很少)!如果您想进一步编辑,请随时取得。 – pnuts 2013-05-11 00:34:37