【问题标题】:Definitions of some keywords/predicates [closed]一些关键字/谓词的定义[关闭]
【发布时间】:2014-01-24 18:10:25
【问题描述】:

有人可以给我一些 Prolog 中的关键字/谓词的定义吗?

  • 解析时间
  • bagof
  • findall
  • ^ 谓词
  • @ 谓词

例如,bagof(X, Y^place(X, Y , japan), Xs)A<@B, A>@B.

谁能告诉我这些谓词的含义以及任何其他可能非常有用的东西,我对 Prolog 很感兴趣,但由于我的工作,我不能给 Prolog 太多时间。我对 Prolog 有很好的了解,但我似乎无法找出某些单词的含义。

【问题讨论】:

标签: prolog


【解决方案1】:

您需要的一切似乎都有很好的文档记录,例如对于 GNU-Prolog:

还有parse_time in SWI-Prolog documentation

【讨论】:

    【解决方案2】:

    查看@jkbkot 提供的链接以获取完整描述。通过非常简短和非常狭窄的例子:


    parse_time(注意拼写 - SWI Prolog 谓词)
    ?- parse_time('Fri, 08 Dec 2006 15:29:44 GMT', Format, Time).
    Format = rfc_1123,
    Time = 1165591784.0.
    
    ?- parse_time('2013-10-12', Format, Time).
    Format = iso_8601,
    Time = 1381536000.0.
    

    使用它,您可以获得日期/时间的数字表示并以数字方式管理它们。日期字符串是必需的输入参数(必须实例化)。因此,很遗憾,parse_time 对于来回转换格式没有用处。

    ?- parse_time(D, iso_8601, 1381536000.0).
    ERROR: atom_codes/2: Arguments are not sufficiently instantiated
    


    bagof^
    likes(a,b).
    likes(a,c).
    likes(a,d).
    likes(b,c).
    likes(b,e).
    
    ?- bagof(X, likes(X,Y), L).
    Y = b,
    L = [a] ;
    Y = c,
    L = [a, b] ;
    Y = d,
    L = [a] ;
    Y = e,
    L = [b].
    
    ?- bagof(X, Y^likes(X,Y), L).
    L = [a, a, a, b, b]
    
    ?- bagof(X-Y, likes(X,Y), L).
    L = [a-b, a-c, a-d, b-c, b-e].
    
    ?- setof(X, Y^likes(X,Y), L).   % provides the unique, sorted results
    L = [a, b]
    
    ?- setof(X-Y, likes(X,Y), L).
    L = [a-b, a-c, a-d, b-c, b-e].
    


    findall
    likes(a,b).
    likes(a,c).
    likes(a,d).
    likes(b,c).
    likes(b,e).
    
    ?- findall(X, likes(X,Y), L).
    L = [a, a, a, b, b].
    
    ?- findall(X-Y, likes(X,Y), L).
    L = [a-b, a-c, a-d, b-c, b-e].
    


    @

    这个符号最常用于比较谓词@</2@>/2等。A<@BA>@B的示例表达式是Prolog语法错误。

    ?- 1 < 2.
    true.
    
    ?- X=1, Y=2, X+Y<5.
    true.
    
    ?- a < b.
    ERROR: </2: Arithmetic: `a/0' is not a function
    
    ?- a @< b.
    true.
    
    ?- a @> b.
    false.
    
    ?- a < 1.
    false.
    
    ?- [2,3,4] @< [2,3,5].
    true.
    
    ?- [2,3,4] @< [2,3,3].
    false.
    
    ?- foo(a,X) @< foo(b,Y).
    true.
    
    ?- foo(b,X) @< foo(a,Y).
    false.
    

    使用@&lt;,如果您想比较日期/时间字符串,则不必使用parse_time,只要它们的时间顺序遵循ASCII字典顺序即可:

    ?- '2013-11-09' @< '2013-12-01'.
    true.
    
    ?- '2013-01-12' @< '2012-12-12'.
    false.
    

    @ 比较谓词非常方便。 :)

    【讨论】:

    • 事实上,@/2 是 SWI 和 IF 中用于操作模块上下文的谓词(或者如果您喜欢控制构造)。
    • 谢谢@false 我完全错过了。我在 GNU Prolog 上花了太多时间(尽管我努力在 SWI 中给出上面的例子)。 :)
    • 嗨@mbratch,例如,您是如何将其打印在列表 bagof(X, Y^likes(X,Y), L) 中的。 L = [a, a, a, b, b]?
    • @KennD 这就是它的工作原理。你试过了吗?
    • @mbratch,对不起,我想问的是,如何为列表创建规则?不使用 bagof 或 findall 等内置函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多