Что я считаю неправильным, так это то, что вы должны поставить еще одну пару скобок вокруг утверждения. Я не уверен на 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
).