如何删除prolog中的报价?

时间:2017-05-21 14:40:15

标签: 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(move(3,4),5,X).
X = "move(3,4) scores 5".

但我想要的是:

X = move(3,4) scores 5.

2 个答案:

答案 0 :(得分:2)

请注意,您发布的代码与您说的不一致;你有单变量Result1Result应该是相同的。

至于你的问题,Prolog(在某种意义上)有两种形式提供“输出”。一个是通过交互式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定义的包装器,该定义保持不变。这是推荐的方法:不要将终端输出与计算的本质混合,只将其添加到特殊包装中。

答案 1 :(得分:1)

您可以像这样使用prolog的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)