我在编写Prolog谓词时遇到问题,该谓词返回某些算术的变量值。
例如,函数应该从等式中返回x和y的含义:12 = 3x + 2y。
目前我的代码只能以相反的方式工作:
foo(S,X,Y) :-
S is 3*X+2*Y.
有什么想法吗?
答案 0 :(得分:2)
根据您所在的建模域,使用以下其中一项:
以下是使用clpfd处理整数的方法:
# 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.
对于任意精度有理数,请使用clpq:
?- foo(S,X,2).
S#=3*X+4.
?- foo(S,X,Y).
S#=3*X+2*Y.
对于浮点数的关系,请使用clpr:
:- 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.
最好的问候