逻辑问题求解程序

https://github.com/bajdcc/jProlog

jProlog - A Simple Solver (Java)

===========================

0x00 Introduction / 介绍

jProlog is a language describing simple logical problems, using exhaustion to find solutions. Developed by bajdcc.

jProlog 是一个简易的逻辑问题解答程序,主要运用穷举法搜寻解空间,因而时间复杂度受变量数量和长度影响,因而有待优化。

0x01 Grammar / 语法

QUICK: See ANTLR Grammar File(.g4) at Prolog.g4

PS. Supporting Chinese.

I. Define Values of a Collection / 定义集合的值

COLLECTION_NAME{} = {val1,val2,...};
or
集合名称{} = {值1,值2,...};

COLLECTION_NAME, alias Type

example:

所有人{} = {"埃夫里","布莱克","克朗","戴维斯","其他人"};
Digit{} = {0..9};

II. Define Single Variable / 定义单变量

COLLECTION_NAME var1,var2,...;
or
集合名称 变量名1,变量名2,...;

example:

时间 死亡时刻;
Digit A,B,C;

Note: System will searching in the SPACE of O(n), where n is Elements of a Type or Math Function card(type);

III. Define Sequence Variable / 定义序变量

COLLECTION_NAME var1[],var2[],...;
or
集合名称 变量名1[],变量名2[],...;

example:

时间 序列[];
Digit A[],B[],C[];

Note: System will searching in the SPACE of O(n!), where n is card(type);

IV. Define Argument Variable / 定义参变量

COLLECTION_NAME var1(Type1,Type2,...),var2(Type1,Type2,...),...;
or
集合名称 变量名1(参数类型1,参数类型2,...),变量名2(参数类型1,参数类型2,...),...;

example:

时间 在寓所(所有人);
Digit Score(Everyone);

Note: System will searching in the SPACE of O(pow(n,t)), where n is card(type) and t is The Product of card(type1), card(type2), ...;

V. Settings / 设置

usage:

设置(多解);
设置(定时,1000);
设置(版权,"Copyright");

or (DIY)

settings1(...);
settings2(...);

Note: If you want to DIY them, modify RtSettingFunc.java. Edit attribute ‘desc‘ of SettingType. Extend method ‘dealWithSettingId‘ if you want to add new features. The setting function will apply settings in RtSettings.java.

VI. Print / 输出

usage:

