【问题标题】:Prolog query issueProlog查询问题
【发布时间】:2013-06-13 21:29:18
【问题描述】:

好吧,假设我有这两个事实:

data1([50, 20, 15, 20, 25, 20, 84])。 data2([50, 30, 15, 5, 10, 18, 60]).

我想进行一个查询,询问定义为这些事实的一部分的列表的第 N 个元素是否是某个值。

query([L1|Tail]) :- L1 是 50。这会起作用,但前提是查询是这样的 - query([50, 30, 20]).. 我想要问类似 query(data1).

【问题讨论】:

    标签: prolog declarative


    【解决方案1】:

    CapelliC 的回答是正确的,他讨论了为什么应该使用内置的 nth/3 或者无论如何调用它(nth1/3 实际上不是 ISO,并且在某些实现中不可用,例如 GNU-Prolog)。我只是想补充一些说明:

    您在这里的第一个问题是要问一个问题,“列表的第 N 个元素是否具有特定值”,您已经需要两个参数:NValue。此外,is 是用于计算算术表达式的谓词,不能用于您的目的。

    至于query(data1),你需要某种形式的元调用......

    总结:

    % query(Fact, N, Value) is true
    % when the Nth element of the list argument of Fact is Value
    query(Fact, N, Value) :-
        call(Fact, List),
        nth(N, List, Value).
    

    可以这样调用:

    ?- query(data1, 3, 15).
    

    查询所有有一个参数的data1 事实,一个列表。

    这里nth应该定义为:

    当 Value 是 List 的第 N 个元素时,nth(N, List, Value) 为真

    但你真的应该使用你正在使用的实现中可用的内置函数。

    【讨论】:

      【解决方案2】:

      您可以使用nth1/3 按索引访问列表元素。

      请注意在文档中它被声明为nth1(?Index, ?List, ?Elem)。参数上的问号表示该参数可能未绑定。换句话说,nth1/3 可以以多种方式工作。

      获取索引处的元素(基于 1):

      ?- data1(L), nth1(2, L, V).
      L = [50, 20, 15, 20, 25, 20, 84],
      V = 20.
      

      或搜索元素所在的位置:

      ?- data1(L), nth1(P, L, 20).
      L = [50, 20, 15, 20, 25, 20, 84],
      P = 2 ;
      L = [50, 20, 15, 20, 25, 20, 84],
      P = 4 ;
      L = [50, 20, 15, 20, 25, 20, 84],
      P = 6 ;
      false.
      

      它尽可能普遍地工作,忠实于 Prolog 模型,我们没有函数,但有关系。

      nth1/3 它是列表元素和索引之间的关系。

      【讨论】:

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