【问题标题】:Declarative interpretation of this program that says if an element belongs to a list该程序的声明式解释,说明元素是否属于列表
【发布时间】:2013-03-18 15:57:05
【问题描述】:

根据我的理解,声明式范式指出了解决方案的重要性,而不是解决方案的方式,但是,习惯于按程序思考,我经常混淆......

所以解决方案是这样的:

mymember(X, [X|_]).
mymember(X,[_|T]) :- mymember(X,T).

这是我对这个简单程序的声明性解释:

1) X 属于该列表,如果 X 是该列表的头部为 TRUE(如果列表的头部元素统一与该列表的 X 元素我会知道是否在列表中)

2) 如果第一个事实不成立(X 不与第一个列表元素统一),程序会尝试执行第二个规则(也许在这里我有一些解释问题)。这条规则说:如果规则的主体为真,则头部为真)

规则的负责人说:X属于列表的TAIL(我使用匿名变量使用_字符表示不关心列表的第一个元素)

所以这条规则说:如果 X 元素属于列表的尾部为 TRUE,则 X 元素属于没有头部的列表为 TRUE

这是对该程序的正确声明和逻辑解释还是我遗漏了什么?

【问题讨论】:

    标签: list prolog declarative


    【解决方案1】:

    您将它们理解为 exclusive-or,但它们实际上是 inclusive-or。 1) 和 2) 都是正确的,减去连接词“如果第一个事实不正确”。对于 2) 保持,1) 没有必要为假。换句话说,X 可能既是列表的头部又出现在列表的尾部(例如 mymember(a, [a, b, a])

    编辑:回复您的评论。

    这里有一个语言障碍问题,所以让我试着用是和否来回答你的问题。

    是的,使用; 产生另一个答案是 Prolog 能够计算替代答案的证据。在某种意义上,; 会手动触发回溯,但在另一种意义上,Prolog 会询问您这是否是您想要的答案,然后您可以说“是”或“否”。当你说; 时,你实际上是在告诉 Prolog,“这不是正确的答案”。但这并不是触发回溯的唯一方式;事实上,大多数时候你根本不会手动触发它。

    例如,让我们看看这个:

    even_member(X, L) :- member(X, L), 0 is X mod 2.
    
    ?- even_member(X, [1,5,17,23,4,19]).
    X = 4 ;
    false.
    

    所以在这里我定义了一个谓词,声明式地说,如果 X 是 L 的成员并且 X mod 2 = 0,则 X 是 L 的 even_member。当我使用谓词时,我们得到了答案 X = 4。然后我们按; 说,这不是正确的答案,Prolog 说没有更多的答案。但是在内部,member(X, L) 在找到满足谓词第二部分的元素之前回溯了 5 次——换句话说,语句 0 is X mod 2 告诉 Prolog 1、5、17 和 23 是“错误的”与我们以交互方式按下; 的方式相同。当我们说我们想要另一个答案时,我们使用了相同的机器,所以 Prolog 回到 member(X, L),找到 19,然后发现 19 不能被 2 整除并放弃。

    Prolog 回溯了六次,其中五次只是为了得到一个答案。我们只要求它回溯一次,碰巧这是最后的可能性,所以它没有再次回溯。

    【讨论】:

    • 好的,如果我有类似 mymember(a, [a,b,a]) 的东西,我必须使用 ; Prolog 控制台中的角色进行回溯并探索另一个计算分支……是真的吗?你是这个意思吗? Tnx
    • 我在答案中添加了一些讨论。如果还不清楚,请告诉我。
    【解决方案2】:

    让我试试:

    mymember(X, [X|_]).
    

    如果 X 是列表的第一个元素,则它是列表的成员

    mymember(X,[_|T]) :- mymember(X,T).
    

    如果 X 是列表其余部分的成员,则它是列表的成员。

    假设我给你一堆(纸质)程序员简历,然后说“看看这里面有没有懂 Prolog 的程序员”

    你是做什么的?你看看最上面的简历。如果那个程序员知道 Prolog,你就完了。

    如果不是,那么只有在堆栈的其余部分中才能有这样的简历。

    【讨论】:

      【解决方案3】:

      第 2) 点不成立:Prolog 将尝试 每个 规则搜索解决方案。

      但它会按照严格指定的顺序在您的数据库中搜索,从而对解决方案空间进行深度优先搜索。

      我会读

      如果 X 是第一个元素(即统一头部,第 1 条),或者是尾部的成员(第 2 条),则 X 是列表的成员。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-16
        • 1970-01-01
        • 1970-01-01
        • 2011-03-06
        • 2013-07-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多