【问题标题】:Can anyone help me in writing a prolog program for deleting a list?谁能帮我写一个删除列表的序言程序?
【发布时间】:2014-12-03 09:04:47
【问题描述】:

例如:如果给了我两个列表 [1,4,3,2,5,6] 和 [1,2,3],则最终列表应该是 [4,5,6]。

Del([1,4,3,2,5,6], [1,2,3], Result).
----应该输出Result=[4,5,6]。

我尝试过这样的事情:

 delete1(A, [A|B], B).
 delete1(A, [B, C|D], [B|E]) :- delete1(A, [C|D], E).

但我得到的输出是删除作为参数而不是列表传递的元素。

输出:

delete1(a,[a,b,c,d],Res).

   (0) Call: delete1(a,[a,b,c,d],_h210) ?
   (0) Exit: delete1(a,[a,b,c,d],[b,c,d]) ?

Res = [b,c,d]

谁能帮我解决这个问题?

【问题讨论】:

标签: list prolog sublist


【解决方案1】:

纯粹而简单:将 tfilter/3list_nonmember_t/3 一起使用!

就像我们对memberd_t/3 所做的那样,我们根据if_/3 and (=)/3 定义list_nonmember_t/3

list_nonmember_t([],_,true).
list_nonmember_t([E|Es],X,T) :-
   if_(E=X, T=false, list_nonmember_t(Es,X,T)).

让我们把它放在一起!

?- tfilter(list_nonmember_t([1,2,3]), [1,4,3,2,5,6], Xs).
Xs = [4,5,6].                         % succeeds deterministically

【讨论】:

    【解决方案2】:
    del1([], _, []).
    del1([A|L], B, R) :- member(A, B), del1(L, B, R).
    del1([A|L], B, [A|R]) :- not(member(A,B)), del1(L, B, R).
    

    【讨论】:

    • 谢谢亚当。但是您提供的程序会引发错误。这是输出:| ?- del1([1,2,3,4],[3,2],R)。 (0) 调用:del1([1,2,3,4],[3,2],_h226) ? (1) 调用:见(0) ? (1) 退出:见(0) ? (2) Call: default_error_handler(error(existence_error(procedure,usermod : member / 2),[],[[39947184,39952640,39952512,41346368,40949824,41346496,40028960,41354720,40680192,40679216,40072096,39940656,40628976 ,39956000,40072096,39940656]])) ?结束 XSB(cputime 0.02 秒,运行时间 26.96 秒)
    • 对于del1([1,2,4,5],[2,3],Res),输出应该是Res=[1,4,5]。
    【解决方案3】:

    所以你的delete1 是一个好的开始,它允许从列表中删除单个元素,但它不能处理所有情况。例如不包含要删除的元素的列表。 所以正确的是:

    delete1(_, [], []).
    delete1(A, [A|B], B).
    delete1(A, [C|B], [C|E]) :- delete1(A, B, E).
    

    然后使用它,您可以通过在整个列表上递归应用delete1 来定义您的del1

    del1([], _, []).
    del1(L, [], L).
    del1(L, [H|T], R) :- 
        delete1(H, L, R1),
        del1(R1, T, R).
    

    当然,您可以使用其他答案中所述的内置列表谓词。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      • 2022-01-03
      相关资源
      最近更新 更多