首页 > 解决方案 > Prolog谓词帮助:从列表中删除N次

问题描述

问题:deleteNum(+Element, +List, -NewList, +NumToDelete)接受一个列表、一个元素以及要从List. NewList应该是原来的List减号NumToDelete Elements。元素的哪些实例被删除并不重要,也不应给出替代答案。例如,

例子:

?- deleteNum(3, [2,3,5,4,3,3], NewList, 2).
NewList = [2,5,4,3]

这是我尝试过的代码,但是当我尝试上面的示例时它一直返回 false。我不确定为什么。

deleteNum(_, [],[], 0).
deleteNum(X, [X|T], T, 0).
deleteNum(X, [H|T], [H|T1], Num):- 
     Num1 is Num - 1, 
     deleteNum(X, T, T1, Num1).

非常感谢您提前。

标签: listprolog

解决方案


您似乎将两种情况与此谓词混为一谈:

deleteNum(X, [H|T], [H|T1], Num):- 
     Num1 is Num - 1, 
     deleteNum(X, T, T1, Num1).

它还没有消除X,它仍然在减少Num

这里有几种方法可以做你想做的事:

deleteNum(_, L, L, 0).
deleteNum(X, [H|T], [H|T1], Num) :-
    X \= H,
    deleteNum(X, T, T1, Num).
    deleteNum(X, [X|T], T1, Num):- 
Num1 is Num - 1, 
    deleteNum(X, T, T1, Num1).

或者:

deleteNum(_, L, L, 0).
deleteNum(X, [X|T], T1, Num):- 
    !,
    Num1 is Num - 1, 
    deleteNum(X, T, T1, Num1).
deleteNum(X, [H|T], [H|T1], Num) :-
    deleteNum(X, T, T1, Num).

这取决于你喜!不喜欢。

两者都成功?- deleteNum(3, [2,3,5,4,3,3], NewList, 2), write(NewList), nl.并统一NewList[2, 5, 4, 3].

请记住,Prolog 不会返回任何内容。它只是成功或失败。在此过程中,它只是试图统一变量以取得成功。


推荐阅读