Prolog规则的返回值打印不正确

Prolog规则的返回值打印不正确,prolog,Prolog,这是规则: get_style(S,E,R) :- echo_file('Playing_style.txt'), write('Enter digit opeion: '), read(S), write('Style: '), write(S), nth0(S, [ 'Technical', 'Positional', 'Attacking',

这是规则:

 get_style(S,E,R) :- echo_file('Playing_style.txt'),
               write('Enter digit opeion: '), read(S),
               write('Style: '), write(S),
               nth0(S, [ 'Technical', 'Positional',  'Attacking',   
                         'Calculating', 'Tricky', 'Dynamic', 'Practical',
                         'Intuitive', 'Logical', 'Young' ], E, R).
执行使:

1 ?- [echo_file].
true.

2 ?- get_style(S,E,R).
0. Technical
1. Positional
2. Attacking
3. Calculating
4. Tricky
5. Dynamic
6. Practical
7. Intuitive
8. Logical
9. Young:
Enter digit opeion: 5.
Style: 5
S = 5,
E = 'Dynamic',
R = ['Technical', 'Positional', 'Attacking', 'Calculating', 'Tricky', 'Practical', 'Intuitive', 'Logical', 'Young'] .

3 ?- write(S).
_G1211
true.

4 ?- write(E).
_G1211
true.

像_S5234这样的输出意味着“此变量未实例化”(没有值)

Prolog变量都是局部变量。一旦显示下一个?-提示,变量S、E和R就不再存在


也就是说,不能在Prolog中“将值存储在”变量中。Prolog变量的目的是使相同的值出现在同一公式、规则或事实的多个位置。

类似于_S5234的输出表示“此变量未实例化”(没有值)

Prolog变量都是局部变量。一旦显示下一个?-提示,变量S、E和R就不再存在


也就是说,不能在Prolog中“将值存储在”变量中。Prolog变量的目的是使相同的值出现在同一公式、规则或事实的多个位置。

详细说明Michael Convington的答案:您指定的Prolog变量名称不起作用。如果对于任何
X
,谓词
p(X)
成立,那么对于任何
Y
p(Y)
也是如此。因此,许多prolog实现仅用整数表示变量,例如,SWI prolog打印为
\u G123
\u G345
等。同样,根据您使用的实现,顶层(输入查询的提示)尝试巧妙地使用变量名:它知道内部变量
\u G123
对应于
S
,并选择您输入的变量:

?- X = f(Y).
X = f(Y).
如果我通过写入
使
Y
匿名(即根本不给变量命名),我会看到内部名称:

?- X = f(_).
X = f(_G123).
不幸的是,
write/1
对顶层的了解不多,并且使用内部名称。正如我前面提到的,从逻辑的角度来看,变量的名称并不重要。因此,如果你想要一个特定的术语,你需要替换一个原子:你只需在你的目标中添加统一号
S=spaceshuttle

?- S = spaceshuttle, write(S).
spaceshuttle
S = spaceshuttle.
中间一行是
write/1
的输出,最后一行是您的答案替换。您可能会感到困惑的是,您的代码使用
'X'
符号创建了一个以大写字母开头的原子,通常这是一个变量。在这种情况下,您要求
'X'
为常数。然后,write也会做你期望的事情:

?- write('S').
S
true.
当您尝试一些统一方法时,很容易看出区别:

?- 'X' = 'Y'.
false.

?- f('X') = f('Y').
false.

?- X = Y.
X = Y.

?- f(X) = f(Y).
X = Y.
不同名称的原子永远不可能相同,从而导致“错误”。但是两个变量可以是相同的:toplevel只给出一个条件(如果变量相等,那么X等于Y)。这看起来有点循环,但是如果你问
f(X)=f(Y)
这个条件,它仍然只会告诉你必须用
X
代替
Y
,也就是说,每当你用某物代替
X
时,你都需要用同样的东西代替
Y


我还建议您参加一个教程,它将告诉您更多关于Prolog的优点(统一、回溯等)。有一些很好的提示(问题8和14)。

详细说明Michael Convington的答案:您分配的Prolog变量的名称不起作用。如果对于任何
X
,谓词
p(X)
成立,那么对于任何
Y
p(Y)
也是如此。因此,许多prolog实现仅用整数表示变量,例如,SWI prolog打印为
\u G123
\u G345
等。同样,根据您使用的实现,顶层(输入查询的提示)尝试巧妙地使用变量名:它知道内部变量
\u G123
对应于
S
,并选择您输入的变量:

?- X = f(Y).
X = f(Y).
如果我通过写入
使
Y
匿名(即根本不给变量命名),我会看到内部名称:

?- X = f(_).
X = f(_G123).
不幸的是,
write/1
对顶层的了解不多,并且使用内部名称。正如我前面提到的,从逻辑的角度来看,变量的名称并不重要。因此,如果你想要一个特定的术语,你需要替换一个原子:你只需在你的目标中添加统一号
S=spaceshuttle

?- S = spaceshuttle, write(S).
spaceshuttle
S = spaceshuttle.
中间一行是
write/1
的输出,最后一行是您的答案替换。您可能会感到困惑的是,您的代码使用
'X'
符号创建了一个以大写字母开头的原子,通常这是一个变量。在这种情况下,您要求
'X'
为常数。然后,write也会做你期望的事情:

?- write('S').
S
true.
当您尝试一些统一方法时,很容易看出区别:

?- 'X' = 'Y'.
false.

?- f('X') = f('Y').
false.

?- X = Y.
X = Y.

?- f(X) = f(Y).
X = Y.
不同名称的原子永远不可能相同,从而导致“错误”。但是两个变量可以是相同的:toplevel只给出一个条件(如果变量相等,那么X等于Y)。这看起来有点循环,但是如果你问
f(X)=f(Y)
这个条件,它仍然只会告诉你必须用
X
代替
Y
,也就是说,每当你用某物代替
X
时,你都需要用同样的东西代替
Y


我还建议您参加一个教程,它将告诉您更多关于Prolog的优点(统一、回溯等)。有一些很好的指针(问题8和14)。

\u G123
中的前导下划线并不表示匿名变量。唯一的匿名变量是
。根据Prolog系统的不同,名称以下划线开头的变量可能不会报告为单例变量,但这与匿名变量不同。谢谢,我删除了上面关于匿名变量的注释,因为这会分散对原始问题的注意力。如
\u G123
中的前导下划线并不表示匿名变量。唯一的匿名变量是