【发布时间】:2013-05-10 23:29:10
【问题描述】:
我正在尝试创建一个谓词,它接受两个向量/列表并使用第一个作为过滤器。例如:
?- 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 作为第二个元素,5 作为第四个元素等等。0s 被忽略,那就是“过滤”条件。
我从输入中知道的是 L1 和 L2 总是长度=8,只有 L1 有0s。
我的代码是:
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,或任何“返回”值。
有人可以帮我吗?,搞定了
新代码:
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).
预期行为示例:
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,2,3,4 开头的排列。 如果有人知道实现相同目标的更好方法,请分享,但我已经得到了我需要的东西 =)。
【问题讨论】:
-
我不明白发生了什么,但我添加了第 n 个谓词,但它缺少我添加的一些文本 O.o,你知道我的代码有什么问题吗?
-
第三个参数它只是一个计数器,我知道 V1 和 v2 的 lgenth 将始终为 8,并且基本情况在那里,它在过滤器之后,我只是将 0 更改为 1跨度>
标签: prolog