如何删除序言中的引号?

How to remove the quotation in 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(move(3,4),5,X).
X = "move(3,4) scores 5".

但我想要的是:

X = move(3,4) scores 5.

请注意,您发布的代码并不像您所说的那样运行;你有单例变量 Result1Result 应该是相同的。

关于您的问题,Prolog(在某种意义上)提供了两种形式 "output"。一种是通过您在交互式 shell 中看到的答案替换(方程式)。这些替换的想法是为您提供语法上有效的 Prolog 片段的方程式。但是您要求的版本 X = move(3,4) scores 5. 在句法上不是 有效的 Prolog。

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

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

这将隐藏中间 Result 并只打印不带引号的字符串:

?- run_my(move(3, 4), 5).
move(3,4) scores 5
true.

我将此谓词实现为围绕您现有的 my/3 定义的包装器,它保持不变。这是推荐的方法:不要将终端输出与计算的本质混合,仅将其添加到特殊包装器中。

您可以像这样使用序言的 op 功能...

程序

  ([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

备选节目

另一个版本显示了 xfy 操作和 yfx 操作之间的区别。

x 代表 domain 和/\或 sourcey 表示 codomain 和/\或 target

术语来自 https://en.wikipedia.org/wiki/Morphism#Definition

...

  ([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)