【问题标题】:swi prolog unified return elements in listswi prolog统一返回列表中的元素
【发布时间】:2014-02-03 07:12:53
【问题描述】:

我想返回列表中的所有元素,如下面的 X 中的结果

?return_list_members([1,2,3,4,5], X).
X = 1 ;
X = 2 ;
X = 3 ;
X = 4 ;
X = 5.

我有以下代码,但它也返回空列表元素 [] 女巫 不可取

return_member(X, X).
return_list_members([], []).
return_list_members([H|T], X) :- return_member(H, X); return_list_members(T, X).

询问时输出

?return_list_members([1,2,3,4,5], X).
X = 1 ;
X = 2 ;
X = 3 ;
X = 4 ;
X = 5 ;
X = [].

最后的 true 或 false 值也是不可取的。

目标是实现一个函数,输出类似于/3之间的内置函数,以便在foreach语句中使用

【问题讨论】:

    标签: prolog logic


    【解决方案1】:

    请注意,您尝试编写的过程是内置谓词 member/2。

    ?- member(X, [1,2,3,4,5]).
    X = 1 ;
    X = 2 ;
    X = 3 ;
    X = 4 ;
    X = 5.
    

    您也可以编写自己的定义,例如:

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

    如果你不希望解释器最后返回'false',你可以在开头添加另一个子句(作为第一个子句):

    return_list_members([X], X):- !.
    

    但是请注意,如果您在第一个参数未实例化的情况下调用此过程,则此子句将产生副作用。

    【讨论】:

    • 我不知道会员有这种能力,尽管这两个答案都非常有帮助,因为我必须执行与此类似的其他例程。
    • 而不是您使用cut/0,请参阅this question 以在最后一个元素上实现确定性。它是 swi 中使用的,不会破坏任何行为。
    • @mog:这是 SWI 的成员实现,OP 应该使用;并且该谓词中的确定性只是一个技巧(我怀疑它是否适用于每个 prolog 实现)
    【解决方案2】:

    我试着写在_/3之间:

    between_(X, X, X) :-
        !.
    between_(X, Y, X) :-
        X < Y.
    between_(X, Y, N) :-
        X < Y,
        T is X + 1,
        between_(T, Y, N).
    

    第一个子句需要避免最后的错误(正如 gusbro 已经注意到的那样)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多