将命题逻辑论证转换为Prolog

时间:2013-05-10 17:56:41

标签: syntax prolog logic predicate proof

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

  

G - > (H& J)

     

(H | J) - >小号

     

S | [R

     

ⱵG - > [R

另外,我如何咨询Prolog数据库以确定(G - > R)是假的,因此参数无效?已经有一段时间了。

(是的,这是为了完成家庭作业。教授要求我们证明这个论点,但是如果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那样做,但我真的希望它也能在论证无效时显示,即谓词失败时。我不知道该怎么做。

1 个答案:

答案 0 :(得分:0)

在Prolog中,连词是,,分离是;。含义仍然只是->,但优先级并不总是直观的,因此我们倾向于将隐含的案例包含在括号中。所以你的前三个案例就是:

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

我不确定Ⱶ在这里添加什么,但如果我猜测我倾向于将这个论点翻译为:

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

由于这些都是Prolog变量,因此不会执行。需要告诉Prolog至少属于哪个域HJS