2

如何将以下论点翻​​译成 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 做的那样,但我真的希望它也能显示参数何时无效,即谓词失败时。我不知道该怎么做。

4

1 回答 1

1

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

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

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

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

由于这些都是 Prolog 变量,因此不会执行。至少需要告诉 Prolog 属于哪些域H和所属的J域。S

于 2013-05-11T17:30:18.167 回答