使用归纳判断给定符号是否在序言中构成有效公式

Using induction to tell if the given symbols make a valid formula in prolog

我们刚刚开始在我的课堂上学习序言,我们的第一个练习如下:

问题:

注:假设只有a、b等两个原子,而不是无穷多个。

a) 编写一个序言程序来翻译命题逻辑公式的归纳定义(即翻译定义 1)。为此,您需要使用:

1.) 一元谓词“at”表示原子公式(因此“at(f)”表示“F 是原子公式”,其中 f 是常数)。

2.) 一元谓词“fmla”表示公式(因此“fmla(F)”表示“F 是一个公式”)。

3.) 一元运算“neg”表示否定(因此“neg(F)”代表 ¬F)。

4.) 二元运算“或”表示两个公式的析取(所以“或(F,G)”代表(F∨G))。

尝试:

    at(a). % Our first atom.
    at(b). % Our second atom.

    fmla(F):-
        at(F).

    neg(F):-
        fmla(F).

    or(F,G):-
        fmla(F), fmla(G).

    fmla(F):-
        or(F,G),
        neg(F),
        fmla(G).

有效公式示例:(~A v B) ---> or(neg(a), b).

我相信我构建程序的方式是正确的,但递归部分不起作用(我在那里也遇到了单例错误)。我试图解决这个问题几个小时但无济于事。任何帮助将不胜感激。

你已经把原子弄对了。现在简单介绍一下命题逻辑公式的归纳定义:

at(a). % Our first atom.
at(b). % Our second atom.

fmla(F):-           % an atom is a formula
    at(F).

fmla(neg(F)) :-     % neg(F) is a formula if F is a formula
    fmla(F).

fmla(or(F,G)) :-    % or(F,G) is a formula if F and G are formulas
    fmla(F),
    fmla(G).

fmla(and(F,G)) :-   % and(F,G) is a formula if F and G are formulas
    fmla(F),
    fmla(G).

如果您尝试用上面的例子查询:

   ?- fmla(or(neg(a), b)).
yes

是否需要合取的最后一条规则取决于您坚持使用哪种归纳定义。有些教科书只使用否定和析取,因为连词可以表示为 and(A,B) = neg(or(neg(A),neg(B))).