#prolog
#пролог
Вопрос:
например:
testif(X,Y) :-
X >= 6 ->
writeln('X> 6'),
Y>= 3 ->
writeln('X >6 and Y> 3');
writeln('X >6 and Y<3'),
writeln('X<6');
writeln('Test over').
test(X,Y):-
testif(X,Y).
?- test(7, 3).
Yes (0.00s cpu)
X> 6
X >6 and Y> 3
почему не выводится ‘Test over’?
?- test(4, 3).
Yes (0.00s cpu, solution 1, maybe more)
X >6 and Y<3 % why output this line?
X<6
почему также не выводится ‘Test over’?
Большое спасибо 🙂
Ответ №1:
Это идиоматический способ написания (вложенного) if-then-else в Prolog:
testif(X,Y) :-
(X >= 6 ->
writeln('X> 6'),
(Y>= 3 ->
writeln('X >6 and Y> 3')
;
writeln('X >6 and Y<3'),
)
;
writeln('X<6');
),
writeln('Test over').
Как и в любом другом языке, в Prolog учитывается отступ. См. Ковингтон и др. для руководства по стилю.
Комментарии:
1. Во-первых, спасибо, ваш сайт не работает: arxiv.org/abs/0911.2899 , К сожалению, доступ запрещен вашему клиенту «Mozilla / 4.0 (совместимый; MSIE 8.0; Windows NT 6.1; Trident / 4.0; QQDownload 665; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; Планшетный ПК 2.0)
2. @funlive: попробуйте другой браузер или измените настройки прокси / брандмауэра.
3. 1 за этот более приятный стиль; Я тоже пишу Prolog таким образом. Я добавлю, что отступы, безусловно, важны для удобочитаемости в Prolog (как и в большинстве других языков), но обычно не имеют значения для большинства интерпретаторов Prolog (в отличие, скажем, от Python, где иногда отступ может быть решающим и имеет значение).
Ответ №2:
Я полагаю, это то, что вы хотите написать:
testif(X,Y) :-
X >= 6 ->
(writeln('X>= 6'), Y>=3 -> writeln('X >=6 and Y>=3'); writeln('X >=6 and Y<=3')) ;
writeln('X<6'),
writeln('Test over').
test(X,Y):-
testif(X,Y).
;
означает or
и ,
означает and
в прологе, я думаю, вам следует заключить их в круглые скобки, чтобы разделить и убедиться, что значения предложений соответствуют вашим ожиданиям.
Комментарии:
1. Большое спасибо, вы очень четко описали, я впервые вижу, как использовать круглые скобки 🙂