【问题标题】:Member predicate成员谓词
【发布时间】:2014-01-05 15:59:52
【问题描述】:

当您使用未实例化的列表调用member(Item, List) 时,Prolog 会统一并返回包含项目的列表。我想要一个返回true/false并且不尝试统一的规则。有这样的规定吗?

【问题讨论】:

    标签: prolog unification


    【解决方案1】:

    快速回答:使用\+ \+ member(Item, List)

    请注意,当您的程序表示逻辑关系时,此类测试通常没有多大意义。

    您说member(Item, List)“返回一个列表”。嗯,这并不完全正确。 List部分列表 统一,即 List = [Item|_Rest] ; List = [_,Item|_Rest] ; ..._Rest 是未实例化的变量。也就是说,目标member(Item, List) 并不能保证(成功后)List 是一个列表。这是一个反例:member(Item, List), List = [_|nonlist]

    【讨论】:

    • 谢谢! \+ 是什么意思?
    • @saadtaame: (\+)/1 - 无法证明
    【解决方案2】:

    我会使用警卫,比如

    is_member(E, L) :- nonvar(L), memberchk(E, L).
    

    memberchk/2 它是 member/2 的确定性版本,用于查找列表是否包含至少 1 次出现的元素。不能充当生成器,但它更有效。无论如何都需要守卫。

    【讨论】:

    • 根据 OP,is_member(E, L) 应该是真的,但是你的定义失败了。
    • @false: 好吧,你必须在 OP 问题中读到一些与我非常不同的东西。
    • 我读到 OP 的问题是想要一个谓词,如果给定一个实例化的 E 和未实例化的 L,它将返回 false,它会失败而不是返回 L 中包含 @987654328 的列表@。但是,他们似乎接受了这个答案,所以他们可能没有准确地说明他们的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 2011-04-16
    • 1970-01-01
    相关资源
    最近更新 更多