【人工智能基础】经典逻辑与归结原理

本章节的大部分内容与离散数学的命题谓词两章重合。

假言推理的合式公式形式

R,R→P⇒PR,¬R∨P⇒P

链式推理 

R→P,P→Q⇒R→Q¬R∨P,¬P∨Q⇒¬R∨Q

互补文字:P和¬P 

亲本子句:含有互补文字的子句 ¬R∨P,¬P∨Q为亲本子句

注意:

  • 必须化成析取范式才能归结
  • 子句之间的逻辑关系是合取关系
  • (子句间合取,子句内析取)

可以通过把给定条件与待证结果的非进行合取,若归结结果为空,则得证,如:

已知规则:如果机器人有电,并且货物没有超重,则机器人可以移动货物。

现在已知:机器人有电,且机器人无法移动货物

求证:货物超重

证明过程:

定义 电池有电为BatteryOk,货物超重为OverWeight,机器人能够移动货物为Move。

我们可以列出

1.

已知条件 Battery_Ok,¬Move

2.

已知规则 BatteryOk∧¬OverWeight→Move =¬(BatteryOk∧¬OverWeight)∨Move =¬BatteryOk∨OverWeight∨Move

3.

结论:OverWeight 结论的非为¬OverWeight

归结过程如下: 

归结过程

 归结结果为空,结论超重得证。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
人工智能归结原理是一种基于逻辑推理的推导算法,其核心思想是将问题表示为一组逻辑公式,然后通过逻辑推理来推导出问题的答案。以下是一个简单的归结原理的C语言代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_CLAUSES 100 #define MAX_LITERALS 100 typedef struct { int literals[MAX_LITERALS]; int num_literals; } clause; clause clauses[MAX_CLAUSES]; int num_clauses = 0; int resolve(int c1, int c2, int p) { int i, j, k; int resolved = 0; for (i = 0; i < clauses[c1].num_literals; i++) { if (clauses[c1].literals[i] == p) { for (j = 0; j < clauses[c2].num_literals; j++) { if (clauses[c2].literals[j] == -p) { clause new_clause; for (k = 0; k < clauses[c1].num_literals; k++) { if (k != i) { new_clause.literals[new_clause.num_literals++] = clauses[c1].literals[k]; } } for (k = 0; k < clauses[c2].num_literals; k++) { if (k != j) { new_clause.literals[new_clause.num_literals++] = clauses[c2].literals[k]; } } clauses[num_clauses++] = new_clause; resolved = 1; } } } } return resolved; } int resolution(int p) { int i, j; int resolved = 0; for (i = 0; i < num_clauses; i++) { for (j = i + 1; j < num_clauses; j++) { if (resolve(i, j, p)) { resolved = 1; } } } return resolved; } int main() { char input[100]; while (fgets(input, sizeof(input), stdin)) { clause new_clause; char *token = strtok(input, " "); while (token) { int literal = atoi(token); new_clause.literals[new_clause.num_literals++] = literal; token = strtok(NULL, " "); } clauses[num_clauses++] = new_clause; } int p; printf("Enter a literal to resolve: "); scanf("%d", &p); if (resolution(p)) { printf("Resolved!\n"); } else { printf("Not resolved.\n"); } return 0; } ``` 该代码实现了一个简单的归结原理算法,可以读入一组逻辑公式,然后通过输入一个字面量来进行归结。如果能够通过归结得到空子句,则说明原始公式集合不可满足。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值