Command line Prolog-从命令行执行,加载多个文件,执行查询,退出

Command line Prolog-从命令行执行,加载多个文件,执行查询,退出,command-line,prolog,Command Line,Prolog,我想从Windows命令行运行一个prolog文件(Load.pl),执行一个查询(将其结果输出到文件)并退出 我的Load.pl文件加载多个源文件: /** Loading files */ consult('C:/MyPath/Prolog/Segments_5.pl'). consult('C:/MyPath/Prolog/Segments_Global.pl'). consult('C:/MyPath/Prolog/Produits.pl'). consult('C:/MyPath/Pr

我想从Windows命令行运行一个prolog文件(
Load.pl
),执行一个查询(将其结果输出到文件)并退出

我的
Load.pl
文件加载多个源文件:

/**
Loading files
*/
consult('C:/MyPath/Prolog/Segments_5.pl').
consult('C:/MyPath/Prolog/Segments_Global.pl').
consult('C:/MyPath/Prolog/Produits.pl').
consult('C:/MyPath/Prolog/SelChemin.pl').
consult('C:/MyPath/Prolog/OutputFunctions.pl').
我当前使用的命令行是:

"C:\Program Files (x86)\swipl\bin\swipl.exe" -f 'C:/MyPath/Prolog/Load.pl' -g output_src('test.txt'),halt -t 'halt(1)'
我要运行的查询在本例中是
output\u src('test.txt')

它的实现在
outputformations.pl
文件中:

output_src(Path) :-
    open(Path, write, Stream),
    (   propose_source(ListeSources), write(Stream, ListeSources), fail
    ;   true
    ),
    close(Stream).
当我打开prolog终端,手动执行5
consult
指令,然后执行
output\u src
指令时,它工作正常,但当它由命令行执行时,我收到一条错误消息,告诉我:

ERROR: Prolog initialisation failed:
ERROR: '<meta-call>'/1: Undefined procedure: output_src2/0
错误:序言初始化失败:
错误:“”/1:未定义的过程:输出\u src2/0
附言:我只是从prolog开始,我需要用一些.NET代码来连接它

谢谢你的帮助! 当做
Joël

仔细查看错误消息:

ERROR: Prolog initialisation failed: ERROR: ''/1: Undefined procedure: output_src2/0 应该改为:

-g "output_src('test.txt'),halt"
或:


确切的引用规则取决于您的shell和操作系统。

谢谢,为了更好地理解,我尝试简化:,我使用了带oud参数的
output\u src2
方法,并尝试像您所说的那样使用
-g output\u src2,halt
-g“output\u src2,halt”
调用它,它们产生相同的结果(
错误:序言初始化失败:错误:“”/1:未定义的过程:输出\u src2/0
)。如果我用
-g'output\u src2,halt'
调用,它会产生
错误:Prolog初始化失败:错误:忽略/1:未定义的过程:“output\u src2,halt'/0
。注意:经过一些测试,我认为问题来自于我加载了一个“load.pl”只包含几个
consult
调用的文件。当所有代码都在一个唯一的文件中时,它可以工作,但是当我需要在调用一个过程之前查阅几个文件时,我似乎遇到了问题。即使我双击
Load.pl
文件,它也不工作,但是如果我打开prolog终端,手动输入e> 查阅操作,然后调用
output\u src2。
这里只有它是好的。你知道为什么吗?我发现
-g'output\u src2,halt'
会让你非常恼火:在Debian 8.2中,我尝试时得到:
$swipl-g'write(a),write(b)您可能在平台上发现了一个关于参数处理的问题。请尝试更多的测试,然后考虑提交一个问题。如果我运行<代码> SWIP-G“写(a),写(b),停止”< /代码>(来自Windows DOS shell)我正确地获得了输出
ab
。事实上,如果我将所有pl源文件重新组合到一个文件中(名为
regrouped.pl
)然后运行
swipl-f regrouped.pl-g output\u src2,halt
它工作得很好。我认为我的load.pl文件和
consult
语句有点不起作用。我对你的问题又添加了一条评论:你目前没有加载任何东西,只是定义谓词
consult/1load.pl>的Prolog事实
实际上不加载任何内容。您只定义形式为
咨询(…)。
的Prolog事实。若要实际加载文件,请使用类似
:-include(file)的指令。
,或
:-use_module(module)。或使用多个文件作为参数调用SWI Prolog,例如:
$swipl file1.pl file2.pl file3.pl等。
-g "output_src('test.txt'),halt"
-g 'output_src(\'test.txt\'),halt'