如果我要在终端上初始化这样的东西:
numbers((2,5)).
如何单独获取这两个值。我的代码中有这个:
numbers(Pair_numbers) :- Pair_numbers is (X, Y).
这并不起作用。我希望X
作为2
和Y
作为5
,以便稍后我可以在以下内容中使用它们:
nth1(X, Random_list, List_Row)
nth1(Y, List_Row, Value)
答案 0 :(得分:2)
保持"常数"的唯一惯用选项在您的Prolog代码中,将它们作为事实,正如上面的潜伏者的评论所指出的那样。您可能在代码中的某个地方有 fact :
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;
正如所指出的,你不需要把它变成一个" tuple"或任何其他类型的结构,只需使用两个参数。
如果你想从"终端"或者更确切地说是从顶层开始,你可以尝试:
?- assertz(numbers(2, 5)).
...但要注意:你可能想确保你已经没有这个。所以可能会更安全一点:
?- retractall(numbers(_,_)), assertz(numbers(2, 5)).
或者
?- abolish(numbers/2), assertz(numbers(2, 5)).
您是使用abolish
还是retractall
....阅读文档。这取决于。
你也可以有不同风格的"全局变量",但对于大多数用例来说,这些都不值得。
最后一件事:至少使用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.
也许其他实现有类似的东西。不要习惯它。