首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用(condition -> then_clause;else_clause)时,Prolog中未定义的过程出错

使用(condition -> then_clause;else_clause)时,Prolog中未定义的过程出错
EN

Stack Overflow用户
提问于 2019-10-19 23:47:37
回答 1查看 49关注 0票数 0

我被告知这样的语法(condition -> then_clause;else_clause)允许if(...)do(...)else(...)。

代码语言:javascript
运行
复制
:- 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)运行它时,我得到了以下错误

代码语言:javascript
运行
复制
Calling an undefined procedure (not ifs(_485)) /\ ifm(_485) /\ ifld(_485) \/ ifld(_502) /\ ifs(_451) in module eclipse
EN

回答 1

Stack Overflow用户

发布于 2019-10-21 18:43:09

我认为错误的是,你应该在语句的两边再加一对括号。不过,我不是100%确定。但是,不是使用if -> do ; else,,而是执行以下操作可能会有效:(if) -> (do) ; (else).

(我假设Vars的代码是100%正确的,因为我不知道那里发生了什么。因此,如果我说的话是错的,我会提前道歉。)

其次,这段代码not(ifs(D)) /\ ifm(D) /\ ifld(D)不是总是失败的吗?D不能同时是moutardelesdeux,不是吗?

第二个和第三个if语句也是如此。首先确保列表中的Bsel或nothing,然后确保B分别为lesdeuxmoutarde

不管怎样,如果我错了,为什么需要为每个条目创建一个单独的谓词呢?下面的方法不也可以吗?

代码语言:javascript
运行
复制
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
   ).
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58465363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档