Syntax 命题逻辑论证到序言的转换

Syntax 命题逻辑论证到序言的转换,syntax,prolog,logic,predicate,proof,Syntax,Prolog,Logic,Predicate,Proof,如何将以下参数翻译成Prolog?它似乎不需要谓词。(注意:我使用&表示连词,|表示析取。) G->(H&J) (H | J)->S S|R Ⱶ G->R 另外,我如何查阅Prolog数据库来确定(G->R)为false,因此参数无效?已经有一段时间了 (是的,这是家庭作业。教授要求我们证明论点,但如果G、H、J和S为真,R为假,则证明无效。) 编辑: 根据丹尼尔的回答,我写了以下内容: boolean(true). boolean(fail). argument(G, H, J, R, S)

如何将以下参数翻译成Prolog?它似乎不需要谓词。(注意:我使用&表示连词,|表示析取。)

G->(H&J)

(H | J)->S

S|R

Ⱶ G->R

另外,我如何查阅Prolog数据库来确定(G->R)为false,因此参数无效?已经有一段时间了

(是的,这是家庭作业。教授要求我们证明论点,但如果G、H、J和S为真,R为假,则证明无效。)

编辑:

根据丹尼尔的回答,我写了以下内容:

boolean(true).
boolean(fail).
argument(G, H, J, R, S) :-
    boolean(G),
    boolean(H),
    boolean(J),
    boolean(R),
    boolean(S),
    (G -> R) ->
    (G -> (H , J)),
    ((H ; J) -> S),
    (S ; R).
但当我运行它时,我得到了:

?- argument(G, H, J, R, S).
G = H, H = J, J = R, R = S, S = true.
如何让它显示失败案例

编辑#2:

现在我有这个:

boolean(true).
boolean(false).
argument(G, H, J, R, S) :-
    boolean(G), boolean(H), boolean(J), boolean(R), boolean(S),
    (((G -> R); true) ->
    ((G -> (H , J); true),
    ((H ; J) -> S; true),
    (S ; R))); true.

它经历了所有成功的案例,就像您期望Prolog所做的那样,但我真的希望它也能显示参数何时无效,即谓词何时失败。我不知道怎么做。

在Prolog中,连词是
,析取是
。隐含仍然只是
->
,但优先级并不总是直观的,所以我们倾向于将隐含的情况用括号括起来。因此,您的前三个案例是:

G -> (H, J).
(H ; J) -> S.
S ; R.
我不知道是什么Ⱶ 在这里添加,但如果我猜测,我倾向于将此论点翻译为:

(G -> R) :-
  G -> (H, J),
  (H ; J) -> S,
  (S ; R).

因为这些都是Prolog变量,所以不会执行。Prolog至少需要知道
H
J
S
属于哪些域

Ⱶ 应该是旋转栅门,即“因此”,或者换句话说,这三个论点暗示了结论。代码的最后一部分是否正确?(我只是不确定,我真的不知道:P)另外,如果我理解正确,原子可以用单引号括起来,因此“G”就是一个原子。我发现
->
运算符与逻辑中的蕴涵含义不同<只有当
A
B
都为真时,code>A->B
才在Prolog中为真。显然,
->
操作符只在左手项为真时计算右手项。通过将结论作为头部,我们告诉Prolog,要证明它,必须先证明这三个步骤。当“变量”作为Prolog变量或原子时,代码并没有真正的意义;在这两种情况下,Prolog都将“证明”它们;true以从Prolog的含义中获取所需的行为。我能想到的获取失败案例的最简单方法是将
布尔值(G),…
行拖出到一个单独的谓词中,然后
在输入
参数/5
之前写入/1
它们的值,然后根据是否成功写入yes或no。您也可以在这一点上说
\+参数(…
),它否定调用。