Заявленные данные отличаются - PullRequest
0 голосов
/ 26 декабря 2018

Я изучаю Пролог самостоятельно.У меня есть текстовый файл, который выглядит следующим образом:

table("0","Nicosia 2013 Vulkà Bianco  (Etna)","Italy","White Blend","14","Kerin O’Keefe","87").
table("1","Quinta dos Avidagos 2011 Avidagos Red (Douro)","Portugal","Portuguese Red","15","Roger Voss","87").
table("2","Rainstorm 2013 Pinot Gris (Willamette Valley)","US","Pinot Gris","14","Paul Gregutt","87").
table("3","St. Julian 2013 Reserve Late Harvest Riesling (Lake Michigan Shore)","US","Riesling","13","Alexander Peartree","87").

У меня есть 400 строк, и я хочу утверждать их в прологе.Я опробовал несколько вариантов, и этот код является последним:

load_file_data(File) :-
    open(File, read, Stream),
    repeat,
    read(Stream, Term),
    (   Term = end_of_file
    ->  true
    ;   assert(Term),
        fail
    ),
    close(Stream).

Эта и несколько других версий утверждают, но не так, как я ожидал.Вот как выглядят утвержденные факты:

table([48], [78, 105, 99, 111, 115, 105, 97, 32, 50, 48, 49, 51, 32, 86, 117, 108, 107, 195, 402, 194, 160, 32, 66, 105, 97, 110, 99, 111, 32, 32, 40, 69, 116, 110, 97, 41], [73, 116, 97, 108, 121], [87, 104, 105, 116, 101, 32, 66, 108, 101, 110, 100], [49, 52], [75, 101, 114, 105, 110, 32, 79, 195, 162, 226, 8218, 172, 226, 8222, 162, 75, 101, 101, 102, 101], [56, 55]). 

table([49], [81, 117, 105, 110, 116, 97, 32, 100, 111, 115, 32, 65, 118, 105, 100, 97, 103, 111, 115, 32, 50, 48, 49, 49, 32, 65, 118, 105, 100, 97, 103, 111, 115, 32, 82, 101, 100, 32, 40, 68, 111, 117, 114, 111, 41], [80, 111, 114, 116, 117, 103, 97, 108], [80, 111, 114, 116, 117, 103, 117, 101, 115, 101, 32, 82, 101, 100], [49, 53], [82, 111, 103, 101, 114, 32, 86, 111, 115, 115], [56, 55]). 

table([50], [82, 97, 105, 110, 115, 116, 111, 114, 109, 32, 50, 48, 49, 51, 32, 80, 105, 110, 111, 116, 32, 71, 114, 105, 115, 32, 40, 87, 105, 108, 108, 97, 109, 101, 116, 116, 101, 32, 86, 97, 108, 108, 101, 121, 41], [85, 83], [80, 105, 110, 111, 116, 32, 71, 114, 105, 115], [49, 52], [80, 97, 117, 108, 32, 71, 114, 101, 103, 117, 116, 116], [56, 55]).

И что-то вроде этого возвращает true:

?- table("1","Quinta dos Avidagos 2011 Avidagos Red(Douro)","Portugal","Portuguese Red","15","Roger Voss","87"). 
true.

И когда я пытаюсь получить поле, это результат:

table("364",X,"US","Pinot Noir","48","Paul Gregutt","95").
X = [87, 105, 110, 100, 101, 114, 108, 101, 97|...] ;
false.

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Значение текста в кавычках в двойных кавычках зависит от стандартного флага double_quotes.Стандарт определяет три возможных значения: codes (список кодов символов), atom и chars (список атомов из одного символа).Некоторые системы Prolog, например SWI-Prolog, реализуют другие значения, такие как string.Вы можете проверить значение флага по умолчанию, вызвав:

?- current_prolog_flag(double_quotes, Value).

Вы можете установить значение флага по умолчанию, используя предикат set_prolog_flag/2.Вы также можете установить значение флага для содержимого файла Prolog, используя директиву set_prolog_flag/2 перед предложениями, которые содержат термины в двойных кавычках.например:

:- set_prolog_flag(double_quotes, atom).

Самое переносимое значение флага - codes, что соответствует традиционной интерпретации текста в двойных кавычках.

0 голосов
/ 27 декабря 2018

Я решил проблему.Это была действительно простая проблема, на самом деле.

Начиная с версии 7, синтаксис для строкового объекта - это текст между двойными кавычками, например, "привет".

Как указано в их документации до версии 7,SWI Prolog не принимал строки в двойных кавычках.Я недавно переключился на версию 6.6.5 по причинам.Так что я просто работал над этим, я использовал одинарные кавычки вместо двойных и изменил все одинарные кавычки в строках на `.

...