已知: (1)能阅读者是识字的; (2)海豚不识字; (3)有些海豚是聪明的; 已知谓词R(x)表示x能阅读, L(x)表示识字,D(x)表示x是海豚,I(x)表示聪明的,请用归结原理证明:有些聪明者并不能阅读。
时间: 2023-06-03 20:07:56 浏览: 1066
好的,让我来解答你的问题。
根据题目中的已知条件和要求,我们需要进行归结原理的证明,证明有些聪明者并不能阅读。
首先,我们知道有些海豚是聪明的,即∃x [D(x) ∧ I(x)],也就是存在一个x,它是海豚并且聪明。
又因为海豚不识字,即∀x [D(x) → ¬L(x)],任何一只海豚都不识字。
根据归结原理,我们可以引入一个新的谓词N(x),表示x不能阅读,即 ¬R(x)。
然后,我们对 ∃x [D(x) ∧ I(x)] 进行归结,得到 N(a) ∨ L(a)(a为新引入的常量)。
接下来,我们对 ∀x [D(x) → ¬L(x)] 进行归结,得到 ¬D(b) ∨ ¬L(b)(b为新引入的常量)。
我们需要将它们归结到一起,得到 ¬D(b) ∨ ¬L(b) ∨ N(a) ∨ L(a)。
由此可知,如果假设存在一个聪明者可以阅读,即∃x [I(x) ∧ R(x)],则可以推出 ¬D(b) ∨ ¬L(b) ∨ L(a)。这与我们已知的条件产生冲突,因为有一些海豚确实是聪明的,但它们无法识字和阅读。
因此,证明了有些聪明者并不能阅读。
相关问题
c语言编码:已知dat1.dat存放了一系列整型数据。 要求: 1)用dat1.dat中的前100个数据给数组int a[100]赋值,并在屏幕上输出(每行10个元素)。 2)使用函数 double isaver(int *p,int num) { } 求数组a中所有数组元素平均值。 3)把该函数放在头文件ISaver.h中以便在主函数中调用该函数。把所有小于平均值的数组元素(每行10个元素)和小于平均值的数组元素个数输出出来。(在屏幕上和数据文件d:\dat6.dat中同时输出) 题目中使用的数据文件请在附件中下载,解压后可使用。
以下是代码实现:
1. 读取dat1.dat中前100个整数到数组a中,并输出到屏幕上(每行10个元素):
```c
#include <stdio.h>
#define FILENAME "dat1.dat"
#define MAX 100
int main() {
FILE *fp;
int a[MAX];
int i, count = 0;
if ((fp = fopen(FILENAME, "rb")) == NULL) {
printf("Error opening file.\n");
return 1;
}
// 读取前100个整数到数组a中
fread(a, sizeof(int), MAX, fp);
// 输出数组a中的元素
printf("The first 100 integers in %s:\n", FILENAME);
for (i = 0; i < MAX; i++) {
printf("%d ", a[i]);
count++;
if (count % 10 == 0) {
printf("\n");
}
}
fclose(fp);
return 0;
}
```
2. 编写函数isaver求平均值:
```c
double isaver(int *p, int num) {
int i;
double sum = 0.0;
for (i = 0; i < num; i++) {
sum += p[i];
}
return sum / num;
}
```
3. 把isaver函数放在头文件ISaver.h中:
```c
#ifndef ISAVER_H_INCLUDED
#define ISAVER_H_INCLUDED
double isaver(int *p, int num);
#endif // ISAVER_H_INCLUDED
```
4. 在主函数中调用isaver函数并输出小于平均值的数组元素和个数:
```c
#include <stdio.h>
#include "ISaver.h"
#define FILENAME "dat1.dat"
#define MAX 100
int main() {
FILE *fp1, *fp2;
int a[MAX];
int i, count = 0, less_count = 0;
double aver;
if ((fp1 = fopen(FILENAME, "rb")) == NULL) {
printf("Error opening file.\n");
return 1;
}
// 读取前100个整数到数组a中
fread(a, sizeof(int), MAX, fp1);
// 求平均值
aver = isaver(a, MAX);
// 输出小于平均值的数组元素和个数
printf("\nElements less than the average (%.2f):\n", aver);
if ((fp2 = fopen("dat6.dat", "w")) == NULL) {
printf("Error opening file.\n");
return 1;
}
for (i = 0; i < MAX; i++) {
if (a[i] < aver) {
printf("%d ", a[i]);
fprintf(fp2, "%d ", a[i]);
count++;
less_count++;
if (count % 10 == 0) {
printf("\n");
fprintf(fp2, "\n");
}
}
}
printf("\nTotal %d element(s) less than the average.\n", less_count);
fprintf(fp2, "\nTotal %d element(s) less than the average.\n", less_count);
fclose(fp1);
fclose(fp2);
return 0;
}
```
注意:文件操作时要记得关闭文件。
已知x,y 是二进制数,x=11011,y= —11111 完成下列计算: 1)用补码阵列乘法器计算x × y 2)用原码阵列除法器计算x ÷ y
1)用补码阵列乘法器计算x × y:
首先将y的补码计算出来:
1. 取反y的绝对值:11111(绝对值为31,用5位二进制数表示,最高位为符号位)
2. 加1:100000
3. 得到y的补码:100000
然后进行补码阵列乘法器的计算:
1 1 0 1 1 0 0 0 (x)
× 1 0 0 0 0 0 0 0 (y补)
------------------
1 1 0 1 1 0 0 0
1 1 0 1 1 0 0 0
------------------
1 1 1 0 0 1 0 0 0 0
------------------
因为结果最高位为1,表示为负数,需要将结果转换回原码。步骤如下:
1. 取反得到补码:000111001000
2. 加1得到原码:000111001001
所以,x × y 的结果为 -000111001001。
2)用原码阵列除法器计算x ÷ y:
首先将x和y转换为十进制数:
x = 1 × 2^4 + 1 × 2^3 + 0 × 2^2 + 1 × 2^1 + 1 × 2^0 = 27
y = -1 × 2^4 + 1 × 2^3 + 1 × 2^2 + 1 × 2^1 + 1 × 2^0 = -9
然后进行原码阵列除法器的计算:
1 1 0 1 1 (被除数x)
÷ —1 1 1 1 1 1 (除数y)
1 0 1 1 0 0 (商q)
1 0 0 0 0 0 (y的绝对值)
------------
1 1 1 0 0 0 (x - y的绝对值)
1 1 1 1 1 1 (y的补码)
------------
0 0 0 1 1 1 (余数r)
因为余数r为正数,表示x ÷ y 的结果为正数,即商为q = 101100,余数为r = 111。所以,x ÷ y 的结果为 101100,余数为 111。
阅读全文