Оцените срок в прологе и напишите его - PullRequest
2 голосов
/ 13 марта 2020

Привет, я изучаю пролог (использую swi-prolog 7 для Ma c), но я не могу найти достаточно документации / учебников, чтобы объяснить, как распечатать результат оценки термина. Я попробовал код ниже, но он всегда выводит ERROR: prolog/test.pl:2: user:main: false для любых аргументов.

#!/usr/bin/env swipl
:- initialization(main, main).

fun1(A, B):- A < B.
fun2([A1 | A2]):- A3 is fun1(A1, A2), write(A3).

main(args) :- fun2(args).

Как я могу записать результат fun1 в стандартный вывод в SWI-Prolog?

1 Ответ

3 голосов
/ 13 марта 2020

Может быть, это?

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.

Я оставляю это в качестве упражнения, чтобы проверить, работает ли это как нужно из командной строки.

...