【问题标题】:Remove Multiples in Prolog在 Prolog 中删除倍数
【发布时间】:2018-05-04 03:44:30
【问题描述】:

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


【解决方案1】:

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

您对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.

【讨论】:

  • 哦哇...我盯着看了好几个小时都没明白哈哈。非常感谢!
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多