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

时间:2018-01-12 14:01:57

标签: 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, brazil, 656.1249261859458),
B =  (brazil, germany, 5.36135535063264),
C =  (germany, portugal, 0.0002993),
T = 1.0528532618885567 ;

我不需要它采用这种格式,我只想要最简单的方法来将所有目标添加到命令或程序中。我见过findAll的示例,但无法使用多个输出到流。我还看过dumpwrite的例子。

我只是认为必须有一种简单的方法将所有结果转储到文件中。

提前谢谢。

2 个答案:

答案 0 :(得分:3)

您能否详细说明您在使用forall时遇到的问题?

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

forall(
    (Goal = customRatio(A, C, D, 1.05, T), call(Goal)),
    (write(Goal), nl)
)

命令变为:

swipl -s triangular.pro -g "forall((Goal = customRatio(A, C, D, 1.05, T), call(Goal)), (write(Goal), nl))." -t halt.

PS:您可以将forall放入辅助谓词中,该谓词将Goal作为参数,然后将所有结果写入屏幕或文件,例如:

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

答案 1 :(得分:1)

所以在@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.

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)

谢谢你们两位!