我被告知这样的语法(condition -> then_clause;else_clause)允许if(...)do(...)else(...)。
:- lib(fd).
ifs(sel).
ifm(moutarde).
ifld(lesdeux).
ifrien(A) :-
A#\=sel,
A#\=moutarde,
A#\=lesdeux.
selmoutarde(Vars) :-
Vars = [B, C, D, M],
Vars :: [sel, moutarde, lesdeux],
( not(ifld(C)) ->
B#=sel
;
true
),
( ( not(ifs(D)) /\ ifm(D) /\ ifld(D) \/ ifld(M) ) /\ ifs(B) ->
B#=lesdeux
;
true
),
( ( not(ifs(D)) /\ ifm(D) /\ ifld(D) \/ ifld(M)) /\ ifrien(B) ->
B#=moutarde
;
true
).
在使用selmoutarde(V)
运行它时,我得到了以下错误
Calling an undefined procedure (not ifs(_485)) /\ ifm(_485) /\ ifld(_485) \/ ifld(_502) /\ ifs(_451) in module eclipse
发布于 2019-10-21 10:43:09
我认为错误的是,你应该在语句的两边再加一对括号。不过,我不是100%确定。但是,不是使用if -> do ; else,
,而是执行以下操作可能会有效:(if) -> (do) ; (else).
(我假设Vars
的代码是100%正确的,因为我不知道那里发生了什么。因此,如果我说的话是错的,我会提前道歉。)
其次,这段代码not(ifs(D)) /\ ifm(D) /\ ifld(D)
不是总是失败的吗?D
不能同时是moutarde
和lesdeux
,不是吗?
第二个和第三个if语句也是如此。首先确保列表中的B
为sel
或nothing,然后确保B
分别为lesdeux
或moutarde
。
不管怎样,如果我错了,为什么需要为每个条目创建一个单独的谓词呢?下面的方法不也可以吗?
ifrien(X) :-
\+ member(B, [sel, moutarde, lesdeux]).
selmoutarde(Vars) :-
Vars = [B, C, D, M],
Vars :: [sel, moutarde, lesdeux],
( (C \= lesdeux) ->
B #= sel
;
true
),
( ( (D \= sel /\ D = moutarde /\ D = lesdeux \/ M = lesdeux) /\ B = sel) ->
B #= lesdeux
;
true
),
( ( (D \= sel /\ D = moutarde /\ D = lesdeux \/ M = lesdeux) /\ ifrien(B) ) ->
B #= moutarde
;
true
).
https://stackoverflow.com/questions/58465363
复制相似问题