Prolog语言知识推理系列文章,不同编程语言有着不同编程视角,JAVA是面向对象,Nodejs是异步回调,R语言是统计算法,Prolog就是知识推理。每种语言都是独特的,如果想把一门语言学好用好,关键是利用语言的特点,做对的事情。
本系列文章主要介绍Prolog语言,从入门安装到知识推理。Prolog是完全不一样的,他没有复杂的程序结构,也不是为了解决算法问题,而是专注于逻辑推理,擅长解决抽象的问题。
关于作者:
- 张丹,分析师/程序员/Quant: R,Java,Nodejs
- blog: http://fens.me
- email: bsspirit@gmail.com
转载请注明出处:
http://blog.fens.me/prolog-packages/
前言
继续尝试使用prolog语言,本文将主要介绍prolog的包管理器。我们在使用prolog来编程的时候,避免不了会用到第三方的软件包,比如文件操作包,数据库包,http请求包,数据解析包,算法包等。所以,掌握包的安装,查看,加载,卸载都是必须的基本操作能力。
目录
- prolog包管理器
- 包管理的函数使用
1. prolog包管理器
每种编程语言,在启动时内核不可能加载所有的东西,就需要通过模块化的组织方式,把不同的组件进行分步加载。有些模块是官方提供的,有些模块需要有各种第三方包的支持。那么就需要对各种第三方进行统一的管理,允许开发人员方便地使用这些第三方包。
这样子就涉及到,软件包管理的各种使用和操作,包括本地已安装包的管理,远程软件包仓库的查询,软件包的安装,软件包的下载,软件的依赖管理等等操作。
prolog提供了软件包管理的功能,通过prolog_pack.pl的文件接口进行实现。在prolog_pack.pl中提供了多种函数,来帮助用户实现软件的安装使用的过程,可以参考官方介绍 https://www.swi-prolog.org/pldoc/doc/_SWI_/library/prolog_pack.pl
该库(prolog_pack)提供了使您可以检查已安装的软件包,安装软件包,删除软件包等。它由内置的attach_packs补充,该附件使已安装的软件包可用作库。也可以通过运行doc_browser. 函数在查询。
% 启动prolog运行环境
~ swipl
% 查看软件包管理器
?- doc_browser.
% Started server at http://localhost:64976/pldoc/
true
会自动打开下面网页。
当然,我们更多地是使用交互函数,来对软件包进行管理。
2. 包管理的函数使用
对于包管理器的使用方法,我们有常用的5个操作,查看软件包列表pack_list函数,查看本地已安装软件包pack_list_installed函数,查看本地已安装软件包详细信息pack_info函数,安装软件包pack_install函数,卸载软件包pack_remove函数。
2.1 查看软件包列表pack_list函数
pack_list(+Query)函数,查询所有的软件包服务器,Query不区分大小写地匹配已知和已安装软件包的名称和标题,同pack_search(+Query)函数。
对于每个匹配的软件包,将显示一行。每一行的第一个字母表示,软件包安装状态:
- p:本地未安装软件包
- i:本地已安装的软件包,与公开发布的最新版本一致
- U:本地已安装的软件包,不是最新版本可以升级
- A:本地已安装的软件包,比公开发布的更新
- l:本地已安装的软件包,不在公开的服务器上
函数执行,下面会列出所有官方公开的软件包。截止到2021年1月11日,共有326个包。
3 ?- pack_list("").
% Contacting server at https://www.swi-prolog.org/pack/query ... ok
p achelois@0.5.0 - Collection of tools to make writing scripts in Prolog easier.
p aleph@5 - Aleph Inductive Logic Programming system
p amazon_api@0.0.3 - Interface to Amazon APIs
p ansi_termx@0.0.1 - ANSI terminal operations
p ape@6.7.0 - Parser for Attempto Controlled English (ACE)
p app@0.1 - Prolog Application Server
p arouter@1.1.1 - Alternative HTTP path router
p assertions@0.0.1 - Ciao Assertions Reader for SWI-Prolog
p atom_feed@0.2.0 - Parse Atom and RSS feeds
p auc@1.0 - Library for computing Areas Under the Receiving Operating Charactersitics and Precision Recall curves
p b_real@0.5 - Interface predicates to commonly used R functions.
p bddem@4.3.1 - A library for manipulating Binary Decision Diagrams
p bencode@0.0.1 - Bencoding from BitTorrent protocol
p bibtex@0.1.8 - Parser and predicates for BibTeX files
.. 省略
pack_list函数,也执行模糊匹配查询,查询包含db的包。
4 ?- pack_list("db").
% Contacting server at https://www.swi-prolog.org/pack/query ... ok
p bio_db@3.2 - Access, use and manage big, biological datasets.
p bio_db_repo@20.9.14 - Data package for bio_db.
i chess_db@0.3 - PGN and chess game databases.
p db_facts@0.5 - Common db-tables-as-facts and SQL layer for ODBC and proSQLite.
p fld@0.1.0 - Easy assess to term args when loading from ODBC or CSV.
p pl_omdb@0.5.0 - API interface to OMDB (Open Movie Database)
p rocksdb@0.8.0 - SWI-Prolog interface to RocksDB
true.
2.2 查看本地已安装软件包pack_list_installed函数
只查看本地已安装包pack_list_installed(),与pack_list/1不同,仅显示本地安装的软件包,并且不建立与Internet的连接。
8 ?- pack_list_installed.
Installed packages (2):
i chess_db@0.3 - PGN and chess game databases.
i real@2.1 - Integrative statistics with R
true.
我当前本地只安装了2个包,分为是chess_db和real,都是公开发布的最新版本。
2.3 查看本地已安装软件包详细信息pack_info函数
pack_info(+ Pack),查看本地已安装软件包的详细信息。
?- pack_info(chess_db).
Package: chess_db
Title: PGN and chess game databases.
Installed version: 0.3
Installed in directory: c:/programdata/swi-prolog/pack/chess_db
Author: Nicos Angelopoulos <http://stoics.org.uk/~nicos>
Maintainer: Nicos Angelopoulos <http://stoics.org.uk/~nicos>
Packager: Nicos Angelopoulos <http://stoics.org.uk/~nicos>
Home page: http://stoics.org.uk/~nicos/sware/chess_db
Download URL: http://stoics.org.uk/~nicos/sware/packs/chess_db/chess_db-*.tgz
Provided libraries: chess_db
true.
如果本地没有安装,查看时则失败。
18 ?- pack_info(xsd).
Warning: No pack xsd installed. Use ?- pack_list(Pattern) to search
false.
提示本地没有安装,先用pack_list()查看一下,是否有这个包。
2.4 安装软件包pack_install函数
pack_install(+Name),安装软件包,先来安装一下xsd包。
?- pack_install(xsd).
% Contacting server at https://www.swi-prolog.org/pack/query ... ok
% Pack `xsd' is already installed @0.2.1
true.
再安装yaml包
?- pack_install(yaml).
% Contacting server at https://www.swi-prolog.org/pack/query ... ok
Select download location for yaml@0.1
(1) * GIT repository at http://git.cf.ericsson.net/5g-mgmt/yaml.git
(2) GIT repository at http://git.cf.ericsson.net/components/yaml.git
(3) GIT repository at http://git.cf.ericsson.net/ehonlia/yaml.git
(4) GIT repository at https://github.com/honnix/yaml.git
(5) Cancel
Your choice?
% Cloning into 'c:/programdata/swi-prolog/pack/yaml'...
% Contacting server at https://www.swi-prolog.org/pack/query ... ok
% "yaml.git" was downloaded 171 times
Package: yaml
Title: YAML parser
Installed version: 0.1
Author: Honnix Liang <hxliang1982@gmail.com>
Maintainer: Hongxin Liang <hxliang1982@gmail.com>
Packager: Honnix Liang <hxliang1982@gmail.com>
Home page: https://github.com/honnix/yaml
Download URL: https://github.com/honnix/yaml/archive/v0.1.zip
Run post installation scripts for pack "yaml" Y/n?
% make: Nothing to be done for 'all'.
% make: Nothing to be done for 'check'.
% make: Nothing to be done for 'install'.
true.
安装后的包,都放在了本地的swi-prolog安装目录 C:\ProgramData\swi-prolog\pack 目录下面了。
C:\ProgramData\swi-prolog\pack>dir
驱动器 C 中的卷是 Windows
卷的序列号是 28E7-F0A9
C:\ProgramData\swi-prolog\pack 的目录
2021-01-11 11:34 <DIR> .
2021-01-11 11:34 <DIR> ..
2021-01-11 09:49 <DIR> chess_db
2021-01-11 11:24 <DIR> Downloads
2020-12-31 16:11 <DIR> real
2021-01-11 11:26 <DIR> xsd
2021-01-11 11:38 <DIR> yaml
0 个文件 0 字节
7 个目录 84,370,649,088 可用字节
用tree命令查看,可以看到整个目录的结构
C:\ProgramData\swi-prolog\pack>tree
卷 Windows 的文件夹 PATH 列表
卷序列号为 28E7-F0A9
C:.
├─chess_db
│ ├─data
│ │ └─pgn
│ ├─doc
│ │ └─html
│ ├─examples
│ │ └─short
│ ├─prolog
│ └─src
│ └─lib
├─Downloads
├─real
│ ├─.git
│ │ ├─hooks
│ │ ├─info
│ │ ├─logs
│ │ │ └─refs
│ │ │ ├─heads
│ │ │ └─remotes
│ │ │ └─origin
│ │ ├─objects
│ │ │ └─pack
│ │ └─refs
│ │ ├─heads
│ │ └─remotes
│ │ └─origin
│ ├─c
│ ├─configs
│ ├─doc
│ ├─examples
│ │ └─ws_hist
│ ├─lib
│ │ ├─i386-win32
│ │ ├─x64-win64
│ │ └─x86_64-linux
│ └─prolog
└─yaml
├─examples
└─prolog
└─yaml
2.5 卸载软件包pack_remove函数
pack_remove(+Name),用于卸载软件包。
?- pack_remove(xsd).
% Removing 'c:/programdata/swi-prolog/pack/xsd' and contents
true.
% 查看已安装软件包
?- pack_list_installed.
Installed packages (3):
i chess_db@0.3 - PGN and chess game databases.
i real@2.1 - Integrative statistics with R
i yaml@0.1 - YAML parser
true.
本文的完整代码,可以在github上找到:https://github.com/bsspirit/prolog-learning/tree/main/03 package
同样,本文还是对于prolog的初探,进行逻辑推理,从浅入入深的过程,希望本文能让所有的prolog新手快速上手。
转载请注明出处:
http://blog.fens.me/prolog-packages/