如何删除序言中的引号?
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.
请注意,您发布的代码并不像您所说的那样运行;你有单例变量 Result1
和 Result
应该是相同的。
关于您的问题,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
和/\或 source
。
y
表示 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)
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.
请注意,您发布的代码并不像您所说的那样运行;你有单例变量 Result1
和 Result
应该是相同的。
关于您的问题,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
和/\或 source
。
y
表示 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)