Ошибка неопределенной процедуры в Прологе при использовании (условие -> then_clause; else_clause) - PullRequest
0 голосов
/ 19 октября 2019

Мне сказали, что такой синтаксис (условие -> then_clause; else_clause) разрешает if (...) делать (...) 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
   ).

Iполучить следующую ошибку при запуске с selmoutarde(V):

Calling an undefined procedure (not ifs(_485)) /\ ifm(_485) /\ ifld(_485) \/ ifld(_502) /\ ifs(_451) in module eclipse

1 Ответ

0 голосов
/ 21 октября 2019

Что я считаю неправильным, так это то, что вы должны поставить еще одну пару скобок вокруг утверждения. Я не уверен на 100%. Но вместо if -> do ; else, может сработать следующее: (if) -> (do) ; (else).

(я предполагаю, что код для Vars на 100% правильный, так как я не знаю, что там происходит. Так что если следующееТо, что я говорю, неверно, я заранее извиняюсь.)

Во-вторых, разве этот код not(ifs(D)) /\ ifm(D) /\ ifld(D) всегда не срабатывает. D не может быть одновременно moutarde и lesdeux одновременно, не так ли?

То же самое со вторым и третьим оператором if. Сначала убедитесь, что B равен sel или ничего из списка, а затем как do убедитесь, что 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
   ).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...