【问题标题】:Correctly building up a list in Prolog在 Prolog 中正确建立一个列表
【发布时间】:2013-06-01 22:45:24
【问题描述】:

我正在尝试编写一个谓词来从 Prolog 中的有序列表中删除元素。这是家庭作业的一部分,我对 Prolog 的语义一般如何工作感到非常困惑。

当我以rdup([1,2], L). 为目标尝试以下功能时,我得到false。我已经追踪了目标,看起来我不应该像我通过递归调用 rdup 来构建结果列表那样构建结果列表。我不确定我应该如何建立结果列表。函数如下:

rdup([],M).
rdup([X],[X]).
rdup([H1,H2|T], M) :- H1 \= H2, rdup(T, [M,H1,H2]).
rdup([H1,_|T], M) :- rdup(T, [M,H1]).

谁能告诉我我的推理哪里错了,或者应该如何在 Prolog 中递归地建立一个列表?

【问题讨论】:

    标签: list recursion prolog


    【解决方案1】:

    首先,它是不是功能。 它是谓词,他们只说,什么是真的,什么不是,以及在什么条件下。

    这是你的程序:

    rdup([],[]).
    rdup([X],[X]).
    rdup([H,H|T], M) :- rdup([H|T], M).
    rdup([H1,H2|T], [H1|M]) :- H1 \= H2, rdup([H2|T], M).
    

    现在稍微解释一下。

    首先,“rdup(X,Y)”是什么意思?它不是说“在 X 中获取有序列表,并在 Y 中放置不重复的列表 X”,而是说“如果 Y 是没有重复的列表 X,假设 X 是有序列表,这个事实将是正确的”。请注意,我们不谈论“返回值”之类的东西。

    第一行说,空列表是一个没有空列表重复的列表。很明显吧?

    下一行基本相同,但只有一个元素。

    第三行说,如果我们有一个列表,它由两个相同的元素 H 和尾 T 组成,那么这个列表的有序列表 ([H,H|T]) 是相同的,因为只有一个元素 H。这就是为什么我们在两个谓词中都有未修改的“M”。

    我希望你自己分析最后一个谓词,Prolog 并不像看起来那么难。祝你好运!

    【讨论】:

    • 如果你使用dif/2而不是(\=)/2,你会得到一个更通用的程序,它也可以用来正确回答?- rdup([X,Y,Z], Ls).这样的查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多