2015-02-02 2 views
0

В Prolog я могу вызвать REPL для тестирования кода Prolog в интерактивном режиме (интерактивный режим), а также я могу записать код в файл, который будет выполнен из командной строки (пакетный режим).Распечатка только одного результата в пакетном режиме с помощью Prolog

В интерактивном режиме я использую функцию setof, чтобы получить все результаты.

?- [likes]. 
?- setof(X, likes(sam, X), L). 
L = [chips, chop_suey, chow_mein, dahl, kurma, pizza, spaghetti, sweet_and_sour, tandoori]. 

Я могу продолжать задавать результаты от ?- likes(sam, X), Я могу также использовать once функцию, чтобы получить только один результат.

?- once(likes(sam,X)). 
X = dahl. 

Для этого я могу использовать ту же функцию setof, чтобы распечатать результаты в пакетном режиме.

:- initialization main. 

main :- 
    [likes], 
    setof(X, likes(sam, X), L), 
    write(L), 
    halt. 

Тогда, как я могу получить и распечатать результат once(likes(sam,X))? Я попытался использовать L2 = once(likes(sam, X), чтобы распечатать результат в L2, но у меня появились ошибки.

В целом, как получить результаты интерактивного режима? Например, как распечатать результаты (истинное или ложное значение) ?- likes(sam, dahl) в пакетном режиме?

+0

Ваш первый вопрос, используйте: 'раз (любит (Сэм, X)), писать (X), nl'. Второй вопрос: '(нравится (sam, dahl) -> write ('true'); write ('false')), nl'. Это то, что вам нужно? – lurker

ответ

1

Если вы хотите, чтобы выписать результат once(likes(sam,X)):

once(likes(sam, X)), 
write(X), ... 

Если вы хотите вывести ложное, если не X не найден, то:

( once(likes(sam, X)) 
-> write(X) 
; write('Nobody likes sam') 
), ... 

L2 = once(likes(sam, X)) потерпит неудачу, потому что Пролог предикаты а не функции, возвращающие значения. Это выражение просто объединяет L2 с термином once(likes(sam, X)).

Если вы хотите, чтобы написать ли приземном запрос, например likes(sam, dahl) успех или неудачу:

( likes(sam, dahl) 
-> write('true') 
; write('false') 
), ... 
Смежные вопросы