Variables 从Prolog变量中分离数字

Variables 从Prolog变量中分离数字,variables,prolog,Variables,Prolog,如果要在终端上初始化类似的内容: 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) 在Prolog代码中保留“常量”的唯一惯用方法是将它们作为事实,正

如果要在终端上初始化类似的内容:

    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)

在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;
如前所述,您不需要将其设置为“tuple”或任何其他类型的结构,只需使用两个参数即可

如果您想从“终端”或更确切地说是从顶层执行此操作,您可以尝试:

?- assertz(numbers(2, 5)).
。。。但是要小心:你可能想确保你还没有这个。因此,也许更安全一点是:

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

?- abolish(numbers/2), assertz(numbers(2, 5)).
无论您是使用
废除
还是
收回所有
。。。。阅读文档。视情况而定

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

最后一件事:至少在SWI Prolog中,有一个技巧可以通过使用
$Variable\u name
访问早期查询中的变量值。以下是我在SWI序言中与高层互动的实际记录:

?- 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.
?-X=2。
X=2。
?-Y=5。
Y=5。
?-X错误:在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;
如前所述,您不需要将其设置为“tuple”或任何其他类型的结构,只需使用两个参数即可

如果您想从“终端”或更确切地说是从顶层执行此操作,您可以尝试:

?- assertz(numbers(2, 5)).
。。。但是要小心:你可能想确保你还没有这个。因此,也许更安全一点是:

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

?- abolish(numbers/2), assertz(numbers(2, 5)).
无论您是使用
废除
还是
收回所有
。。。。阅读文档。视情况而定

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

最后一件事:至少在SWI Prolog中,有一个技巧可以通过使用
$Variable\u name
访问早期查询中的变量值。以下是我在SWI序言中与高层互动的实际记录:

?- 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.
?-X=2。
X=2。
?-Y=5。
Y=5。
?-X错误:不要使用
is/2
!用于算术表达式计算(请参阅用户手册)。用事实来命名谓词是个坏主意。如果需要单个元素,只需查询,
number((X,Y))
。您不需要谓词。。。。并且(可能)用
[X,Y]
代替
(X,Y)
,甚至为什么要分组?为什么你的事实不只是,
数字(X,Y)。
?然后在代码中,
数字(X,Y),nth1(…),nth1(…)
。不要使用
is/2
!用于算术表达式计算(请参阅用户手册)。用事实来命名谓词是个坏主意。如果需要单个元素,只需查询,
number((X,Y))
。您不需要谓词。。。。并且(可能)用
[X,Y]
代替
(X,Y)
,甚至为什么要分组?为什么你的事实不只是,
数字(X,Y)。
?然后在代码中,
数字(X,Y),nth1(…),nth1(…)