2016-04-21 61 views
0

在Prolog语言中,我还是个新手,对我来说如此光秃秃的。如果我在终端上初始化类似这样的内容:从Prolog变量中分离数字

numbers((2,5)). 

如何单独获取这两个值。我的代码如下:

numbers(Pair_numbers) :- Pair_numbers is (X, Y). 

并且这不起作用。我想X到作为2Y作为5因此以后我可以等东西用他们的工作:

nth1(X, Random_list, List_Row) 
    nth1(Y, List_Row, Value) 
+0

不要使用'is/2'!它用于算术表达式评估(参见用户手册)。在事实之后命名谓词是一个坏主意。如果你想要单个元素,只需查询'数字((X,Y))'。你不需要谓词。 – lurker

+0

...和(可能)使用'[X,Y]'代替'(X,Y)' – false

+1

甚至为什么要进行分组呢?为什么不是你的事实,'数字(X,Y).'?然后在你的代码中,数字(X,Y),nth1(...),nth1(...)'。 – lurker

回答

2

保持“常量”在你的Prolog代码中的唯一惯用的方法是让他们作为事实,正如上述潜伏者的评论所指出的那样。你可能会对这事实某处代码:

numbers(2, 5). 

然后,当你需要它,你需要评估的事实得到的值:

?- numbers(X, Y), /* do something with X and Y */ 

这将是大约同样的想法在你的C文件的顶部某处写着:

#define NUMBER1 2 
#define NUMBER2 5 

或许,在全球范围内,

const int n1 = 2; 
const int n2 = 5; 

正如所指出的,你不需要将它变成一个“元组”或其他任何类型的结构,只需使用两个参数即可。

如果你想从“终端”做到这一点,或者更确切地说,从顶层,你可以尝试:

?- assertz(numbers(2, 5)). 

...但要注意:你可能想确保你不”已经有这个了。所以,也许有点更安全的是:

?- retractall(numbers(_,_)), assertz(numbers(2, 5)). 

也许

?- abolish(numbers/2), assertz(numbers(2, 5)). 

无论您使用abolishretractall ....阅读的文档。这取决于。

你也可以有不同的“全局变量”,但对于大多数用例来说这些都不值得。

还有一件事:至少在SWI-Prolog中,通过使用$Variable_name来访问早期查询中的变量值是一种技巧。这是从我的相互作用实际成绩单与SWI-Prolog的顶层:

?- X = 2. 
X = 2. 

?- Y = 5. 
Y = 5. 

?- X < Y. 
ERROR: </2: Arguments are not sufficiently instantiated 
?- $X < $Y. 
true. 

?- Z is $X + $Y. 
Z = 7. 

也许其他实现方式有类似的东西。不习惯它。