Пролог если условия предложения - PullRequest
0 голосов
/ 20 ноября 2018

Так что в основном я пытаюсь проверить в середине rule, выполняются ли определенные условия, но условие зависит от другой переменной.
В моем случае, если Num1 равно 10, тогда Num2 не может быть 1 - если оно равно 1, то произойдет сбой, а если Num1 равно 20, то Num2 не может быть 2.

Это то, что я придумал

do_function(Num1, Num2):-
   write('first'),
   ((Num1 = 10, Num2 \= 1); (Num1 = 20, Num2 \= 2)),
   write('last').

query, с которым он работает:

 ?- do_function(20, 1).
 firstlast
 true.

Но с этим query я получаю:

?- do_function(10, 2).
firstlast
true ;
false.

В этом случае он пишет по какой-то причине firstlast, но в моем реальном коде он выполняет первую часть, а затем вылетает из-за полученного false.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Просто перевод вашего правила (и если вы имели в виду N1 - это 20):

В моем случае, если Num1 равно 10, то Num2 не может быть 1 - если оно равно 1, то произойдет сбой, а если Num2 равно 20, то Num2 не может быть 2.

к коду пролога:

do_function(N1, N2) :- N1 is 10, N2 \= 1.
do_function(N1, N2) :- N1 is 20, N2 \= 2.

или

do_function(10, N2) :- N2 \= 1.
do_function(20, N2) :- N2 \= 2.
0 голосов
/ 20 ноября 2018

Если вы можете гарантировать, что предикат проверки вызывается только со связанными аргументами, тогда используйте управляющую конструкцию if-then-else. Э.Г.

do_function(Num1, Num2) :-
    (   Num1 =:= 10 ->
        Num2 =\= 1
    ;   Num1 =:= 20 ->
        Num2 =\= 2
    ;   true
    ).

Также взгляните на library(clpfd). В зависимости от проблемы, которую вы пытаетесь решить, использование ограничений может быть лучшей альтернативой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...