输出("foo", bar);
输出("foo", func((bar == 4) + 7, val3 9);

or (DIY)

print(...);

Note: A Print Func will call println in the end.

VII. Quantity / 量词

usage:

存在 x 属于 集合1, 任意 y 属于 集合2, ..., 逻辑表达式;

or (DIY)

exists x in type1, any y in type2, ..., logical expression;

Note: Use of quantity will increase the complexity of solutions, leading to waiting for long time to see the results.

VIII. Fixed, Pruning / 固定值,剪枝

usage:

参变量(参数...) = 字串 或 数值;

or

Argument_Variable(param1,...) = String or Integer;

Note: Use of fixed will decrease the complexity of solutions.

IX. Mutex / 互斥

usage:

互斥(逻辑表达式1.逻辑表达式2,...);

or (DIY)

Mutex(Logical_exp1,Logical_exp2,...);

Note: Use of Mutex will increase the complexity of solutions. Use Sequence Variable instead if possible.

X. Customize / 自定义函数

usage:

函数(逻辑表达式1.逻辑表达式2,...);

or

Func(Logical_exp1,Logical_exp2,...);

Note: See Enum ‘FuncType‘ in RtFuncFactory.java.

0x02 Design / 设计

I. Designing DSL / 设计领域特定语言

The Grammar of jProlog is referred to 智能通用逻辑问题解题器 ZnlogWin. You can find it by Google or Baidu. Znlog is compiled by VC6.0. I have read its grammar.

I use ANTLR to analyze the input and generate a simple parse tree. Then, I convert it to an AST. The difference between Original Tree and AST is String Factory and Semantic Analysis.

II. Original Parse Tree / 原始语法树

I generate OPT from PrologBaseVisitorImpl.java. You can serialize OPT by calling toString method.

III. String Factory / 字串工厂

I made a String Map from OPT. The String Factory is used to store any infomation of Variable Name and Literal String and then return an id. It made Semantic Analysis possible. Besides, it will be used in Code Generation, which I haven‘t done yet.

IV. Semantic Analysis / 语义分析

ANTLR does not do semantic analysis. So I need to complete it by myself.
The exception of semantic problem is SemanticException.java.

V. AST / 抽象语法树

The most complex work is to convert OPT to AST. I use Visitor Pattern and Stack to do semantic analysis, tree generation and maintenance of string factory at the same time. The AST is too abstract to be implemented carefully on toString method.

The converting work is in RtBlock.java.

VI. Sequence Generator / 序列生成器

The underlying base of system running successfully is Sequence Generator.

  1. With repetition and 1D
  2. With repetition and nD, where n > 1
  3. Without repetition

Generator 1 and 2 is made by exhaustion. I implemented Fixed feature by using a HashSet and skipping if its position is to be changed in a Foreach loop.

If one wants to generate a non-repetitive sequence, he should see std::next_permutation written in C++. I implemented it with Java.

The Sequence Generator can be clone for storage of results, because system may find multiple solutions.

VII. Runtime Environment / 运行时环境

The Environment object is passed to all of RtExp/RtToken/RtFunc, because the Env include the most infomation of runtime. If system find one solutions, it will clone the env and save it.

VIII. Gui Application / 界面

In Swing, system is running in a background thread instead of main Gui thread. I used SwingWork<t, v="">. Besides, PrologDialog needs support of JRE8.

0x03 Interface / 接口

I. Query / 查询

Usage:

IRtQueryAnswer query = PrologExecutor.getInstance().run(input_context);
query.queryValue(id, var, params);

  • id: The ordinal of results, default is 0. If multi-answer is turned on, the id is valid.
  • var: Name of variable.
  • params: Array index, or parameters of argument variable. The type of param is eithor String or Integer.

Exception: SemanticException

II. Global Settings / 全局设置

See PrologExecutor.java.

  • out: Set output stream, whose type is PrintStream.
  • future: For interruption, e.g., Stop Action of Gui.

If one wants to redirect the output stream to JTextArea. He can use SwingWorker to set the output stream to a new stream whose ‘write‘ method is overridden to print the messages on JTextArea.

The future is Future, used for interruption where current thread is not Gui thread.

0x04 Example / 例子

Screenshot

Screenshot 1 - Lie1

Screenshot 2 - Gougu

时间: 2024-10-25 13:17:40

逻辑问题求解程序的相关文章

Theano学习笔记(二)——逻辑回归函数解析

有了前面的准备,能够用Theano实现一个逻辑回归程序.逻辑回归是典型的有监督学习. 为了形象.这里我们如果分类任务是区分人与狗的照片. 首先是生成随机数对象 importnumpy importtheano importtheano.tensor as T rng= numpy.random 数据初始化 有400张照片,这些照片不是人的就是狗的. 每张照片是28*28=784的维度. D[0]是训练集.是个400*784的矩阵,每一行都是一张照片. D[1]是每张照片相应的标签.用来记录这张照

每个程序员都应该了解的 CPU 高速缓存

每个程序员都应该了解的 CPU 高速缓存 英文原文:Memory part 2: CPU caches 来源:oschina [编者按:这是Ulrich Drepper写“程序员都该知道存储器”的第二部.那些没有读过第一部 的读者可能希望从这一部开始.这本书写的非常好,并且感谢Ulrich授权我们出版. 一点说明:书籍出版时可能会有一些印刷错误,如果你发现,并且想让它在后续的出版中更正,请将意见发邮件到[email protected] ,我们一定会更正,并反馈给Ulrich的文档副本,别的读者

Java程序员转Android开发必读经验

小编最近几日偷偷的发现部分Java程序员想转安卓开发,故此加紧补充知识,为大家搜集资料,积极整理前人的经验,希望可以给正处于困惑中的你,带来些许的帮助. 啰哩啰嗦的说说Java和Android程序的区别: Android是主流智能手机的操作系统,Java是一种开发语言,两者没有好坏优劣之分,只是两种职业岗位的选择.学安卓从事移动互联方向开发,学Java从事软件.网站开发.而安卓上的应用大多是Java编写的,所以建议在安卓前期的Java学习阶段中,要用心学好. 言简意赅的说说“转”前的准备: 其实

Java程序员转Android开发必读经验分享

摘要:DevStore小编最近几日偷偷的发现部分Java程序员想转安卓开发,故此加紧补充知识,为大家搜集资料,积极整理前人的经验,希望可以给正处于困惑中的你,带来些许的帮助. 啰哩啰嗦的说说Java和Android程序的区别: Android是主流智能手机的操作系统,Java是一种开发语言,两者没有好坏优劣之分,只是两种职业岗位的选择.学安卓从事移动互联方向开发,学Java从事软件.网站开发.而安卓上的应用大多是Java编写的,所以建议在安卓前期的Java学习阶段中,要用心学好. 言简意赅的说说

python基础作业------模拟实现一个ATM + 购物商城程序

模拟实现一个ATM + 购物商城程序 作业需求: 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息 支持多账户登录 支持账户间转账 记录每月日常消费流水 提供还款接口 ATM记录操作日志 提供管理接口,包括添加账户.用户额度,冻结账户等... 用户认证用装饰器 ## ATM信用卡购物模拟程序 ### 作者介绍: * author:高原 ### 功能介绍: 模拟实现一

ABAP表抛FTP通用程序

主要功能: 1.支持R3所有表(标准.自建)下传,下传方式为FTP 2.支持输出字段选择及顺序调整 3.支持动态条件,不同的表会有不同的选择条件,根据不同的条件选择需要下传的数据 4.支持单表.多表.以及输出数据再次加工(需自己写输出逻辑扩展程序,可参考YTEMPLET) 5.支持多表查询,及多表查询的动态选择条件 6.支持大数据量表分批取数.以及分批下传(已通过BSEG大数据量表测试) 7.支持单文件下传(只生产一个文件,默认是分批下传,会产生多个文件) 8.其它支持参看选择屏幕 程序创建好后

pl/sql程序语言

pl/sql程序基础知识: pl/sql(procedural language/sql)oracle在标准sql上面的扩展,不仅简单的sql语句,还具有一般语言的特性:变量,常量,流程控制和循环,错误处理机制.是一个功能完善强大的过程化语言. 它的编程基本单位是块,复杂的功能都是多个块组成 我们来看看它的实列代码: 块结构: declear --定义部分,可选 /*定义部分--变量,常量,游标,异常,复杂数据类型*/ begin --执行部分 /*pl/sql语句和SQL语句;*/ excep

数据流图 系统流程图 程序流程图 程序的系统结构图之间的区别和联系

1.数据流图(Data Flow Diagram) 坚持更DFD,它从数据的传递和加工角度,以图形方式来表达系统的逻辑功能,数据在系统内部的逻辑流向和逻辑交换过程,是结构化系统分析方法的主要表达工具及用于表示软件模型的一种图示放大.它是描绘信息流和数据从输入移动到输出的过程中所经受的变换 数据流图的基本元素: 例图: 2.系统流程图(System Flowchart) 描绘系统物理模型的传统工具.他的基本思想是用图形符号以黑盒子的形式描绘系统理念的每个部件包括程序,文件,数据库,表格,人工过程等

逻辑正确的重要性

逻辑正确的重要性 源自近一个月的项目,在程序逻辑方面犯了错误,原地打转拖延了进度,也由此深刻认识到逻辑对于程序的重要性.        一.项目进度 (1)前期:搭建环境(自己的环境&竞争对手的环境),验证对手的环境能够跑正确,我们的环境下会出bug. (2)中期:分析出我们的环境为什么会有bug?分析角度:抓包.前台日志.后台日志跟踪.基本确定程序出bug的大致范围. (3)后期:从日志跟踪搜索代码,确定出错代码的位置.思考为什么为会出错,是逻辑错误?还是语法错误?还是--.完成代码修改并Fi