规则的Prolog返回值无法正确打印

时间:2016-09-09 21:43:53

标签: 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',   
                         '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.

2 个答案:

答案 0 :(得分:3)

详细说明Michael Convington的答案:你指定的Prolog变量的名称不起作用。如果对于任何X,谓词p(X)成立,那么对于任何Yp(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变量的目的是使相同的值出现在同一公式,规则或事实中的多个位置。