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(…)
。