2017-09-23 33 views
1

我试图做这个练习,我应该建立一个prolog程序,当给定一个数字和一个列表时,返回一个没有数字倍数的列表。现在我做了这个:在Prolog中删除倍数

removeMultiples([],[]). 
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). 

它不起作用,我真的不明白为什么。
我希望有人能解释为什么这不起作用。
谢谢

+0

“不起作用“不会让我们指出问题,请更新您的问题以准确解释您的意思,例如你是否遇到错误,代码是否失败,是否给出了意想不到的结果等? – FluffyKitten

回答

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

哦哇......我盯着几个小时,只是没有得到它哈哈。非常感谢! – Melanie

2

如果使用SWI-Prolog的,你可以有一个functionnal设计:

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

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