2013-09-06 2 views
1

Я довольно новичок в прологе и был кодом gven для изменения домашней работы. Однако я застрял с введением укусов. Я знаю, что строки, введенные в prolgo, являются списками ascii-кодов. т.е. «ABC» = [97, 98, 99]ввод строк в пролог

Это данный код

accept(W) :- start(S), path(S, W). 
path(S, []) :- final(S). 
path(S, [H|T]) :- arc(S, H, N), path(N, T). 
start(1). 
final(3). 
arc(1, a, 1). 
arc(1, b, 2). 
arc(2, a, 2). 
arc(2, b, 3). 
arc(3, a, 3). 

Это недетерминирован машина, со знанием того, как реализуются строки, это было мое предположение, что Изменяющиеся дуг() факты к чему-то вроде

arc(1, 97, 1). 
arc(1, 98, 2). 
arc(2, 97, 2). 
arc(2, 98, 3). 
arc(3, 97, 3). 

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

+0

Также для ввода, можно было бы написать что-то вроде принять ([список из й и б х]), поэтому я думал, что строки, которые представляют собой список ASCii кодов, буду работать с модифицированной дугой. – user2392337

ответ

0

Типы данных в Прологе - это числа, переменные, атомы и составные термины. По идее, Пролог думает о строках как о атомах, а не о кодах символов. Был ли прочитанный здесь для (мало) более подробно: http://en.wikipedia.org/wiki/Prolog#Data_types

Кроме того, если вы хотели бы знать больше о преобразовании из символов в ASCII-коды, может быть, есть чтение этого вопроса: Prolog - List of CharCodes to a String or Characters

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

accept([a,a,b,a]). 

Надежда, что помогает!

0

вы можете сохранить вашу грамматику в более читаемой форме, и применить преобразование кода символа в символ:

3 ?- maplist(char_code, W, "aabaabaaa"), accept(W). 
W = [a, a, b, a, a, b, a, a, a] 

или

9 ?- read_line_to_codes(user_input, Cs), maplist(char_code, W, Cs), accept(W). 
|: abab 
Cs = [97, 98, 97, 98], 
W = [a, b, a, b] 

иначе, синтаксис для символьных литералов

arc(1, 0'a, 1). 
arc(1, 0'b, 2). 
arc(2, 0'a, 2). 
arc(2, 0'b, 3). 
arc(3, 0'a, 3). 

после этого изменения (или используя ваше числовое представление, arc(1, 97, 1).)

% /home/carlo/prolog/stackoverflow compiled 0.01 sec, 23 clauses 
10 ?- read_line_to_codes(user_input, W), accept(W). 
|: abab 
W = [97, 98, 97, 98] 
Смежные вопросы