Prolog:解决多变量算术

时间:2015-04-01 01:19:50

标签: prolog

我在编写Prolog谓词时遇到问题,该谓词返回某些算术的变量值。

例如,函数应该从等式中返回x和y的含义:12 = 3x + 2y。

目前我的代码只能以相反的方式工作:

foo(S,X,Y) :- 
   S is 3*X+2*Y.

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

根据您所在的建模域,使用以下其中一项:

  • 表示整数

  • 用于任意精确有理数

  • 用于有限精度的“实数”,通常用浮点值近似

  • 表示布尔值

以下是使用处理整数的方法:

# controller
def action_show
  @user = User.current_user
end

def action_admin_only
  @user = User.current_user
  if @user.admin?
    # complete the action
  end
end

private
#Must use strong params

# helper
def current_user
    if (user_id = session[:user_id])
        @current_user ||= User.find_by(id: user_id)
    end
end

# View
<% if user.admin? %>
  <%= link_to "Delete", model_path, method: :delete, class: "button" %>
<% end %>

让我们看看一些示例查询!

首先:地面查询。

:- use_module(library(clpfd)).

foo(S,X,Y) :- 
   S #= 3*X+2*Y.

接下来:一些带有单变量的查询。

?- foo(X,1,2).
X = 7.

?- foo(1,X,2).
X = -1.

?- foo(1,23,X).
X = -34.

?- foo(1,2,X).
false.

然后,在多个地方使用一个变量的查询:

?- foo(X,X,X).
X = 0.

最后:一些更一般的查询。

?- foo(1,23,-34).
true.

?- foo(1,23,-2).
false.

对于任意精度有理数,请使用

?- foo(S,X,2).
S#=3*X+4.

?- foo(S,X,Y).
S#=3*X+2*Y.

对于浮点数的关系,请使用

:- use_module(library(clpq)).

?- foo(X,X,X).
X = 0.

?- foo(1,2,X).          % a similar query failed with clp(FD)
X = -5 rdiv 2.          % arbitrary-precision solution

?- foo(S,X,Y).
{Y=1 rdiv 2*S-3 rdiv 2*X}.

示例查询:

:- use_module(library(clpr)).

foo(S,X,Y) :- 
   { S = 3*X+2*Y }.

答案 1 :(得分:0)

您可以继续使用var / 1谓词进行检查 是否输出参数:

foo(S, X, Y) :- var(X), !, X is (S-2*Y)/3.
foo(S, X, Y) :- var(Y), !, Y is (S-3*X)/2.
foo(S, X, Y) :- S is 3*X+2*Y.

以下是使用SWI-Prolog运行的示例:

?- foo(S, 1, 2).
S = 7.
?- foo(7, X, 2).
X = 1.
?- foo(7, 1, Y).
Y = 2.

最好的问候