Prolog:变量实例化工作如何,局部变量的范围是什么

时间:2015-12-11 15:36:27

标签: prolog

我是prolog编程的新手,我的第一个任务是制作二次方程解决方案。我找到并重写了它的输入/输出版本,但是我不理解paranthesis的用法。它们是否像在C / C ++中一样工作?在我看来,每次我引入用户输入的新变量时都应该使用它们。否则我会不断收到具体的错误:
“错误:是/ 2:参数没有充分实例化” 我查找了该问题的明确解释,但没有找到足够的答案来解决我的问题。

q :- write('A = '),
 read_integer(A),
 (   A = 0, write('Not a quadratic equation');
     write('B = '),
     read_integer(B),
     write('C = '),
     read_integer(C),
     D is B*B-4*A*C,
     (   D = 0, write('x = '), X is -B/2/A, write(X);
         D > 0, write('x1 = '), X1 is (-B+sqrt(D))/2/A, write(X1), nl, write('x2 = '), X2 is (-B-sqrt(D))/2/A, write(X2);
         D < 0, write('Delta < 0!')
     )
 ). q.

我不知道为什么它只有在我读完A之后并且在为D值制作等式之后保持paranthesis时才有效。它与它们的范围有关吗?那么prolog中的实例化是什么?只是为了澄清,这正是我已经删除的内容:

q :- write('A = '),
 read(A),
   A = 0, write('Not a quadratic equation');
     write('B = '),
     read(B),
     write('C = '),
     read(C),
     D is B*B-4*A*C, 
        D = 0, write('x = '), X is -B/2/A, write(X);
         D > 0, write('x1 = '), X1 is (-B+sqrt(D))/2/A, write(X1), nl, write('x2 = '), X2 is (-B-sqrt(D))/2/A, write(X2);
       D < 0, write('Delta <0!'), nl, q.

错误:

A = 1.
B = |: 2.
C = |: 1.

ERROR: is/2: Arguments are not sufficiently instantiated

1 个答案:

答案 0 :(得分:2)

由于Prolog基于不同的范例,因此令牌具有不同的含义是相当明显的。删除括号,您需要更改析取运算符&#39 ;;&#39; / 2的范围。这种运算符是语法糖,旨在简化同一子句中的替代分支。默认情况下,子句是目标的结合,由&#39;,&#39; / 2运算符表示。一旦删除括号,SWI-Prolog警告

Singleton variable in branch: D

现在更清楚的是问题是什么:你分配的价值&#39; (我们说要绑定,而不是分配)

D is B*B-4*A*C, 
当执行达到目标D > 0,时,

已被遗忘。算子评估由两个参数的运算符&#39; / 2执行,需要将实例化变量转换为数值。