2

我正在使用模态SAT求解器。不幸的是,这个求解器使用的是 Flex 和 Bison,这两种语言我都没有掌握......

我想将一种语法更改为另一种语法,但我遇到了一些问题,即使在关于 Flex-Lexer 和 Bison 的教程之后也是如此。

所以这里是问题:

我希望能够解析这样的模态逻辑公式:

以模态逻辑中的逻辑问题为例

在以前的符号中,这样的公式是这样写的:

(NOT (IMP (AND (ALL R0 (IMP C0 C1)) (ALL R0 C0)) (ALL R0 C1)))

这里是用于解析它们的 Flex/Bisons 文件:

alc.y

%{

#include "fnode.h"

#define YYMAXDEPTH 1000000

fnode_t *formula_as_tree;

%} 

%union {
   int     l;
   int     i;
   fnode_t *f;  
}

/* Tokens and types */

%token LP RP
%token ALL SOME
%token AND IMP OR IFF NOT
%token TOP BOT
%token RULE CONC
%token <l> NUM 

%type <f> formula 
%type <f> boolean_expression rule_expression atomic_expression
%type <f> other
%type <i> uboolop bboolop nboolop ruleop
%type <l> rule 

%% /* Grammar rules */

input: formula {formula_as_tree = $1;}       
;

formula: boolean_expression {$$ = $1;}
| rule_expression {$$ = $1;}
| atomic_expression {$$ = $1;}
;

boolean_expression: LP uboolop formula RP 
{$$ = Make_formula_nary($2,empty_code,$3);}

| LP bboolop formula formula RP 
{$$ = Make_formula_nary($2,empty_code, Make_operand_nary($3,$4));}

| LP nboolop formula other RP 
{$$ = Make_formula_nary($2,empty_code,Make_operand_nary($3,$4));}
;

rule_expression: LP ruleop rule formula RP {$$ = Make_formula_nary($2,$3,$4);}
;

atomic_expression: CONC NUM {$$ = Make_formula_nary(atom_code,$2,Make_empty());}
| TOP {$$ = Make_formula_nary(top_code,empty_code,Make_empty());}
| BOT {$$ = Make_formula_nary(bot_code,empty_code,Make_empty());}
;

other: formula other {$$ = Make_operand_nary($1,$2);}
| {$$ = Make_empty();}
;

uboolop: NOT {$$ = not_code;}  
;

bboolop: IFF {$$ = iff_code;} 
|        IMP {$$ = imp_code;}
;

nboolop: AND {$$ = and_code;} 
|        OR  {$$ = or_code;} 
;

ruleop: SOME {$$ = dia_code;}
| ALL {$$ = box_code;}       

rule: RULE NUM {$$ = $2;}
;

%% /* End of grammar rules */

int yyerror(char *s)  
{
  printf("%s\n", s);
  exit(0);
}

alc.lex

%{
#include <stdio.h>

#include "fnode.h"
#include "y.tab.h"

int number;
%}

%%

[ \n\t] ;    
"("      return LP;
")"      return RP; 
"ALL"    return ALL;         
"SOME"   return SOME;
"AND"    return AND; 
"IMP"    return IMP;
"OR"     return OR;
"IFF"    return IFF;
"NOT"    return NOT;
"TOP"    return TOP;
"BOTTOM" return BOT;
"R"      return RULE;
"C"      return CONC;

0|[1-9][0-9]* {   
  sscanf(yytext,"%d",&number);
  yylval.l=number;
  return NUM;
}

.  { 
  /* Error function */
  fprintf(stderr,"Illegal character\n");
  return -1;
}
%%

现在,让我们编写我们的示例,但使用我想使用的新语法:

begin
(([r0](~pO | p1) & [r0]p0) | [r0]p1) 
end

阻碍我正确解析这种新语法的主要问题是:

  • IMP (A B)现在写成~B | A(如在布尔逻辑中(A => B) <=> (~B v A))。
  • ALL RO现在写[r0]
  • SOME RO现在写<r0>
  • IFF (A B)现在写(~B | A) & (~A | B)。(IFF代表for if and only if

这是新符号的小列表,即使我不知道如何解析它们:

"("      return LP;
")"      return RP; 
"[]"    return ALL;         
"<>"   return SOME;
"&"    return AND; 
"IMP"    return IMP;
"|"     return OR;
"IFF"    return IFF;
"~"    return NOT;
"true"    return TOP;
"false" return BOT;
"r"      return RULE;
"p"      return CONC;

我假设只有这两个文件会改变,因为它应该仍然能够通过使用其他 .y 和 .lex 编译源代码来读取以前的语法

但我要求您帮助确切地知道如何写下来:/

提前致谢 !

4

2 回答 2

1

Tommi Junttila 的BC 包使用和实现了一种用于Boolean表达式和电路的语言。BisonFlex

学习源文件并不能完全取代通过适当的Bison/Flex教程,但它肯定会给你一个好的开始。

于 2015-07-14T15:05:34.200 回答
0

对于会遇到完全相同问题的人(我认为这个问题非常罕见:))

有了好的词汇量,用谷歌搜索问题并找到解决方案就容易多了。

第一个符号

(NOT (IMP (AND (ALL R0 (IMP C0 C1)) (ALL R0 C0)) (ALL R0 C1)))

ALC 格式

另一种记法

begin (([r0](~pO | p1) & [r0]p0) | [r0]p1) end

InToHyLo格式。

还有一个名为公式翻译工具(“ftt”)的工具与 Spartacus 一起开发并捆绑在一起(http://www.ps.uni-saarland.de/spartacus/)。它可以在证明者的所有格式之间进行转换。

使用这个工具是避免使用 Flex/Bison 语言的小技巧。

一个人只需要将一个问题翻译成另一个问题,问题将是等价的,而且翻译速度非常快。

于 2015-07-16T08:50:13.973 回答