2010-01-28 3 views
2

Я работаю над этим замечательным проектом Prolog, и я застрял в этой ситуации, когда мне нужно перевести определенные слова на другие слова (например, «i» в «вы». «Мой в« ваш »,)Translate Prolog Words

Это то, что я сделал, и я уверен, что это нехорошо. Я вхожу в предложение, и когда оно идет, чтобы преобразовать его, оно меняет одно слово, а затем продолжает дурачить меня (например, «я чувствую . «счастливые изменения "вы", то он выходит из строя)

translate([]). 
translate([H|T], [NewH|NewT]):- 
      means(H,NewH); 
      spit(T,NewT). 
means(i,you). 
means(my,your). 
means(mine,yours). 

ответ

2

Вот исправление:

translate([], []). 
translate([H|T], [NewH|NewT]):- 
      means(H, NewH), 
      translate(T,NewT). 
means(i, you) :- !. 
means(my, your) :- !. 
means(mine, yours) :- !. 
means(X, X). 

Изменения заключаются в следующем:

  1. Я установил недостающий параметр в первом определении перевода (это считается полностью независимой функцией, если число параметров не совпадают).
  2. Я звоню translate в остальную часть списка при переводе первого элемента.
  3. Я утверждаю, что каждое слово означает себя, если не указано иное. Часть :- ! означает, что если вы соответствуете этому, не пробуйте остальные (это нужно избегать списков, всегда соответствующих друг другу).

Пример использования:

?- translate([this, is, i], X). 
X = [this, is, you]. 
+2

С 'MapList/N' вы можете просто написать' SWI-Пролога - MapList (средство, [это, есть, я], X). X = [this, is, you] .', то есть нет необходимости определять 'translate/2'. – Kaarel

+0

Спасибо, что сработало отлично: D –

+0

@Kaarel, вопрос помечен знаком «beginner», поэтому я решил показать его шаг за шагом. –