如何将以下参数翻译成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那样做,但我真的希望它也能在论证无效时显示,即谓词失败时。我不知道该怎么做。
答案 0 :(得分:0)
在Prolog中,连词是,
,分离是;
。含义仍然只是->
,但优先级并不总是直观的,因此我们倾向于将隐含的案例包含在括号中。所以你的前三个案例就是:
G -> (H, J).
(H ; J) -> S.
S ; R.
我不确定Ⱶ在这里添加什么,但如果我猜测我倾向于将这个论点翻译为:
(G -> R) :-
G -> (H, J),
(H ; J) -> S,
(S ; R).
由于这些都是Prolog变量,因此不会执行。需要告诉Prolog至少属于哪个域H
,J
和S
。