如果我有三个原子X,Y和Z,那么
X = 1
Y = 2
Z = +
如何将它们放在一起以便X Z Y = 3?
编辑: 使用ThanosQR的univ解决方案,我修改了我的代码如下:
% Parse list
parse_list([stop|_], _) :- !. % stop predicate if element is "stop"
parse_list([X, Y|Z]) :- % go through the list line by line
number(X, Number_1),
number(Z, Number_2),
operation(Y, Operation),
Line =.. [Operation, Number_1, Number_2],
Result is Line,
write(Result).
number(one, 1).
operation(plus, +). % etc... etc...
我弄错了......不知道为什么......
答案 0 :(得分:3)
首先,一般性评论:如果将不纯的谓词如write/1
混合到其他纯代码中,最终会得到一个非常难以调试的程序。所以首先要尝试确定你所追求的关系。也许它类似tokens_meaning(Tokens,Meaning)
,其中Tokens
是令牌列表,如上所述,Meaning
是要评估的表达式。
为了确定一个问题,只需查看以下片段即可:
...
parse_list([X, Y|Z]) :- % go through the list line by line
number(X, Number_1),
number(Z, Number_2),
...
number(one, 1).
所以你期望的是你有一个以下形式的术语:
[one, Y|one]
也就是说,Z
应该是列表的其余部分。因此,[]
或更长的内容(例如[_]
,而不是one
。
但在你的情况下,你期望得到像one
这样的名字。这当然没有意义。可能你的意思是:
parse_list([X, Y, Z| Whatever]) :-
答案 1 :(得分:1)
尝试univ运算符:
R =.. [Z,X,Y], A is R.