有没有办法在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的解决方案,如果可能的话.
我试图保持我的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.在此先感谢您的帮助.
使用gprolog时,我经常会遇到没有任何类型的行号或上下文的异常:
uncaught exception: error(instantiation_error,(is)/2)
Run Code Online (Sandbox Code Playgroud)
没有任何背景.我知道我可以做一个trace但是调试它需要很长时间,trace因为我需要在到达发生错误的地方之前执行很多事情.
有关如何进行此堆栈跟踪的任何想法?还是一个动态trace/ notrace?
编辑:或者只是自动化整个trace输出的打印.
我想使用如下谓词:
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的新手,但我仍然坚持这个简单的命令.我已经加载了一个没有错误的知识库,每当我尝试断言(甚至帮助)时,我都收到以下消息:
uncaught exception: error(existence_error(procedure,assert/1),top_level/0)
{2}
Run Code Online (Sandbox Code Playgroud)
我究竟缺少什么?赞赏.
我有一个Prolog数据库文件(test_inserts.p),我用它来插入我的所有数据.
我还有一个Prolog查询文件(test_queries.pl),它包含我编写的所有Prolog查询,用于从我的数据库接收特定信息.
我想知道如何在使用gprolog时对我的test_inserts.p数据库文件实际使用test_queries.pl查询?我希望有一种方法可以同时加载两者,并以某种方式能够命令运行哪个查询,而不必重新键入我想运行的每个查询....
问题如下:考虑三个输入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 的基础知识,并使用以下代码继续遇到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实现中缺少一些谓词,在其他实现中可用.
我们可以实现缺少谓词,让我们称之为"Prolog兼容层".
你知道Prolog的"Prolog兼容性层"(特别是对于GNU-Prolog)吗?
请按以下方式构建答案:
PS问题受另一个问题启发: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)
或者什么不是。两种语言中都存在条件指令,但似乎只是提供了做这种事情所需的条件。我可能错过了手动搜索没有出现的东西。
gnu-prolog ×10
prolog ×10
iso-prolog ×2
backtracking ×1
database ×1
debugging ×1
linux ×1
modularity ×1
module ×1
portability ×1
scalability ×1
swi-prolog ×1