Преобразование предложения создает бесконечный цикл — но как?

Я не могу понять, где это идет не так. Обратите внимание, что я очень новичок в Прологе, и я уверен, что что-то упустил - просто не знаю, что это может быть. Может ли кто-нибудь помочь мне, пожалуйста?

Спасибо, вот мой код:

printSentence([]).   
printSentence([W|[]]) :-
    write(W),
    write('.'),
    nl.  
printSentence([W|R]) :-
    write(W),
    write(' '),
    printSentence(R).

transform([], Result).  
transform([Word|Rest], Result) :-
    replace(Word, Replacement),
    append(Result, Replacement, NewResult),
    transform(Rest, NewResult).

replace(my, your).
replace(i, you).
replace(you, me).
replace(am, are).
replace(Word, Word).

test :-
    X = [you, are, my, only, hope],
    transform(X, Result),
    printSentence(Result).

person rtheunissen    schedule 03.06.2012    source источник
comment
Что вы пытались исправить? Каков желаемый эффект предиката преобразования?   -  person Junuxx    schedule 03.06.2012


Ответы (2)


Это должно работать. Обратите внимание, что у вас был синглтон в transform([],Result). Кроме того, append не работает так, как вы пытались его использовать, но в целом вы были на правильном пути.

transform([], []).

transform([Word|Rest], [Replacement|RestOfResult]) :-
    replace(Word, Replacement),
    transform(Rest, RestOfResult).
person Junuxx    schedule 03.06.2012
comment
Пытаюсь разобраться с заменой в декларации. - person rtheunissen; 03.06.2012
comment
@paranoid-android: учтите: maplist(replace, X, Result). И еще в вашей программе есть серьезная ошибка! - person false; 12.11.2012

Ответ @Junuxx - это один шаг к решению; в вашей программе есть еще одна проблема. Но сначала шаг назад: @Junuxx заметил проблему и исправил ее. Хороший. Но как вам обнаружить такую ​​проблему? На самом деле, вы спросили »бесконечный цикл, но как?»

Что хорошо в Прологе, так это то, что вы часто можете локализовать циклическую программу до очень маленького фрагмента программы. Такой фрагмент называется

failure-slice.


Хорошая печать

Действуют определенные ограничения! Пустота там, где это запрещено! Вы можете проделать вышеуказанные рассуждения только с чистой монотонной программой на Прологе. На самом деле, некоторые безобидные побочные эффекты, такие как те, что есть в вашей программе, тоже в порядке вещей. Пока они не влияют на поток управления.


Другая проблема

Есть еще одна проблема с вашей программой. Запустите printSentence([you]), false, чтобы увидеть это! Откаты и побочные эффекты не так уж легко сочетаются друг с другом. Для новичка лучше всего вообще избегать побочных эффектов. См. этот вопрос и этот ответ например, как удалить бесполезные побочные эффекты в задачах программирования. Почему бы не позвонить transform([you, are, my, only hope], Xs) или maplist(replace,[you, are, my only, hope], Xs) напрямую? Это позволяет вам снова сосредоточиться на соответствующих частях!

person false    schedule 12.11.2012