这是规则:
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.
答案 0 :(得分:3)
详细说明Michael Convington的答案:你指定的Prolog变量的名称不起作用。如果对于任何X
,谓词p(X)
成立,那么对于任何Y
和p(Y)
都是如此。因此,许多prolog实现仅仅通过整数表示变量,例如, SWI Prolog打印为_G123
,_G345
等。再次取决于您使用的实现,顶级(输入查询的提示)尝试变得聪明的变量名称:它知道内部变量_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('S').
S
true.
当您尝试一些统一时,很容易看出差异:
?- 'X' = 'Y'.
false.
?- f('X') = f('Y').
false.
?- X = Y.
X = Y.
?- f(X) = f(Y).
X = Y.
不同名称的原子永远不会相同,导致“假”。但是两个变量可以是相同的:顶层只给出条件(如果变量相等,则X等于Y)。这看起来有点循环,但是如果你要求条件为f(X) = f(Y)
它仍然只会告诉你必须用X
代替Y
,即每当你替换X
时通过某种东西,你需要将Y
替换为相同的(不管它是什么)。
我还建议您参加一个教程,它将告诉您更多关于Prolog(统一,回溯等)的优势。 comp.lang.prolog FAQ有一些很好的指针(问题8和14)。
答案 1 :(得分:1)
像_S5234这样的输出意味着"这个变量没有被实例化" (没有价值)。
Prolog变量都是本地的。一旦显示下一个? - 提示,变量S,E和R就不再存在。
也就是说,你不能将值存储在" Prolog中的变量。 Prolog变量的目的是使相同的值出现在同一公式,规则或事实中的多个位置。