删除Prolog中的多个

删除Prolog中的多个,prolog,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). 它

我试着做这个练习,我应该构建一个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).  
它不起作用,我也不明白为什么。
我希望有人能向我解释为什么这不起作用。

谢谢

简短回答:第一个子句只有两个参数

removemplicates/3
进行递归调用:每次调用相同的谓词
removemplicates/3
。通过这种方式,您可以枚举两个列表。但最终你会到达列表的末尾

然而,第一个子句是关于
removemplicates/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).

如果使用SWI Prolog,则可以进行功能设计:

:-use_module(library('lambda.pl')).

removeMultiples(N, In, Out) :-
    exclude(N+\X^(X mod N =:= 0), In, Out).

“不起作用”没有提示问题,请更新您的问题以准确解释您的意思,例如,您是否遇到错误、代码是否失败、是否产生意外结果等?哦,哇。。。我盯着看了好几个小时,就是没明白,哈哈。非常感谢!
:-use_module(library('lambda.pl')).

removeMultiples(N, In, Out) :-
    exclude(N+\X^(X mod N =:= 0), In, Out).