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.
答案 0 :(得分:2)
请注意,您发布的代码与您说的不一致;你有单变量Result1
和Result
应该是相同的。
至于你的问题,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
和/ \或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)