标签: swi-prolog

Prolog列表中的两颗星

列表中的两颗星是什么?

[53, 5, 1, 53, 97, 115, 53, 50, 52, 121, 55, 56, 55, 97, 4, 1, 98, **]
Run Code Online (Sandbox Code Playgroud)

我试过搜索但没有成功.

logic prolog swi-prolog prolog-toplevel

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

将prolog集成到其他环境中

我正在使用Prolog进行学术项目.我想知道Prolog是否有办法与其他编程语言进行交互.我想要的是一个简单的输入/输出重定向Prolog问题和答案.

我知道Prolog可以在一些Prolog实现中调用C函数.即SWI Prolog.

我需要的是Prolog问题的简单输入/输出重定向以及用户提供的答案.

任何帮助将非常感激.

prolog swi-prolog

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

Swi Prolog,卸载源文件

是否有一个内置谓词或一个简单的方法从prolog的知识数据库中删除已经被咨询过的源文件?我已经阅读了参考手册,但没有找到任何可以做到的事情.

file prolog swi-prolog

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

继承算术总和的最佳绿色削减是什么?

神交在序言绿色削减我试图将它们添加到继任算术总和的标准定义(见谓词plus什么是该查询的SLD树?).这个想法是通过消除所有无用的回溯(即,没有... ; false)尽可能"清理"输出,同时在参数实例化的所有可能组合下保持相同的行为 - 所有实例化,一个/两个/三个完全未实例化,以及所有变化包括部分实例化的args.

这是我在尝试尽可能接近这个理想时能够做到的事情(我承认错误的答案是如何插入绿色切割append/3作为来源):

natural_number(0).
natural_number(s(X)) :- natural_number(X).

plus(X, Y, X) :- (Y == 0 -> ! ; Y = 0), (X == 0 -> ! ; true), natural_number(X).
plus(X, s(Y), s(Z)) :- plus(X, Y, Z).
Run Code Online (Sandbox Code Playgroud)

在SWI下,这似乎适用于所有查询但有形状的查询?- plus(+X, -Y, +Z).,如SWI的谓词描述符号.例如,?- plus(s(s(0)), Y, s(s(s(0)))).收益率Y = s(0) ; false..我的问题是:

  • 我们如何证明上述削减是(或不是)绿色?
  • 我们能否做到比上述计划更好,并通过添加其他一些绿色削减消除最后的回溯?
  • 如果有,怎么样?

prolog swi-prolog successor-arithmetics prolog-cut

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

从标准输入中解析

如何解析标准输入(不缓冲)?如果我理解正确,phrase/2需要一个列表,并phrase_from_file/2library(pure_input)需要一个文件.

我使用普通谓词(不是DCG)和使用类似get_char/2和的内置函数解决了我的问题read_line_to_codes/2,但最后实现看起来与我在C中编写的解决方案非常相似.

如果我能偷偷摸摸一个非常相关的问题:什么是SWI-Prolog的标准输入?read_line_to_codes(library(readutil))需要一个输入流(get/1例如,不像).我用以下谓词得到它:

input_stream(Stream) :-
    current_stream(Object, read, Stream),
    integer(Object).
Run Code Online (Sandbox Code Playgroud)

...这当然有效,但感觉有点黑客攻击.是否可以有多个开放输入流?我怎么知道哪一个是操作系统的标准输入(在我的情况下是Linux)?

prolog swi-prolog

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

如何将SWI Prolog与Visual Studio 2012连接起来

我有一个程序在Visual Studio中连接SWI-Prolog.以前,我使用VS2010(XP),一切正常.然后我升级我的VS成为VS2012(Win7),现在我的代码有问题.

说到以下代码:

PlEngine.Initialize(param);
Run Code Online (Sandbox Code Playgroud)

它总是给我以下异常消息:

The specified module could not be found. (Exception from HRESULT: 0x8007007E)
Run Code Online (Sandbox Code Playgroud)

任何人都可以发现我犯了什么错误,或者如果可能的话,我需要做一些修改,因为升级过程?

