【问题标题】:prolog: Trying to model equation with 3 rules - how to get prolog to match the right one?prolog:尝试使用 3 条规则对方程建模 - 如何让 prolog 匹配正确的规则?
【发布时间】:2013-05-16 21:26:39
【问题描述】:

我正在尝试建模一个简单的 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

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

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

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

版本信息如下:

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

【问题讨论】:

标签: prolog


【解决方案1】:

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

你可以写

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.

或者,更好的是,输入constraint programming

:- [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).

【讨论】:

  • 非常感谢:虽然这里有些奇怪:等式(1,10,10)显然是“不”......但等式(10//10,10,10)是“是的'...我似乎没有约束库(但那些看起来很棒,我会研究它们)。
  • 你用的是什么 Prolog?
  • GnuProlog 有一个很好的 finite 约束求解器。可以用于整数值 - 但可以将其调整为定点算术。
  • 太棒了 - 确实有效 - 感谢您向我介绍约束的东西!
  • 在尝试给定的示例时,它似乎在步骤compiling user for byte code... 中挂在我的机器上。您对我如何解决此问题有任何指示吗?我使用了 gnu-prolog v. 1.4.5(通过自制软件安装在 mac os. 10.15, 64bit 上)。
猜你喜欢
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
相关资源
最近更新 更多