从Prolog变量中分离数字

时间:2016-04-21 11:07:18

标签: variables 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)

1 个答案:

答案 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.

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

相关问题