我试图做这个练习,我应该建立一个prolog程序,当给出一个数字和一个列表时,返回一个没有数字的倍数的列表。现在我已经做到了:
rm([],[]).
rm(N, [Head|Tail], Result):-
Head mod N =:= 0,
rm(N, Tail, Result).
rm(N, [Head|Tail], [Head|Result]):-
Head mod N =\= 0,
rm(N, Tail, Result).
它不起作用,我不明白为什么 我希望有人可以解释为什么这不起作用 感谢
答案 0 :(得分:3)
简答:第一个子句只有两个参数。
您在removeMultiples/3
上进行递归调用:每次调用相同的谓词removeMultiples/3
时。这样,您可以枚举两个列表。但最终你会到达列表的末尾。
然而,第一个条款是关于removeMultiples/2
谓词。所以你需要添加第三个参数:
removeMultiples(_,[],[]). % three arguments
removeMultiples(N, [Head|Tail], Result):-
Head mod N =:= 0,
removeMultiples(N, Tail, Result).
removeMultiples(N, [Head|Tail], [Head|Result]):-
Head mod N =\= 0,
removeMultiples(N, Tail, Result).
现在它产生:
?- removeMultiples(3, [1,2,3,4,6,7,8,9,15,3,1], Result).
Result = [1, 2, 4, 7, 8, 1] ;
false.
答案 1 :(得分:2)
如果您使用SWI-Prolog,您可以使用功能设计:
:-use_module(library('lambda.pl')).
removeMultiples(N, In, Out) :-
exclude(N+\X^(X mod N =:= 0), In, Out).