English 中文(简体)
为一套制约因素编制满足价值清单
原标题:Generating lists of satisfying values for a set of constraints
  • 时间:2010-08-31 16:13:12
  •  标签:
  • prolog

鉴于一系列制约因素,我谨高效地产生一套价值观。

附录一

goodThungus(X) :-
               X > 100,
               X < 1000.
               sin(X) = 0.

现在,我可以问:

goodThungus(500).

我愿产生所有良好的Thungi。 我不敢确定如何做到这一点;我不敢肯定如何有效地做到这一点。

注:这当然必须是可计算费用的一代。

*** 选择了这个例子的任意物体。

问题回答

你们要求做的是,在普通情况下,可以做些什么:想象做(X)=0,如果是无法分析地确定根源的职能。 Or suppose f(X)是“使方案X停止? 你们不会用电脑解决问题。

你们的选择基本上是:

  • 限制对你可以解释的事物的一套限制。 例如,不平等是好的,因为你可以确定范围,然后在幅度上进行交叉和结合等。

  • 将一套价值限制在足够数量的水平上,以便你能够单独测试这些数值,以克服每个制约因素。

最新资料:关于问题所述制约因素(可分析解决的实际价值和真正价值的职能,并在任何范围找到一定数量的解决方案) 我建议采取以下做法:

  • Write a generating function that can iteratively return solutions for you function within a given range... this will need to be done analytically e.g. exploiting the fact that sin(X)=0 implies X=n*pi where n is any integer.
  • Do interval arithmetic and bounding on your range constraints to work out the range(s) that need to be scanned (in the example you would want the range 100 < X < 1000)
  • Apply your generating function to each of the target ranges in order to create all of the possible solutions.

我赞同我的建议,指出我没有专家使用数字逻辑拟定系统,但这里是......。

在表面上,我认为在PROLOG中解决这类问题最符合数字限制逻辑拟定制度,perhaps<>em>,例如CLP(R)(针对真实情况);不幸的是,你要求解决的具体问题是争取解决一系列制约因素,包括非线性限制,这些制约因素似乎在PROLOG中没有得到广泛支持。

图书馆:

:- use_module(library(clpr)).

report_xsq_zeros :-
    findall(X, {0 = (X * X) - 10}, Results),
    write_ln(Results).

report_sin_zeros :-
    findall(X, {0 = sin(X)}, Results),
    write_ln(Results).

现在执行<代码>report_xsq_zeros 我们:

 ?- report_xsq_zeros.
[3.16228, -3.16228]
true.

在此,该系统正确地计算了缩略语的零件:<条码>x^2 - 10,这些缩略语实际上约为<条码>3.16228和<条码>-3.168,其中<条码>X>/代码>的范围没有限制。 然而,当我们执行<代码>report_sin_zeros <>/code>时,我们发现:

 ?- report_sin_zeros.
[0.0]
true.

我们认为,尽管<代码>X的范围的确也不受约束,但该系统仅计算了<代码>sin(X)的单一零。 或许是因为人们认识到,这里有一些解决办法(但我只想......)。 如果我们要规划你要求的东西:

report_sin_zeros :-
    findall(X, {X > 100, X < 1000, 0 = sin(X)}, Results),
    write_ln(Results).

我们没有取得任何成果,因为基本系统只计算了上面所示的<代码>sin(X)的单一零(即具有约束力的<代码>X至0.0,而该编码系统不在规定范围之内):

 ?- report_sin_zeros.
[]
true.

我最后说,我要么没有证明适当使用SWI-PL CLP(R)(我建议你看一下它),就解决了你的特殊(非线性)问题。 其他CLP(R)执行方式可能与SWI-PROLOG CLP(R)不同,但我没有安装,因此我可以检查,但你可以尝试或他人; syntax看起来类似。

他是在[100.1000]寻找任何X(x)=0,但这是一个纯粹的数学问题,并不是说是相对逻辑的扣除/回溯。 简单 道歉不适于这样做?





相关问题
Prolog : Learning by example

I am trying to learn a little bit about swi-prolog (beyond the basic, useless programs). Can anyone explain (perhaps in pseudocode) what this sudoku solver and the related functions are doing? If ...

Working with lists in Prolog

First off let me state that this is part of a class exercise given as homework. But, the entire assignment is much more involved than the subject of this question. So.. I am searching through two ...

SWI-Prolog conditional statements

I m trying to write a function that will test to see if the word hello is contained in a list. If it is contained, i don t want it to say "true", i want it to say : "yes, the word hello is contained ...

prolog cut off in method

I have a question I would like to ask you something about a code snippet: insert_pq(State, [], [State]) :- !. insert_pq(State, [H|Tail], [State, H|Tail]) :- precedes(State, H). insert_pq(State, [...

Max out of values defined by prolog clauses

I know how to iterate over lists in Prolog to find the maximum, but what if each thing is a separate clause? For example if I had a bunch of felines and their ages, how would I find the oldest kitty? ...