【问题标题】:Vector addition in prolog序言中的向量加法
【发布时间】:2010-02-03 18:23:47
【问题描述】:

我正在编写一个谓词来添加两个向量。这是我想出的:

add( [], [], 0 ).
add( [A], 0, A ).
add( [A], [B], C ) :- C is A + B.
add( A, B, C ) :- add( B, A, C ).
add( [H1|T1], [H2|T2], WYNIK ) :- X is H1 + H2, add( T1, T2, Y ), append( [X], Y, WYNIK ).

前四行工作正常,但我无法让最后一行工作 - 我做错了什么?

【问题讨论】:

    标签: prolog


    【解决方案1】:

    按此顺序,永远不会运行最后一行。行:

    add( A, B, C ) :- add( B, A, C ).
    

    将与上面的规则尚未处理的任何内容统一。

    【讨论】:

      【解决方案2】:

      正如 Jeff 观察到的,问题在于规则:

      添加(A,B,C):-添加(B,A,C)。

      一般来说,这条规则表达了您希望实现的某些东西,但这并不能帮助您实现目标。这条规则的查询add(1,2,X) 会导致子查询add(2,1,X),这会导致子查询add(1,2,X):SLD 解析可以永远花在这个分支上(如果它没有其他更高优先级的规则,并且它没有发现)规则没有取得进展)没有取得任何进展。您应该只使用带有条件(例如strictlylessthan (B,A))的规则,以确保该规则仅在它可以做有用的工作时才适用。这类规则的问题是 Prolog 不是真正的声明性语言的一个原因。

      要重新获得可交换性,您需要添加规则:

      添加(0,[A],A)。

      您的添加谓词有点奇怪:add([1],0,1) 是真的,add([1],[0],1) 也是如此,但 add([0],1,1) 不是,add([1],[0],[1]) 也不是。 add 从计算的角度来看是非常有意义的,但它真的是你想要的吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-03
        • 1970-01-01
        • 2012-08-14
        • 1970-01-01
        • 2014-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多