我正在为离散数学设计一个类库,但我想不出一种方法来实现 infinite set .
到目前为止我所拥有的是:我有一个抽象基类 Set,它实现了接口(interface) ISet。对于有限集,我派生了一个 FiniteSet 类,它实现了每个 set 方法。然后我可以像这样使用它:
FiniteSet<int> set1 = new FiniteSet<int>(1, 2, 3);
FiniteSet<int> set2 = new FiniteSet<int>(3, 4, 5);
Console.WriteLine(set1); //{1, 2, 3}
Console.WriteLine(set2); //{3, 4, 5}
set1.UnionWith(set2);
Console.WriteLine(set1); //{1, 2, 3, 4, 5}
现在我想表示一个无限集。我有从集合派生另一个抽象类 InfiniteSet 的想法,然后使用该库的开发人员必须从 InfiniteSet 派生来实现他们自己的类。我会提供常用的集合,例如 N、Z、Q 和 R。
但我不知道如何实现像 Subset 和 GetEnumerator 这样的方法 - 我什至开始认为这是不可能的。您如何以实用的方式枚举无限集,以便您可以将它与另一个无限集相交/合并?如何在代码中检查 N 是 R 的子集?至于基数问题……好吧,那可能是一个单独的问题。
所有这些使我得出结论,我实现无限集的想法可能是错误的方法。非常感谢您的意见:)。
编辑:为了清楚起见,我还想表示不可数的无限集。
Edit2:我认为重要的是要记住最终目标是实现 ISet,这意味着任何解决方案都必须提供(它应该)实现所有 ISet's methods 的方法。 ,其中最有问题的是枚举方法和 IsSubsetOf 方法。
最佳答案
不可能完全实现ISet<T>对于不可数无限集。
这是一个证明(由 Bertrand Russell 提供):
假设您创建了一个类 MySet<T>可以表示一个不可数的无限集合。现在让我们考虑一些MySet<object>对象。
我们标记一个特定的 MySet<object> , 称之为 instance , "异常"如果:
instance.Contains(instance)返回真。
类似地,我们将标记为 instance作为“正常”,如果:
instance.Contains(instance)返回 false。
请注意,此区分对于所有 instance 都是明确定义的.
现在考虑 MySet<MySet<object>> 的一个实例称为 paradox .
我们定义paradox作为 MySet<MySet<object>>其中包含 MySet<object> 的所有可能正常实例.
应该做什么paradox.Contains(paradox)返回?
如果返回true , 然后 paradox是异常,应该返回false当被调用时。
如果返回false然后paradox是正常,应该返回true当被调用时。
没有办法实现Contains解决这个悖论,所以没有办法完全实现ISet<T>对于所有可能的不可数集。
现在,如果您限制 MySet<T> 的基数等于或小于连续统的基数 (|R|),那么您将能够绕过这个悖论。
即便如此,您也无法实现 Contains或类似的方法,因为这样做等同于解决停机问题。 (请记住,所有 C# 程序的基数等于 |Z| <>
编辑
为了更彻底,这里是对我的断言“这样做等同于解决停机问题”的解释。
考虑 MySet<string>它由所有在有限时间内停止的 C# 程序(作为字符串)组成(准确地说,假设它们因任何输入而停止)。叫它paradox2 .该集合是 *递归可枚举的”,这意味着您可以在其上实现 GetEnumerator(不容易,但有可能)。这也意味着它定义明确。但是,这个集合不是“可判定的”,因为它的补码是不可递归枚举。
定义一个C#程序如下:
using ... //Everything;
public static class Decider {
private MySet<string> _haltingSet = CreateHaltingSet();
static void Main(string [] args) {
Console.WriteLine(_haltingSet.Contains(args[0]));
}
}
编译上述程序,并将其作为输入传递给自身。会发生什么?
如果您的 Contains方法被正确实现,那么你就解决了停机问题。但是,我们知道那是不可能的,所以我们只能得出结论,不可能正确实现 Contains。 , 即使是可数无限集。
您可以限制您的 MySet<T>为所有人工作的类(class)decidable sets.但是,您仍然会遇到函数从不在有限时间内停止的各种问题。
例如,假设我们有一个名为 Real 的任意精度实数类型,让我们nonHalting是 MySet<Real> 的实例其中包括黎曼 Zeta 函数的所有非平凡零点(这是一个可判定集)。如果你能正确实现 IsProperSubsetOf在 nonHalting当通过实部为 1/2 的所有复数集(也是可判定集)时,在有限的时间内返回,那么您将赢得 Millennium Prize.
关于c# - 如何实现无限集合类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11659678/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为