67 lines
2.1 KiB
C
Executable File
67 lines
2.1 KiB
C
Executable File
#include "ast.h"
|
||
|
||
term* sub_thm(term* thm, var_sub_list* list){
|
||
if(list == (void*) 0) return copy_term(thm);
|
||
if(thm->type == Quant){
|
||
term* den = list->cur->sub_term;
|
||
return sub_thm(subst_term(den, list->cur->var, thm->content.Quant.body), list->next);
|
||
}
|
||
else return (void*) 0;
|
||
}
|
||
|
||
// apply (apply (impl) h1) (h2)
|
||
//不是imply形式时返回(void*) 0
|
||
ImplyProp *separate_imply(term *t)
|
||
{
|
||
if (t->type != Apply || t->content.Apply.left->type != Apply ||
|
||
t->content.Apply.left->content.Apply.left->type != Const ||
|
||
t->content.Apply.left->content.Apply.left->content.Const.type != Impl)
|
||
return (void*) 0;
|
||
else
|
||
return createImplyProp(t->content.Apply.left->content.Apply.right, t->content.Apply.right);
|
||
}
|
||
|
||
//根据定理形式,匹配结论,得出要检验的前提
|
||
term_list* check_list_gen(term* thm, term* target) {
|
||
if (thm == (void*) 0 || target == (void*) 0) {
|
||
return (void*) 0;
|
||
}
|
||
term_list* check_list = (void*) 0;
|
||
term_list** tail_ptr = &check_list;
|
||
while (thm != (void*) 0 && !alpha_equiv(thm, target)) {
|
||
ImplyProp* p = separate_imply(thm);
|
||
if (p == (void*) 0) {
|
||
free_term_list(check_list);
|
||
return (void*) 0;
|
||
}
|
||
// 添加新节点到链表
|
||
term_list* new_node = malloc_term_list();
|
||
new_node->element = p->assum; // 转移所有权
|
||
new_node->next = (void*) 0;
|
||
|
||
*tail_ptr = new_node;
|
||
tail_ptr = &(new_node->next);
|
||
thm = p->concl;
|
||
free_imply_prop(p); // 释放ImplyProp结构体(不释放其成员)
|
||
}
|
||
return check_list;
|
||
}
|
||
|
||
|
||
solve_res* thm_apply(term* thm, var_sub_list* list, term* goal){
|
||
term* thm_ins = sub_thm(thm, list);
|
||
solve_res* res = malloc_solve_res();
|
||
if(thm_ins == (void*) 0) {
|
||
res->type = bool_res;
|
||
res->d.ans = false;
|
||
}
|
||
else if(alpha_equiv(thm_ins, goal)){
|
||
res->type = bool_res;
|
||
res->d.ans = true;
|
||
}
|
||
else{
|
||
res->type = termlist;
|
||
res->d.list = check_list_gen(thm_ins, goal);
|
||
}
|
||
return res;
|
||
} |