我是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
答案 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执行,需要将实例化变量转换为数值。