Tau Prolog ведет себя не так, как песочница

Проблема: программа, которая отлично работает в онлайн-интерпретаторе Tau Prolog, ведет себя по-разному при выполнении на локальной машине. [Использование HTML и Javascript]

Ошибка связана с предикатом if,else if, else, используемым в Prolog(например, (X->A;B->C;D) Попытка исправить: использование -> вместо ->, добавление в круглые скобки вокруг все выражение.

Может быть полезно: при импорте библиотеки списков некоторые части библиотеки можно использовать, а другие нельзя использовать при запуске на локальном компьютере. В частности, функция вычитания - это библиотека списков. Поэтому подозревал, что может быть проблема с файлом javascript, загруженным с Tau Prolog, где все выбрано. Хотя приведенный ниже фрагмент не включает функцию вычитания, он отображается на случай, если это намек на проблему. Используемый редактор: код Visual Studio. http://tau-prolog.org/downloads

:-use_module(library(lists)).
memberchk(X,[X|_]) :- !.
memberchk(X,[_|T]):- memberchk(X,T).
subtract([], _, []).
subtract([Head|Tail], L2, L3) :-
                memberchk(Head, L2),
                !,
                subtract(Tail, L2, L3).
subtract([Head|Tail1], L2, [Head|Tail3]) :-
                subtract(Tail1, L2, Tail3).
main([chicken, tuna]).
meals([healthy,vegan,veggie,value]).
:-dynamic(chosen_main/1).
:-dynamic(chosen_meals/1). 
chosen_main([]).
chosen_meals([]).
ask_meals(X):-
            meals(X).
ask_main(X):-chosen_meals([vegan])->X = [nothing];
             chosen_meals([veggie])->X = [nothing];
             main(X).

Ожидаемый результат запроса ask_main(X): X = [chicken, tuna].Это верно, когда используется онлайн-интерпретатор тау-пролога. Однако результат будет таким, как показано ниже, при использовании следующего запроса на Javascript:

    var session = pl.create(1000);
    var program = document.getElementById("program").innerHTML;
    session.consult(program);
    console.log("ask_main(X).");
    session.query("ask_main(X).");
    session.answers(showResults(), 1000);

Результат: Term {ref: 7051, id: "throw", args: Array(1), indicator: "throw/1"},

который при расширении дает:

args: (2) [Term, Term]
id: "existence_error"
indicator: "existence_error/2"
ref: 7047

Примечание: запрос

session.query("ask_meals(X).");
session.answers(showResults(), 1000);

при выполнении локально распечатывает[healthy, vegan, veggie, value], что действительно. Изменить: код пролога существует в контейнере div с id=program.

1 ответ

Если #program является текстовым полем, вы должны взять значение элемента HTML с.value собственность, а не .innerHTML. С.innerHTML свойство, вы загружаете пустую программу.

var session = pl.create(1000);
var program = document.getElementById("program").value;
session.consult(program);
session.query("ask_main(X).");
session.answers(x => console.log(pl.format_answer(x)), 1000);
Другие вопросы по тегам