2014-01-07 81 views
-2

有人能给我一些关于Prolog的关键字/谓词的定义吗?某些关键字/谓词的定义

  • 分析时
  • bagof
  • findall
  • ^谓词
  • @
  • 谓词

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

有人可以给我这些谓词的含义和任何其他可能相当有用的意义,我对Prolog很有兴趣,但由于我的工作,我无法承担给Prolog太多的时间。我对Prolog有相当的了解,但是我似乎无法找出某些词的含义。

+0

参见'(^)/ 2':http://stackoverflow.com/questions/19931801/what-is-the-prolog-operator/19931970#19931970 – false

回答

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]. 


@

最常见的用途该符号的是在比较谓词的A<@B@</2@>/2等实施例的表达式和A>@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. 

使用@<你不一定必须使用parse_time,如果你想,只要他们的时间顺序如下ASCII字典顺序比较日期/时间字符串:

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

?- '2013-01-12' @< '2012-12-12'. 
false. 

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

+1

事实上,'@'/ 2是SWI和IF中的谓词(或者如果您喜欢控制构造)来操纵模块上下文。 – false

+0

谢谢@false我完全错过了。我花了太多时间在GNU Prolog上(尽管我努力在SWI中给出上面的例子)。 :) – lurker

+0

嗨@mbratch,你是怎么做的,例如在bagof(X,Y^likes(X,Y),L)列表中打印这个。 L = [a,a,a,b,b]? – KennD