我是一名长期的python开发人员,最近已被介绍给Prolog.我喜欢为某些类型的任务使用关系规则的概念,并希望将其添加到我的保留曲目中.
在Python中有没有适合逻辑编程的好库?我在谷歌上做了一些搜索,但只发现了以下内容:
关于relational_python的jtauber博客系列
很想和其他人比较......谢谢!
-AJ
如何编写map(List, PredName, Result)将谓词应用于PredName(Arg, Res)元素的Prolog过程,并将List结果返回到列表中Result?
例如:
test(N,R) :- R is N*N.
?- map([3,5,-2], test, L).
L = [9,25,4] ;
no
Run Code Online (Sandbox Code Playgroud) 我面临的问题有点微不足道.我想在Prolog中使用逻辑,但似乎not/1不是我想要的东西:
course(ai).
course(pl).
course(os).
have(X,Y) :- course(X),course(Y),not(X = Y).
Run Code Online (Sandbox Code Playgroud)
我查询:
have(X,Y), write(X-Y), nl , fail.
Run Code Online (Sandbox Code Playgroud)
我没有得到我想要的结果:(
现在,因为我3年前在AI上课,我非常熟练地提出这个问题......开个玩笑只是开玩笑;)
但严重的是,这些语言是什么使它们如此受人工智能研究的欢迎.即使人工智能研究"老"......它可能是过去5到10年中最长的方式......似乎是因为这些语言在某种程度上"设计"了人工智能的概念,或者仅仅是我们现在没什么好用的?
我问这个是因为我总觉得它非常有趣,我只是有点好奇.如果我完全错了,他们使用不同的语言,我很想知道他们使用的是什么.我的意思是我可以理解prolog,尤其是Sentient/Propositional Logic和Fuzzy逻辑.但我不明白"为什么"我们会使用Lisp ...甚至AI研究人员用来做机器学习等的其他内容.
关于主题的任何文章/书籍也是有帮助的:)
different(Xs, Ys) :-
member(X, Xs),
non_member(X, Ys).
different(Xs, Ys) :-
member(Y, Ys),
non_member(Y, Xs).
Run Code Online (Sandbox Code Playgroud)
虽然这个定义使用member/2和non_member/2几乎是1从声明的观点完美的,它产生于特定查询的冗余解决方案,并选择留点周围.
什么是改进的定义(以纯粹的方式可能使用if_/3和(=)/3),使得完全相同的解决方案集被描述different/2但至少对于地面查询是确定的(因此不会留下任何无用的选择点)并且省略(如有可能)任何多余的答案?
1
实际上,different([a|nonlist],[]), different([],[b|nonlist])成功了.它同样可能失败.所以两者都失败的解决方案很好(甚至可能更精细).
我需要开始为我的工作学习Prolog.
我之前没有使用Prolog,我的公司需要构建一个使用Prolog的程序.
因此该程序将在商业上使用.
所以有些问题:
1)Prolog是否使用编译器来编译程序.像gcc一样用于c?
2)Prolog有商业标准吗?我只听说过SWI Prolog.
3)我已经在Linux上使用GNU Emacs多年了.我在考虑使用Prolog.el包吗?对此有何评论?
非常感谢任何答案,
我想了解更多有关Prolog内部的知识,并了解其工作原理.
我知道如何使用它.但不是内部如何运作.Prolog中使用的算法和概念的名称是什么?
可能它构建了某种树结构或有向对象图,然后在查询时,它使用复杂的算法遍历该图.可能是深度优先搜索.可能有一些源代码,但首先从高层次的角度来看它会很棒.
我真的很喜欢人工智能,理解Prolog似乎是一个很好的开始,imho.我的想法是尝试重建类似的东西并完全跳过解析器部分.我需要知道我必须做的研究工作的方向.
标准术语顺序(ISO/IEC 13211-1 7.2术语顺序)是在所有术语(包括变量)上定义的.虽然有很好的用途 - 想想实现setof/3,但这使得许多其他清洁和逻辑用途的内置插件在8.4 Term比较中声明性的噩梦与imps(命令式构造的简短形式)四处都有.8.4术语比较功能:
8.4术语比较
8.4.1(@ = <)/ 2,(==)/ 2,(\ ==)/ 2,(@ <)/ 2,(@>)/ 2,(@> =)/ 2.
8.4.2比较/ 3.
8.4.3 sort/2.
8.4.4 keysort/2.
举个例子,考虑一下:
?- X @< a.
true.
Run Code Online (Sandbox Code Playgroud)
这成功了,因为
7.2期限订单
命令term_precedes(3.181)定义
术语X术语是否在术语之前Y.如果
X且Y是相同的术语,则Xterm_precedesY
和Yterm_precedesX都是假的.如果
X和Y有不同的类型:Xterm_precedesY当且仅当该
类型X先于类型Y按以下顺序:
variable先floating point先于integer
先 …
我有兴趣与prolog一起玩和fuxing,我已经安装了swi-prolog并添加了存储库,以防万一有人对我使用的哪个命令感兴趣:
% sudo apt-add-repository ppa:swi-prolog/stable
% sudo apt-get update
% sudo apt-get install swi-prolog
Run Code Online (Sandbox Code Playgroud)
我如何开始在我的linux机器上编写prolog代码?对于我的常规编程,我使用VIM编写/编辑/调试和终端编译.我可以用vim写prolog吗?我如何编译或使用prolog解释器(我认为这就是所谓的)?
我的SWI-Prolog知识库包含以下两个事实:
f(a,b).
f(a,c).
Run Code Online (Sandbox Code Playgroud)
现在,如果我提出查询
?- f(a,c).
true.
Run Code Online (Sandbox Code Playgroud)
但
?- f(a,b).
true ;
false.
Run Code Online (Sandbox Code Playgroud)
为什么f(a,b)既真又假?当KB中有三个事实时,也会发生这种情况.如果我追加f(a,d).到KB,然后f(a,d)为真(仅),但f(a,b)和f(a,c)都是真和假.发生了什么,我能做些什么让Prolog回答(仅)回答这些问题?
prolog ×10
prolog-dif ×3
swi-prolog ×2
iso-prolog ×1
linux ×1
lisp ×1
map-function ×1
python ×1
sorting ×1
ubuntu ×1