1

我正在尝试模拟一个简单的 3 变量方程(如欧姆定律),其中 RESULT=NUMERATOR/DENOMINATOR。(但实际上在我的情况下,我使用的是纯整数)。

我制定了三个规则;如果我自己定义它们并使用出现在“is”左侧的“hole”变量调用它们,这似乎可以正常工作,但我无法弄清楚如何调用适当的规则,具体取决于在我放置变量而不是整数的位置...

以下是我提出的规则(按照我定义它们的顺序):

equation(RESULT, NUMERATOR, DENOMINATOR) :-
        RESULT is NUMERATOR // DENOMINATOR.

equation(RESULT, NUMERATOR, DENOMINATOR) :-
         NUMERATOR is DENOMINATOR * RESULT.

equation(RESULT, NUMERATOR, DENOMINATOR) :-
         DENOMINATOR is NUMERATOR // RESULT.

我可以让第一条规则起作用:

| ?- equation(RESULT, 200, 10).

RESULT = 20 ? 

yes

但是随后尝试将“洞”从“结果”插槽移动到其他两个插槽中的任何一个似乎都不符合其他规则:

| ?- equation(20, N, 10).      
uncaught exception: error(instantiation_error,(is)/2)
| ?- equation(20, 200, D). 
uncaught exception: error(instantiation_error,(is)/2)

我是序言的新手,所以可能会以错误的方式处理这个问题......关于我如何编程的任何指针?

版本信息如下:

GNU Prolog 1.3.0
By Daniel Diaz
Copyright (C) 1999-2007 Daniel Diaz
| ?- 
4

1 回答 1

2

它始终是第一个被调用的规则,当变量未实例化时会导致这些错误。

你可以写

equation(RESULT, NUMERATOR, DENOMINATOR) :-
        nonvar(NUMERATOR), nonvar(DENOMINATOR), !,
        RESULT is NUMERATOR // DENOMINATOR.

equation(RESULT, NUMERATOR, DENOMINATOR) :-
        nonvar(DENOMINATOR), nonvar(RESULT), !,
        NUMERATOR is DENOMINATOR * RESULT.

equation(RESULT, NUMERATOR, DENOMINATOR) :-
        nonvar(NUMERATOR), nonvar(RESULT), !,
        DENOMINATOR is NUMERATOR // RESULT.

或者,更好的是,进入约束规划

:- [library(clpr)].
ohm(V, R, I) :- {V = R * I}.

产生

17 ?- ohm(20,N,10).
N = 2.0 .

编辑

~$ gprolog
GNU Prolog 1.3.0
By Daniel Diaz
Copyright (C) 1999-2007 Daniel Diaz

| ?- [user].
compiling user for byte code...
ohm(V,R,I) :- V #= R * I.

user compiled, 2 lines read - 338 bytes written, 23339 ms

(4 ms) yes
| ?- ohm(1,10,10).

no
| ?- ohm(V,10,10).

V = 100

yes
| ?- ohm(5,X,10). 

no
| ?- ohm(30,X,10).
于 2013-05-16T21:40:37.630 回答