标签: gnu-prolog

在GNU-Prolog中,我能"抓住"linux信号吗?

有没有办法在GNU Prolog中"陷阱"(例如"捕获")操作系统信号?(我正在使用Ubuntu/Linux,最新的gprolog).

我想很久以前我在WAMCC中使用过这种方法,然后才变成GNU Prolog:

:- catch(Long_Running_Goal,signal(2),write('program interrupted'))
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用(重复,失败)无限循环测试它,例如

:- catch((repeat,fail),X,write(X)).
Run Code Online (Sandbox Code Playgroud)

在解释按Ctrl-C还带我去跟踪/调试器,编译后的程序只是退出,如果我打断它kill -1,kill -2等等.

我已经尝试编译程序,--no-top-level以防默认顶层以某种方式捕获信号,但这没有任何区别.

SWI-Prolog似乎有一个合适的内置谓词on_signal,但是我正在寻找gprolog的解决方案,如果可能的话.

linux prolog gnu-prolog

20
推荐指数
2
解决办法
352
查看次数

在prolog中进行大规模编程

我试图保持我的Prolog代码模块化,我想知道是否有人对如何做到这一点有任何建议.我用简单consult的方式做这个的方式,但随着我的文件数量的增加而变得越来越麻烦,并且因为命名冲突而屈服.是否存在类似于"典型"导入的构造,例如

%-------------------------------------------------------------------- compiler.pl

[ scanner, parser, codegen ] .

%-------------------------------------------------------------------- compile

% compile( S, I ) :- Compiling the source string S gives the list of instructions
%                    I

compile( S, I ) :- scan( S, T ), parse( T, A ), codegen( A, I ) .

%-------------------------------------------------------------------------------%
Run Code Online (Sandbox Code Playgroud)

在源文件的顶部?如果它是特定于程序的,我正在使用gprolog.在此先感谢您的帮助.

modularity scalability module prolog gnu-prolog

17
推荐指数
3
解决办法
1227
查看次数

gprolog:在异常后获取堆栈跟踪

使用gprolog时,我经常会遇到没有任何类型的行号或上下文的异常:

uncaught exception: error(instantiation_error,(is)/2)
Run Code Online (Sandbox Code Playgroud)

没有任何背景.我知道我可以做一个trace但是调试它需要很长时间,trace因为我需要在到达发生错误的地方之前执行很多事情.

有关如何进行此堆栈跟踪的任何想法?还是一个动态trace/ notrace

编辑:或者只是自动化整个trace输出的打印.

debugging prolog gnu-prolog

9
推荐指数
2
解决办法
866
查看次数

Prolog - 生成适合给定范围的数字

我想使用如下谓词:

range(X,0,5)
range(X,4,200)
range(X,-1000000,1000000)
dom_range(X,-1000000,1000000)
Run Code Online (Sandbox Code Playgroud)

含义:

range(X,0,5) :- member(X,[0,1,2,3,4,5]).
range(X,4,200) :- member(X,[4,5,6...198,199,200]).
range(X,-1000000,1000000) :- member(X,[-1000000,...,1000000]).
dom_range(X,-1000000,1000000) :- domain(X, [-1000000,...,1000000]).
Run Code Online (Sandbox Code Playgroud)

如何在Prolog中很好地编码(考虑解决方案性能 - 递归的深度等)?

预计解决方案将在GNU-Prolog上运行.

PS问题受到这个问题的启发.

prolog gnu-prolog

8
推荐指数
2
解决办法
2万
查看次数

GNU Prolog断言错误

我是Prolog的新手,但我仍然坚持这个简单的命令.我已经加载了一个没有错误的知识库,每当我尝试断言(甚至帮助)时,我都收到以下消息:

uncaught exception: error(existence_error(procedure,assert/1),top_level/0)
{2}
Run Code Online (Sandbox Code Playgroud)

我究竟缺少什么?赞赏.

prolog gnu-prolog iso-prolog prolog-assert

7
推荐指数
1
解决办法
1804
查看次数

简单的PROLOG问题:如何针对Prolog数据库测试多个查询?

我有一个Prolog数据库文件(test_inserts.p),我用它来插入我的所有数据.

我还有一个Prolog查询文件(test_queries.pl),它包含我编写的所有Prolog查询,用于从我的数据库接收特定信息.

我想知道如何在使用gprolog时对我的test_inserts.p数据库文件实际使用test_queries.pl查询我希望有一种方法可以同时加载两者,并以某种方式能够命令运行哪个查询,而不必重新键入我想运行的每个查询....

database prolog gnu-prolog

6
推荐指数
1
解决办法
2187
查看次数

找一个带prolog的布尔电路

问题如下:考虑三个输入A,B,C,找到一个带AND,OR和NOT门的布尔电路,使输出不是(A),不是(B),不是(C)最多使用2 NOT大门.

