Prolog 如何从非交互式脚本输出目标的所有解决方案

Prolog 如何从非交互式脚本输出目标的所有解决方案,prolog,swi-prolog,Prolog,Swi Prolog,我有一个Node.JS应用程序,我想用它执行以下操作: 1.查询API以读取子句并将其写入文件data.pro 2.作为命令运行swipl,以输出结果 3.解析结果并继续执行Node.JS 我已经将swipl命令设置为: swipl -s triangular.pro -g "customRatio(A,C,D,1.05,T)." -t halt. 现在customRatio/5有很多解决方案,我想在我的主应用程序中进一步处理。在交互模式下运行此功能的示例输出为: A = (portugal

我有一个Node.JS应用程序,我想用它执行以下操作: 1.查询API以读取子句并将其写入文件
data.pro
2.作为命令运行
swipl
,以输出结果 3.解析结果并继续执行Node.JS

我已经将
swipl
命令设置为:

swipl -s triangular.pro -g "customRatio(A,C,D,1.05,T)." -t halt.
现在
customRatio/5
有很多解决方案,我想在我的主应用程序中进一步处理。在交互模式下运行此功能的示例输出为:

A =  (portugal, brazil, 656.1249261859458),
B =  (brazil, germany, 5.36135535063264),
C =  (germany, portugal, 0.0002993),
T = 1.0528532618885567 ;
我不需要它是这种格式,我只想用最简单的方法,通过向命令或程序中添加一些东西来实现所有目标。我看到过使用
findAll
的示例,但无法使其与流的多个输出一起工作。我还看到了
dump
write
的示例

我只是在想,一定有一种简单的方法可以将所有结果转储到一个文件中


提前谢谢。

请您详细说明一下,您在所有中遇到了哪些问题

我认为基于
forall/2
的解决方案如下(我将其拆分为多行,以便更具可读性):

命令变为:

swipl -s triangular.pro -g "forall((Goal = customRatio(A, C, D, 1.05, T), call(Goal)), (write(Goal), nl))." -t halt.
PS:您可以将
forall
放入helper谓词,该谓词将
Goal
作为参数,然后将所有结果写入屏幕或文件,例如:

swipl -s triangular.pro -g "results_to_file(customRatio(A, C, D, 1.05, T))." -t halt.

所以在@DmitriChubarov的评论和@code_x386的类似回复的帮助下,我到达了那里

假设我们有一个已经提供结果的函数:

customRatio(A,C,D,1.05,T)
我们需要目标的所有结果,并将其写入文件。我使用以下方法完成了此操作:

findOpportunities(MinRatio):-
  open('output.txt',write, Stream),
  findall((P1,P2,P3,Ratio),customRatio(P1,P2,P3, MinRatio, Ratio), List),
  write(Stream, List),
  close(Stream).
然后在命令行上调用以下命令:

swipl -s triangular.pro -g "findOpportunities(1.02)." -t halt.
代码_x386提出的解决方案有效,但写入了条款和结果,例如:

customRatio((portugal,brazil,1707.3295658260913),(brazil,germany,0.03409),(germany,portugal,0.017399),1,1.0126716463779004)
customRatio((brazil,germany,0.03409),(germany,france,0.001601),(france,brazil,18663.68047779022),1,1.018628032848078)
customRatio((brazil,germany,0.03409),(germany,portugal,0.017399),(portugal,brazil,1707.3295658260913),1,1.0126716463779004)

谢谢你们两位

考虑一下。我的OP问题是我有4个变量要找,它们不是独立的。findall/3以第一个参数为目标。所以如果我做了
findall(P1,customRatio(P1,P2,P3,1.03,Ratio),LIST)。
,我只得到P1的解。但是我想要P1,P2,P3,比率集,和例子中描述的一样。有什么建议吗?谢谢。我想我可以用
(P1,P2,P3,比率)
,谢谢。把这个打印成文件怎么样?我可以打开并写一条流。谢谢@DmitriChubarov。让我试试。我已经有一段时间(几年)没有接触Prolog了,所以一开始我没有意识到目标不需要是单个变量,也可以是复合变量。您还解决了写入文件的问题,因此我将立即对此进行测试。干杯,然后投票。哦,顺便说一句,我不是指所有人,而是指芬达尔人。我纠正了OP上的输入错误。到目前为止,我是在注释的第一个帮助下到达的:
findoportunities(MinRatio):-open('output.txt',write,Stream),findall((P1,P2,P3,Ratio),customRatio(P1,P2,P3,MinRatio,Ratio),List),write(Stream,List),close(Stream)。我现在就用'forall'试试
Your way@code_x386输出子句本身以及函数名。我在评论中发现以前的解决方案更好一些,但你的解决方案帮助我实现了这一点。我将在一个单独的答案中发布这两个问题,并在稍后给出示例输出。
customRatio((portugal,brazil,1707.3295658260913),(brazil,germany,0.03409),(germany,portugal,0.017399),1,1.0126716463779004)
customRatio((brazil,germany,0.03409),(germany,france,0.001601),(france,brazil,18663.68047779022),1,1.018628032848078)
customRatio((brazil,germany,0.03409),(germany,portugal,0.017399),(portugal,brazil,1707.3295658260913),1,1.0126716463779004)