标签: swi-prolog

使用phrase_from_file 读取文件的行

我一直在尝试使用phrase_from_file语法规则解析包含整数行的文件

line --> I,line,{integer(I)}.
line --> ['\n'].
Run Code Online (Sandbox Code Playgroud)

因此: phrase_from_file(line,'input.txt').

它失败了,我很快就迷路了,试图追踪它。我什至试图打印I,但它甚至没有到达那里。

编辑:: 由于以下解决方案都不能真正满足我的需求(使用read/1假设您正在阅读条款,有时编写 DCG 可能会花费太长时间),我蚕食了我在 google 上搜索到的这段代码,主要的变化是添加了:

read_rest(-1,[]):-!.

read_word(C,[],C) :- ( C=32 ;
                       C=(-1)
                     ) , !.
Run Code Online (Sandbox Code Playgroud)

prolog swi-prolog dcg

5
推荐指数
2
解决办法
794
查看次数

在序言中读取行到原子列表

我需要将任何行(来自 user_input)读入原子列表,例如:

Example line, which contains any ASCII chars.
Run Code Online (Sandbox Code Playgroud)

进入:

[Example,'line,',which,contains,any,ASCII,'chars.']
Run Code Online (Sandbox Code Playgroud)

到目前为止我所得到的:

read_line_to_codes(user_input, Input),
atom_codes(IA,Input),
atomic_list_concat(AlistI,' ',IA).
Run Code Online (Sandbox Code Playgroud)

但这仅适用于单个单词,因为 atom_codes。read/2 也抱怨空格,所以有什么办法可以做到这一点吗?

哦,然后可能以逗号分割成二维列表,附加点/感叹号/问号,例如:

[[Example,line],[which,contains,any,ASCII,chars],'.']
Run Code Online (Sandbox Code Playgroud)

顺便说一句:那是 SWI 序言。

编辑:找到解决方案:

read_line_to_codes(user_input, Input),
string_to_atom(Input,IA),
atomic_list_concat(AlistI,' ',IA),
Run Code Online (Sandbox Code Playgroud)

无法回答我自己的问题,因为我没有 100 声望:-/

prolog swi-prolog

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

Linux g++ 在 C++ 中嵌入 Prolog 逻辑引擎

我在 C++ 程序中的一些逻辑不仅非常复杂,而且需要多种解决方案,而 Prolog 是理想的选择。它有点像防火墙配置脚本,检查操作的输入,但有时需要不止一项操作。

我想要的是这样的:

class PrologEngine
{
    LoadLogic(const char* filename) throw PrologException; // Load a file of prolog rules, predicates facts etc in textual format. Must be callable multiple times to load AND COMPILE (for speed) prolog rule files.

    std::vector<std::string> Evaluate(const char* predicate_in_string_form = "execute(input, Result)") throw PrologException; Returns a vector of matching predicates in text form.

};
Run Code Online (Sandbox Code Playgroud)

它不需要回调 C++ 的能力。

AMI Prolog 似乎可以使用它,但它在 Linux 上不可用。我正在尝试使用 SWI-Prolog,但只能找到 2 个示例和令人难以置信的拜占庭 API(我的意见)

谁能给我指出一个与我正在寻找的内容接近的例子?

c++ embed prolog swi-prolog

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

如何使用 SWI-Prolog 控制台中的向上/向下历史键?

当我按下向上/向下键时,我应该得到 - 就像 unix 一样 - 之前的命令,但我得到的是:

Welcome to SWI-Prolog (Multi-threaded, 32 bits, Version 6.0.0)
Copyright (c) 1990-2011 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.

For help, use ?- help(Topic). or ?- apropos(Word).

1 ?- ['nc'].
% nc compiled into nc 0.00 sec, 84 clauses
true.

2 ?- listing.
true.
Run Code Online (Sandbox Code Playgroud)

(我按“向上”箭头键返回“列表”命令……然后……)

