Может быть, это?
fun1(A,B,Value) :-
(
A < B
->
Value = true
;
Value = false
).
fun2(A1,A2) :-
fun1(A1, A2, Value ),
format('Result: ~w~n',[Value]).
Пример выполнения:
?- fun2(1,2).
Result: true
true.
В Прологе вы должны рассматривать результат каждой строки как истинный или ложный, а затем, возможно, связывать значение в переменную или что-то более сложное, например, состояние.
Код в вопросе возвращал, что предикат был истинным или ложным, но не связывал значение с переменной или изменяющимся состоянием. Добавив Value
в качестве дополнительного параметра и затем связав значение в предикате, можно было использовать значение в Value
для отображения.
EDIT
Вопрос от OP в комментарии
Я никогда не видел ->
Это где-то задокументировано? Извините, если это вопрос noob ie.
Нет, это не вопрос noob ie, и на самом деле было мудро спросить вас, а не гнить на него.
См .: Предикаты управления
В частности -> / 2 или (:Condition -> :Action
) часто используется с ; / 2 и вместе они работают как if then else
, например,
if then else
синтаксис:
NB Это не синтаксис Prolog, а синтаксис, общий для многих императив языки программирования .
if (<condition>) then
<when true>
else
<when false>
-> ;
синтаксис:
Это синтаксис пролога.
(
<condition>
->
<when true>
;
<when false>
)
РЕДАКТИРОВАТЬ
Вопрос от OP в комментарии
Когда я запускаю этот код без блока init и main, то есть просто в интерактивном режиме, тогда он работает. Когда я пытаюсь сделать из него скрипт, я получаю ту же ошибку ERROR: prolog/test.pl:2: user:main: false
First
main(args) :- fun2(args).
args
- это значение, но оно должно быть переменной и в переменных Пролога по умолчанию начинаются с заглавной буквы.
main(Args) :- fun2(Args).
Далее Args, полученный в main/1
, представляет собой список, но fun2/2
ожидает два отдельных параметра. Таким образом, деконструируя Args
в список из двух элементов с Args = [A1,A2]
, элементы в списке можно использовать как отдельные элементы, которые будут передаваться в качестве параметров в fun2/2
.
main(Args) :-
Args = [A1,A2],
fun2(A1,A2).
Пример запуска сверху Уровень.
?- main([1,2]).
Result: true
true.
Я оставляю это в качестве упражнения, чтобы проверить, работает ли это как нужно из командной строки.