Проблема: программа, которая отлично работает в онлайн-интерпретаторе Tau Prolog, ведет себя по-разному при выполнении на локальной машине. [Использование HTML и Javascript]
Ошибка прослежена до предиката if, else if, else, используемого в Прологе (например, (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].
Это верно, когда используется онлайн-переводчик Tau Prolog. Однако, результат будет таким, как показано ниже, когда выполняется следующий запрос на 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.