删除Prolog中的倍数

时间:2017-09-23 14:49:25

标签: prolog

我试图做这个练习,我应该建立一个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).  

它不起作用,我不明白为什么 我希望有人可以解释为什么这不起作用 感谢

2 个答案:

答案 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).