有关我的代码的其他信息:

  • 我使用了最新的swiPLCs库(版本:1.1.60301.0)
  • 我上面代码中的'param'是:string [] param = {" - q"," - f",@"c:\ program files(x86)\ pl \"};
  • 我已将路径环境变量设置为:c:\ program files(x86)\ pl \和c:\ program files(x86)\ pl\bin
  • 我在我的代码中有这个设置:Environment.SetEnvironmentVariable("SWI_HOME_DIR",Global.g_prologLocation);
  • 我有参考:swiPLcs.dll
  • 我已经尝试使用SWIProlog 64位,但我仍然遇到同样的问题

任何帮助都非常感谢.

非常感谢

c# prolog swi-prolog interfacing

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

使用Prolog CLPFD为32位数字实现XOR功能

我尝试在Prolog CLPFD中实现高效的异或(XOR).这应该是简单的谓词,如:

xor(A, B, AxorB).
Run Code Online (Sandbox Code Playgroud)

A,B,AxorB是自然数(用0表示)和AxorB是的结果A 的XOR B.

我的主要问题是效率.首先,我无法找到任何方法来对两个数字进行异或,而不将这些数字分成可以进一步处理/约束的单独部分,并且打破这些数字的过程(创建适当的约束然后解析它们)正在进行一些处理时间.其次,我不能提出任何有效的方法来"模拟"自然数字上的XOR函数,而不是在下面的第二个代码中给出.

让我们从我的第一个代码开始.这是最简单的XOR实现,它仅适用于1位值(0和1):

xor_1bit_values(A, B, AxorB) :-
    AxorB #= (A + B) mod 2.
Run Code Online (Sandbox Code Playgroud)

要将其用于大于1的数字,必须将数字分成位:

xor_number(A, B, Result, Bits) :-
    Count is Bits - 1,
    xor_number(A, B, Result, Count, 0).
xor_number(A, B, Result, 0, Sum) :-
    xor_1bit_values(A, B, Xor),
    Result #= Xor + Sum.
xor_number(A, B, Result, Count, Sum) :-
    P is 2^Count,
    X #= A / P,
    Y #= B / P,
    xor_1bit_values(X, …
Run Code Online (Sandbox Code Playgroud)

prolog swi-prolog bitwise-xor clpfd

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

如何在不按空格键的情况下查看SWI-Prolog中的所有答案?

简单的例子:

?- between(1,10,X).
X = 1 ;
X = 2 ;
X = 3 ;
X = 4 ;
X = 5 ;
X = 6 ;
X = 7 ;
X = 8 ;
X = 9 ;
X = 10.
Run Code Online (Sandbox Code Playgroud)

当使用SWL-Prolog使用REPL查看下一个答案时,必须按下空格键.

如何在不按空格键的情况下将所有结果列在屏幕上?

如果这是一个重复的问题,请告诉我,我找不到一个.


细节

我知道第一个想法很多就是使用bagof/3,但实际目标是使用DCG 解析这个3 GB的文件(Uniprot - uniprot_sprot.dat.gz)(文件格式).现在我只想查看tokenizer/lexer是否可以在不停止的情况下完成整个文件.由于数据是一个平面文件数据库(面向行),每行可以独立处理,因此代码首先使用phrase_from_file/2拉出一行,然后根据短语/ 2将其传递给一个标记器,例如,对于一个简单的例子,请参阅Mat的回答如何将文件中的数据读入Prolog,有关更精确的解决方案,请参阅GitHub mzapotoczny/prolog-interpreter.后者将进行解析,然后使用该阶段的输出来加载Neo4j数据库.


处理大文件的注意事项:

最初文件的处理方式与此答案类似,并使用了 …

prolog swi-prolog prolog-toplevel

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

集相等

任何人都可以帮助我完成以下任务:我需要定义一个谓词eq_set,如果集合S1S2元素数相等,则谓词eq_set成功。

但是,只有它们的编号和顺序完全相同时,它才有效。我想创建一个显示所有品种并且不考虑顺序的代码。你能帮我吗?

我写:

eq_set([],[]).
eq_set([H|T],[H|T1]) :-
    eq_set(T,T1).
Run Code Online (Sandbox Code Playgroud)

但是,只有它们的编号和顺序完全相同时,它才有效。我想创建一个显示所有品种并且不考虑顺序的代码。

我对赋值的最接近的翻译是保加利亚语:“定义谓词eq_set,如果集合(S1,S2)重合,则谓词eq_set成功。

prolog swi-prolog

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

导入 csv 文件数据以填充 Prolog 知识库

我有一个 csv 文件example.csv,其中包含带有标题 var1 和 var2 的两列。

在此处输入图片说明

我想import.pl用重复的事实填充最初为空的 Prolog 知识库文件,而每一行的example.csv处理方式相同:

fact(A1, A2).
fact(B1, B2).
fact(C1, C2).
Run Code Online (Sandbox Code Playgroud)

我如何在 SWI-Prolog 中对此进行编码?

编辑,基于@Shevliaskovic 的回答

:- use_module(library(csv)).
import:-
    csv_read_file('example.csv', Data, [functor(fact), separator(0';)]),
    maplist(assert, Data).
Run Code Online (Sandbox Code Playgroud)

import.在控制台中运行时,我们完全按照请求的方式更新知识库(除了知识库直接在内存中更新,而不是通过文件和后续咨询来更新)。

检查setof([X, Y], fact(X,Y), Z).

Z = [['A1', 'A2'], ['B1', 'B2'], ['C1', 'C2'], [var1, var2]].
Run Code Online (Sandbox Code Playgroud)

csv prolog swi-prolog

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