3 ?- **^[[A**
Run Code Online (Sandbox Code Playgroud)

我从源代码编译,没有任何额外的“配置”或“制作”参数。

在以前版本的 swi-prolog …

bash ubuntu keyboard-shortcuts swi-prolog

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

是否有库/技术来收集 Prolog 中最佳子句排序的统计信息?

我正在编写一个程序,我需要查看字符串是否与特定模式匹配。现在我已经在 Prolog 中实现了它作为规则匹配模式(S),有超过 20 种不同的定义。

我最终通过模式检查谓词将所有二进制字符串运行到​​一定长度。该程序相当慢(就像 Prolog 经常一样),并且由于有很多不同的定义,我理想地希望对它们进行排序,以便最匹配的那些在排序中最早,因此首先由 Prolog 匹配,避免回溯为尽我所能。

我现在正在使用 SWI Prolog,但我可以访问 SICStus,所以我愿意使用它或我可以免费获得的任何 Prolog 解释器。

optimization performance prolog swi-prolog sicstus-prolog

5
推荐指数
0
解决办法
173
查看次数

由 swi-prolog 编译的可以接受参数的 .exe 示例

在为这个问题挣扎了 4 个小时后,我将不胜感激:

我需要从 prolog 脚本创建一个 exe 文件(在 Windows 上)。例如,main.pl 里面有:

day(monday).
day(tuesday).
day(wednesday).
day(thursday).
day(friday).    % let's stop here
Run Code Online (Sandbox Code Playgroud)

我想编译这个脚本,生成 prog.exe 文件,然后能够执行以下运行:

$ prog.exe --term sunday
 false
$ prog.exe --term monday
 true
$ prog.exe --goal day(friday)
 true
$ prog.exe --goal fun(foo)
 false
Run Code Online (Sandbox Code Playgroud)

如果标志很困难,带有输入目标的非标志版本对我也非常有帮助。

我试图阅读 swi-prolog 页面上的编译页面,但感到困惑。我无法在标准输出流上打印任何内容。我也不明白标志是如何工作的。

尝试了他们在 swi-prolog 网站上的示例,但我不明白为什么没有打印任何内容。使用下面的脚本,我可以使用命令 save(prog) 创建 exe 文件,但是在运行 prog.exe 时没有打印出任何内容。

:- ['main'].

main :-
        pce_main_loop(main).

main(Argv) :-
        write('hello word').

save(Exe) :-
        pce_autoload_all,
        pce_autoload_all,
        qsave_program(Exe,
                      [ emulator(swi('bin/xpce-stub.exe')),
                        stand_alone(true),
                        goal(main)
                      ]).
Run Code Online (Sandbox Code Playgroud)

arguments exe prolog swi-prolog xpce

5
推荐指数
2
解决办法
2703
查看次数

制作适用于 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
查看次数

获取调用谓词的名称

假设我正在研究这个玩具示例(问题的重点显然不是解决这个示例):

p([]).
p([H|T]) :- H = 0, call_predicate(p,T).

call_predicate(Name,Arg) :- call(Name,Arg).
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好。现在假设我想添加一个call_predicate/1不需要谓词名称的谓词:

call_predicate(Arg) :- Name = ??, call(Name,Arg).
Run Code Online (Sandbox Code Playgroud)

这样我就可以使用 in p: call_predicate(T),隐式地知道我想调用同名的谓词。

那么问题是,在知道这是调用的谓词的名称的情况下,如何p从 中检索名称?call_predicate/1call_predicate/1

一个类似的问题是,如果它比第一个更容易,我如何检索执行中一次所处的当前谓词的名称?

reflection prolog swi-prolog

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

如何在 swi-prolog 桌面中设置代码文件 (.pl) 的 utf-8

我正在尝试开发有关使用 swi-prolog 的常见问题(常见问题解答)。我使用桌面版 swi-prolog(AMD64,多线程,版本 8.2.3)。\n常见问题解答中的问题和答案是用土耳其的母语编写的。当我运行代码文件(k-base.pl 和 user.pl)时,土耳其语字符 /like \xc5\x9f-\xc4\x9f-\xc3\xbc-\xc3\xb6/ 看起来已损坏。\n我想知道是否有utf-8 代码文件的任何语法或 swi-prolog 桌面中针对此语言问题的任何设置。

\n

swi-prolog

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

为什么这个 CLP(FD) 约束求解缓慢以及如何调试它?

我正在通过“代码来临”挑战来学习 Prolog。

以下是《代码降临 2021》第 7 天的剧透

目标是:给定一个自然数列表n_1,..., n_k,找到

min_(x\in \N) \sum_i=0^k |x - n_i|
Run Code Online (Sandbox Code Playgroud)

在下面的代码中norm1计算被加数,cost计算给定 处的总和x,并lowest_cost计算所有 s 的最小值x

norm1(X, Y, N) :- N #= abs(X - Y).

cost(Nums, X, Cost) :-
    max_list(Nums, MaxX),
    min_list(Nums, MinX),
    X in MinX..MaxX,
    maplist(norm1(X), Nums, Costs),
    sum(Costs, #=, Cost).


lowest_cost(Nums, Cost) :-
    cost(Nums, X, Cost)
    once(labeling([min(Cost)], [X, Cost])).
Run Code Online (Sandbox Code Playgroud)

一些示例查询:

?- lowest_cost([10,11,12], Cost).
Cost = 2.

?- cost([2,4,6,8], 4, Cost).
Cost = 8. …
Run Code Online (Sandbox Code Playgroud)

prolog swi-prolog clpfd

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