我有兴趣与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回答(仅)回答这些问题?
我在Mac上运行SWI-prolog时遇到了最大的困难.
当我输入:
/opt/bin/local/swipl
Run Code Online (Sandbox Code Playgroud)
我收到一个错误说:
/opt/local/bin/swipl: No such file or directory
Run Code Online (Sandbox Code Playgroud)
当我输入"swipl"时,我得到:
swipl: command not found
Run Code Online (Sandbox Code Playgroud)
我在终端和XQuartz都尝试过这个.我甚至进过了
/Applications/SWI-Prolog.app/Contents/MacOS
Run Code Online (Sandbox Code Playgroud)
看看是否会做任何事情,但是prolog"欢迎"文本永远不会出现.很可能我最接近它的工作是当我在MacOS文件夹中输入"pl"时.然而,我的终端什么也没做,我不得不使用Crtl-D.
有什么我做错了吗?我安装错误了吗?
我正在使用Mac OS X 10.9.1 Mavericks.我将SWI-Prolog应用程序放入我的应用程序文件夹中,我还根据网站的推荐下载了XQuartz.
我想听听那些在使用swi-prolog的语义库方面拥有真实编程经验的人.
编辑:这个问题的原因是,在我与prolog经验交谈的很多人中,他们中的大多数人似乎已经在他们的学术项目中使用它进行一些人工智能编程.我想知道是否有人在生产环境中广泛使用它.由于实时可维护性,性能不同于完成项目以获得好成绩.
你是如何与Java这样的编程语言集成的?
编辑:如答案所述,似乎REST服务或使用swi prolog的外部接口是两个最佳选择.
您使用prolog库(在语义Web的上下文中)是什么?
可能不会在这里得到明确的答案.可能是,这个问题属于语义溢出.我现在有一个很好的想法,并将在更合适的论坛继续讨论.
使用了什么开发环境? 由swi prolog提供的Emacs或其变体似乎是压倒性的答案.
我从来没有想过像Intellij IDEA这样的IDE.毕竟我会做什么,自动完成?我理解基于规则的语言的必要性.再说一遍,我之所以讨论开发环境,是为了帮助我追踪我的规则(调试),也可能在我的知识集中找出异常.Sw prolog图形跟踪器照顾第一个要求,但至少对我来说,它出现了粗制滥造和有限.但我不相信还有别的.
我真的很喜欢使用swi prolog的想法,但如果它影响生产力,它会远离它.
如答案所述,prolog应该被用来表现它擅长的东西.我总是知道这一点,因此我的问题是与其他编程语言的集成.似乎最大的生产力是开发人员的质量,并处于开发阶段.系统中的问题可能处于休眠状态且不易修复,但可以通过使用一组问题来检查系统的有效性.
注意:当我提到答案时,我指的是@littletable提供的答案.也有兴趣在SWI序言中人们对于语义网,西娅看起来很有趣.
我正在使用SWI-Prolog并且我正在尝试打印列表,但如果列表中有超过9个项目 - 它看起来像那样 -
[1, 15, 8, 22, 5, 19, 12, 25, 3|...]
Run Code Online (Sandbox Code Playgroud)
有没有办法显示整个列表?
我想读取纯文本文件并将谓词应用于每一行(谓词包含write输出的内容).我该怎么办?
我正在解析一个由一系列行组成的相当简单的文件格式,每行都有一些空格分隔的字段,如下所示:
l 0x9823 1
s 0x1111 3
l 0x1111 12
?
Run Code Online (Sandbox Code Playgroud)
我正在使用SWI-Prolog.这是我到目前为止的DCG:
:- consult(library(pure_input)).
load_trace(Filename, Traces) :-
phrase_from_file(trace_file_phrase(Traces), Filename).
trace_file_phrase([]) --> [].
trace_file_phrase([T|Ts]) --> trace_phrase(T), trace_file_phrase(Ts).
trace_phrase(access(Type, Address, SinceLast)) -->
access_type(Type), space,
address(Address), space,
nat(SinceLast), newline.
access_type(load) --> "l".
access_type(store) --> "s".
address(Number) --> "0x", hexnum(Number).
hexdigit(N) --> digit(N).
hexdigit(10) --> "a". hexdigit(11) --> "b". hexdigit(12) --> "c".
hexdigit(13) --> "d". hexdigit(14) --> "e". hexdigit(15) --> "f".
hexnum(N) --> hexdigit(D), hexnum(D, N).
hexnum(N, N) --> [].
hexnum(A, N) --> hexdigit(D), …Run Code Online (Sandbox Code Playgroud) 有没有办法只创建一个这样的prolog脚本hello.pl:
#!/usr/local/bin/swipl -q -s -t main
main:-
write('Hello World\n').
Run Code Online (Sandbox Code Playgroud)
能够像这样从终端运行吗?
$ hello.pl
Hello World
$
Run Code Online (Sandbox Code Playgroud)
当我这样做时它给了我这个:
hello.pl: line 3: main:-: command not found
hello.pl: line 4: syntax error near unexpected token `'Hello World\n''
hello.pl: line 4: ` write('Hello World\n').'
Run Code Online (Sandbox Code Playgroud)
我可以通过在命令行上写这个来使它工作:
$ swipl -q -f hello.pl -t main
Hello World
$
Run Code Online (Sandbox Code Playgroud)
但有没有办法将直接脚本作为可执行文件运行?
编辑
还没有能够让这个工作.以下是@Boris在其答案评论中提出的命令的输出:
$ ls -l
total 8
-rwxr-xr-x 1 viatropos staff 235 Aug 26 20:28 example.pl
$ cat example.pl
#!/usr/local/bin/swipl
:- set_prolog_flag(verbose, silent).
:- initialization main.
main …Run Code Online (Sandbox Code Playgroud) 首先我加载文件 SWI-Prolog
$ swipl file.pl
Run Code Online (Sandbox Code Playgroud)
然后我修改文件并保存.
现在我如何重新加载文件
?- reload
Run Code Online (Sandbox Code Playgroud)
为此修改file.pl?
我在某处读到你可以将模块视为Prolog中的对象.我试图解决这个问题,如果这是一个很好的编码方式.
如果我有两个文件,一个定义一个类狗,然后另一个使用这个类来生成两个狗对象.
:- module(dog,
[ create_dog/4,bark/1 ]).
create_dog(Name,Age,Type,Dog):-
Dog = dog(name(Name),age(Age),type(Type)).
bark(Dog):-
Dog = dog(name(_Name),age(_Age),type(Type)),
Type = bassethound,
woof.
bark(Dog):-
Dog = dog(name(_Name),age(_Age),type(Type)),
Type \= bassethound,
ruff.
woof:-format("woof~n").
ruff:-format("ruff~n").
Run Code Online (Sandbox Code Playgroud)
第二个档案
use_module(library(dog)).
run:-
dog:create_dog('fred',5,bassethound,Dog),
forall(between(1,5,_X),
dog:bark(Dog)
),
dog:create_dog('fido',6,bloodhound,Dog2),
dog:bark(Dog2).
Run Code Online (Sandbox Code Playgroud)
这使得一只狗对象Dog是一只巴塞特猎犬并且让它吠5次,然后我再制作另一只狗对象Dog2,它是一只猎犬并使它也吠叫.我知道在oop中你有对象有行为和状态.所以我现在根据自己的状态有两个具有不同行为的对象,但目前我将对象的状态存储在Dog变量中,主程序中的代码可以看到它们.有没有办法隐藏对象的状态,即拥有私有变量?例如,我可能希望有一种方法可以为每个狗对象存储状态has_barked,如果它在程序中较早出现,则为true,否则为false,然后bark/1根据此更改行为.
您还将如何处理继承和覆盖方法等?任何指向读数的指针都欢迎.谢谢.
swi-prolog ×10
prolog ×9
dcg ×3
command-line ×1
executable ×1
install ×1
io ×1
java ×1
linux ×1
macos ×1
module ×1
object ×1
oop ×1
semantic-web ×1
shell ×1
ubuntu ×1