我想找一个带prolog的电路.我的想法是计算一个带有函数的谓词"可访问",并说它是否存在计算f的电路.

我有以下谓词:

not([],[]).
not([H|T],[G|S]) :- G #=# 1-H, not(T,S).

or([],[],[]).
or([0|T],[0|S],[0|R]) :- or(T,S,R).
or([1|T],[0|S],[1|R]) :- or(T,S,R).
or([1|T],[1|S],[1|R]) :- or(T,S,R).
or([0|T],[1|S],[1|R]) :- or(T,S,R).

and([],[],[]).
and([1|T],[1|S],[1|R]) :- and(T,S,R).
and([0|T],[1|S],[0|R]) :- and(T,S,R).
and([1|T],[0|S],[0|R]) :- and(T,S,R).
and([0|T],[0|S],[0|R]) :- and(T,S,R).

accessible(_,_,0) :- !,fail.
accessible([0,1,0,1,0,1,0,1],[12],_) :- !.
accessible([0,0,1,1,0,0,1,1],[11],_) :- !.
accessible([0,0,0,0,1,1,1,1],[10],_) :- !.
accessible(F,L,C) :- CC is C-1, or(G,H,F), accessible(G,M,CC), accessible(H,N,CC), L=[0, [M,N]].
accessible(F,L,C) :- CC is C-1, and(G,H,F), accessible(G,M,CC), accessible(H,N,CC), L=[1,[M,N]].
accessible(F,L,C) :- CC is C-1,  not(F,X), accessible(X,M,CC), L=[2,M].
Run Code Online (Sandbox Code Playgroud)

我想计算11,12之间的函数xor,所以我尝试了以下目标:accessible([0,1,1,0,0,1,1,0],X,4).

但prolog运行了一段时间才得到了好的答案.我想知道如何改进程序以使其更快.

PS如何使用GNU prolog打印没有ASCII代码的字符串?

prolog backtracking gnu-prolog

6
推荐指数
1
解决办法
149
查看次数

基本示例中的 Prolog 存在错误过程

我正在尝试学习 Prolog 的基础知识,并使用以下代码继续遇到existing_error。

comes_after(m1, m2).
comes_after(m2, m3).
comes_after(m3, m4).
comes_after(m4, m5).
comes_after(m5, m6).

does_come_after(X, Y) :- comes_after(X, Y).
does_come_after(X, Z) :- comes_after(X, Y), does_come_after(Y, Z).
Run Code Online (Sandbox Code Playgroud)

在执行诸如 dos_come_after(m1, m3) 之类的查询时,我不断收到以下错误。

uncaught exception: error(existence_error(procedure,comes_after/0),does_come_after/0)
Run Code Online (Sandbox Code Playgroud)

这是显示错误的屏幕截图:

序言错误

我做错了什么,我应该记住什么以避免将来出现这些错误?提前致谢。

prolog gnu-prolog

6
推荐指数
2
解决办法
6111
查看次数

Prolog兼容性层 - 可用的编程库

在一个Prolog实现中缺少一些谓词,在其他实现中可用.

我们可以实现缺少谓词,让我们称之为"Prolog兼容层".

你知道Prolog的"Prolog兼容性层"(特别是对于GNU-Prolog)吗?

请按以下方式构建答案:

  • 标题与链接.
  • "已实施" - 您可能希望使用的prolog实现
  • "兼容性" - 为兼容层完成的prolog实现
  • "功能" - 兼容性功能列表(您可以加入您的收藏夹)
  • "其他信息" - 评论,要求,限制等.
  • "许可证" - 许可证信息

PS问题受另一个问题启发:Prolog语法问题.

prolog gnu-prolog

5
推荐指数
1
解决办法
300
查看次数

制作适用于 GNU 和 SWI 的 Prolog 代码

我意识到这会有限制,但是有没有一种合理的方法可以在 Prolog 代码中放入条件指令,以便在 GNU 或 SWI 中合理地工作?我至少在考虑最简单的情况,即sumlistSWI 和sum_listGNU中的内置谓词在拼写上彼此不匹配。或者 SWI 有assert但 GNU 没有。所以最好有这样的东西:

:- if($SWI).
SWI version of stuff
:- else.
GNU version of stuff
:- endif.
Run Code Online (Sandbox Code Playgroud)

或者干脆:

:- if(not_a_builtin(sumlist))
sumlist(L, S) :- sum_list(L, S).
:- endif.
Run Code Online (Sandbox Code Playgroud)

或者什么不是。两种语言中都存在条件指令,但似乎只是提供了做这种事情所需的条件。我可能错过了手动搜索没有出现的东西。

portability prolog swi-prolog gnu-prolog iso-prolog

5
推荐指数
1
解决办法
557
查看次数