我想知道是否有一种算法可以有效地计算离散的一维 Minkowski和.Minkowski总和定义为:
S + T = { x + y | x in S, y in T }
Run Code Online (Sandbox Code Playgroud)
可能是我们可以将集合表示为列表,对S和T进行排序,然后类似于计算两个集合的并集.即并行地沿着集合行走并生成结果.
是否有已知的算法,我不必另外对结果进行排序以删除重叠的情况x1 + y1 = x2 + y2?最好用Java配制?
我的任务是在Prolog中实现一个版本的findall而不使用任何Prolog内置函数,除了not和cut - 所以基本上是纯Prolog.
我正在尝试在树中搜索所有直接后代并将结果返回到列表中
parent(a, b).
parent(b, c).
parent(b, d).
parent(e, d).
Run Code Online (Sandbox Code Playgroud)
到目前为止我所拥有的是:
find(X, L) :- find2(X, [], L).
find2(X, Acc, L) :- parent(Y, X), find2(Y, [Y|Acc], L).
find2(_, Acc, Acc).
Run Code Online (Sandbox Code Playgroud)
我输入的时候想要的是:
find(a,X).
Run Code Online (Sandbox Code Playgroud)
将会:
X = [b, c, d]
Run Code Online (Sandbox Code Playgroud)
(顺序不重要)
但是我得到了:
X = [b, c] ;
X = [b, d] ;
X = [b] ;
X = [].
Run Code Online (Sandbox Code Playgroud)
我是Prolog的新手,所以对此有任何帮助都会非常感激.
谢谢
是否有一些算术或按位运算可以检查双精度是否适合浮点而不会损失精度.
它不仅要检查双范围是否在浮点范围内,还要检查没有尾数位丢失.
再见
PS:这回答了C#中途的问题: 如何在不转换为无限的情况下检查双精度是否适合浮点 但是我需要一个适用于Java的解决方案.
许多Prolog系统都有一个freeze/2谓词,一个应该有名字的谓词,geler/2因为它甚至是在Prolog-II之前发明的.
假设我对同一个变量有条件,但有两个不同的目标,即:
?- freeze(X, G1), freeze(X, G2), X=1.
Run Code Online (Sandbox Code Playgroud)
什么是首选的唤醒策略,G1首先执行还是G2首次执行?如果G1和G2确实会产生新的冻结,这也会被唤醒:
G1 :- freeze(Y, G3), Y=1.
G2 :- freeze(Z, G4), Z=1.
Run Code Online (Sandbox Code Playgroud)
G3或G4是否始终在G1和G2之间执行,或者可能是G1和G2之后执行G3或G4,甚至是以后的任何时间?
再见
围绕dif/2约束存在很多炒作,特别是作为对(\ =)/ 2和(\ ==)/ 2的一些非声明性的拯救.这种非声明性通常被描述为非单调性,并给出了非交际性的例子.
但是,测试涉及dif/2的测试用例是否可交换的方法是什么.以下是我想要做的元解释:
我进行了交换性测试,我想探究两种变体给出相同的结果:
Run Code Online (Sandbox Code Playgroud)?- A, B. -- versus -- ?- B, A.
所以通常你可以用(==)/ 2内置谓词检查单调性,如果它归结为检查交换性.由于此谓词遵循实例化变量.
但是,如果您正在测试产生约束的情况,call_with_residue/2是不够的,您还需要具有相等的约束.这可能很棘手,如下例所示:
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.23)
Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam
?- dif(f(X,X),f(a(U,g(T)),a(g(Z),U))), X=a(g(Z),U).
X = a(g(Z), U),
dif(f(a(g(Z), U), U, Z, U, T), f(a(U, g(T)), g(Z), T, g(Z), Z)).
?- X=a(g(Z),U), dif(f(X,X),f(a(U,g(T)),a(g(Z),U))).
X = a(g(Z), U),
dif(f(U, T), f(g(Z), Z)).
Run Code Online (Sandbox Code Playgroud)
任何想法如何进行?
免责声明,它是一个陷阱:
我不认可交换性测试作为一种好的测试方法,在这种方法中你可以将好的和坏的谓词与规范分开.因为通常好的和坏的谓词都可能没有交换性问题.
我正在使用交换性测试作为一种工具来找出有关dif/2约束相等的方法.然后,可以在更传统的测试用例中将此等式用作验证点.
我在这个语法中有一个左递归的小问题.我正在尝试在Prolog中编写它,但我不知道如何删除左递归.
<expression> -> <simple_expression>
<simple_expression> -> <simple_expression> <binary_operator> <simple_expression>
<simple_expression> -> <function>
<function> -> <function> <atom>
<function> -> <atom>
<atom> -> <number> | <variable>
<binary_operator> -> + | - | * | /
expression(Expr) --> simple_expression(SExpr), { Expr = SExpr }.
simple_expression(SExpr) --> simple_expression(SExpr1), binary_operator(Op), simple_expression(SExpr2), { SExpr =.. [Op, SExpr1, SExpr2] }.
simple_expression(SExpr) --> function(Func), { SExpr = Func }.
function(Func) --> function(Func2), atom(At), { Func = [Func2, atom(At)] }.
function(Func) --> atom(At), { Func = At }.
Run Code Online (Sandbox Code Playgroud)
我写过类似的东西,但它根本不起作用.如何更改它以使该程序正常工作?
I am curious about how tabling works to improve efficiency of Prolog programs. How is it implemented? Both explanation and references are welcome.
术语fib(N,F)当是真的F是N个Fibonacci数.
以下Prolog代码通常适用于我:
:-use_module(library(clpfd)).
fib(0,0).
fib(1,1).
fib(N,F) :-
N #> 1,
N #=< F + 1,
F #>= N - 1,
F #> 0,
N1 #= N - 1,
N2 #= N - 2,
F1 #=< F,
F2 #=< F,
F #= F1 + F2,
fib(N1,F1),
fib(N2,F2).
Run Code Online (Sandbox Code Playgroud)
执行此查询时(在SICStus Prolog中),找到第一个(并且正确)匹配N(而非立即):
| ?- fib(X,377).
X = 14 ?
Run Code Online (Sandbox Code Playgroud)
当进行(通过输入";")以查看是否还有其他匹配(根据定义是不可能的)时,需要花费大量时间(与第一次匹配相比),只是总是回答否:
| ?- fib(X,377).
X = 14 ? ;
no
Run Code Online (Sandbox Code Playgroud)
作为Prolog的新手,我尝试以!各种方式使用Cut-Operator(),但是在第一场比赛后我找不到阻止搜索的方法.根据上述规则,它是否可能?如果是的话,请告诉我如何:)
任何想法如何使Java Swing文件选择器在2K显示器上看起来更好看,其中Windows字体缩放比例> 125%?
我正在使用普通代码,例如:
JFileChooser fc = new JFileChooser();
if (settings.currentdir != null)
fc.setCurrentDirectory(new File(settings.currentdir));
int returnVal = fc.showOpenDialog((Window) holder);
if (returnVal == JFileChooser.APPROVE_OPTION) {
Run Code Online (Sandbox Code Playgroud)
但文件选择器仅显示列出的文件和目录的微小图标.我正在使用JDK 8.出了什么问题?
PS:问题的范围只是Windows,而不是Unix.在Windows上,两个默认的L&F,它们缩放字体.但他们不会缩放图标.应用程序必须这样做,因为它可能会使用不同的位图资源来实现更高的比例.似乎JFileChooser没有以这种方式编码.
但可能会指示JFileChooser这样做.我没有看到另一个问题涉及图标大小和Windows上的JFileChooser:如何在Windows/Linux上设置Java Swing应用程序的DPI?另一个问题涉及字体大小,这对于Windows上的JFileChooser而言不是两个Windows L&F中的一个问题.
我实现了函数来获取列表的子列表,例如:
sublist([1,2,4], [1,2,3,4,5,1,2,4,6]).
true
Run Code Online (Sandbox Code Playgroud)
sublist([1,2,4], [1,2,3,4,5,1,2,6]).
false
看看我的解决方案:
my_equals([], _).
my_equals([H1|T1], [H1|T2]) :- my_equals(T1, T2).
sublist([], _).
sublist(L1, [H2|T2]) :- my_equals(L1, [H2|T2]); sublist(L1, T2).
Run Code Online (Sandbox Code Playgroud)
你能给我另一种解决方案吗?也许存在一些预定义的谓词my_equals?
prolog ×7
java ×3
dcg ×2
algorithm ×1
backtracking ×1
clp ×1
clpfd ×1
fibonacci ×1
grammar ×1
jfilechooser ×1
list ×1
prolog-dif ×1
recursion ×1
set ×1
swi-prolog ×1
swing ×1
windows ×1