如何删除prolog中的引号?

如何删除prolog中的引号?,prolog,swi-prolog,Prolog,Swi Prolog,因此,当像这样运行代码时: my(Selected_action,S,Result1):- Selected_action = move(X,Y), atomics_to_string([X, ",", Y], '', Tuple), atomics_to_string(["move(", Tuple, ")"], '', Action), atomics_to_string([Action, "scores", S], ' ', Result). 但我想要的是

因此,当像这样运行代码时:

my(Selected_action,S,Result1):-
    Selected_action = move(X,Y),
    atomics_to_string([X, ",", Y], '', Tuple),
    atomics_to_string(["move(", Tuple, ")"], '', Action),
    atomics_to_string([Action, "scores", S], ' ', Result).
但我想要的是:

?- my(move(3,4),5,X).
X = "move(3,4) scores 5".

请注意,您发布的代码与您所说的不符;您的单例变量
Result1
Result
应该是相同的

至于你的问题,Prolog(在某种意义上)提供了两种形式的“输出”。一种是通过交互式shell中的答案替换(方程式)。这些替换的思想是为您提供语法上有效的Prolog片段的方程式。但是您要求的版本,
X=move(3,4)得5分。
在语法上无效

这种通过答案替换的输出形式对程序员很有用,但不一定对最终用户或其他试图解析程序输出的工具有用。因此,另一种输出形式是将内容打印到终端或文件中,就像许多其他编程语言的
print
函数一样。在Prolog中,您可以执行以下操作,例如:

X = move(3,4) scores 5.
这将隐藏中间
结果
,只打印不带引号的字符串:

run_my(Query, Score) :-
    my(Query, Score, Result),
    format('~s~n', [Result]).

我实现了这个谓词,作为对
my/3
现有定义的包装,该定义保持不变。这是推荐的方法:不要将终端输出与计算的本质混为一谈,只将其添加到特殊的包装中。

您可以像这样使用prolog的
op
功能

程序 示例用法 备用程序 另一个版本显示了
xfy
op和
yfx
op之间的差异

x
表示
和/\或
y
表示
codomain
和/\或
目标

术语来源于

替代示例用法
非常感谢。但是结果是X=move(3,4)得5分。在得分之前没有空间。谢谢。是否有一种方法可以将格式结果提供给变量?是的。有关和,请参阅文档。以上是SWI序言,其他序言可能有点不同。
?- run_my(move(3, 4), 5).
move(3,4) scores 5
true.
  ([user]) .

  :- op( 10'1 , 'xfy' , 'scores' ) .

  my(SELECTED_ACTION,SCORE,RESULT)
  :-
  (
     SELECTED_ACTION = move(X,Y) ,
     RESULT = SELECTED_ACTION scores SCORE
  ) .

  %^D
  ?-
  my(move(3,4),5,X)
  .

  %@ X = move(3,4) scores 5
  ([user]) .

  :- op( 10'1 , 'yfx' , 'scoreof' ) .

  my(SELECTED_ACTION,SCORE,RESULT)
  :-
  (
     SELECTED_ACTION = move(X,Y) ,
     RESULT = SCORE scoreof SELECTED_ACTION 
  ) .

  %^D
  ?-
  my(move(3,4),5,X)
  .

  @% X = 5 scoreof move(3,4)