Prolog 用大写字母翻译单词的序言

Prolog 用大写字母翻译单词的序言,prolog,dcg,Prolog,Dcg,这就是我目前的代码基础结构 trans([], []). trans([H|T], [NewH|NewT]):- means(H, NewH), trans(T,NewT). means(one, uno) :- !. means(two, dos) :- !. means(X, X) :- !. 问题1 这大概是我想要的方式。例如,如果我在prolog编译器中键入: ?- trans([bob, uno, dos], X). X = [bob, uno, dos].

这就是我目前的代码基础结构

trans([], []).
trans([H|T], [NewH|NewT]):-
   means(H, NewH),
   trans(T,NewT).

means(one, uno) :- !.
means(two, dos) :- !.
means(X, X) :- !.
问题1

这大概是我想要的方式。例如,如果我在prolog编译器中键入:

?- trans([bob, uno, dos], X).   
   X = [bob, uno, dos].
它回答正确。但是,如果我插入一个带有大写字母的参数,例如:

?- trans([Bob, uno, dos], X).
出于某种原因,它抛出了一堆错误。我怎样才能修复它,这样就不会发生这种情况

问题2

目前,它将答案返回到几个单词的列表中,例如(trans([bob,one,two],X)。将返回X=[bob,uno,dos]


如何使它返回一个我连接的单词列表?(如:X=[bob uno dos])

如果某个单词在Prolog中以大写字母开头,它总是被解释为变量。这只是语法,但可以使用字符串。因此

trans([“Bob”、“uno”、“dos”]、X)。

这也应该解决你的第二个问题,如果我没弄错的话,因为你希望它回来


X=“Bob uno dos”
Q1:
uno
是一个原子。要使Bob成为原子,请使用单引号。因此,请编写
'Bob'
。有关更多信息,请参阅

然而,我不能重复你的说法

出于某种原因,它抛出了一堆错误

您需要为此提供真正的transscript


问2:你为什么需要这个?最有可能的是坚持使用Prolog语法。有
atom\u chars/2
,和
atom\u concat/3
。但是,我仍然认为你在不必要地转换东西。

哦,看起来这个错误是由于我在使用sicstus软件时犯的一个小错误造成的。如果c正确地说,如果我使用“Bob”,但如果我不加引号地使用它,它会认为出于某种原因Bob=1,并将其转换为uno。因此[Bob,one,two]返回[uno,uno,dos]对,
Bob
是一个变量,
'Bob'
是一个原子。另一个问题:
trans([one],[one])成功。一个翻译也是如此吗?当然不是。不要使用剪切,考虑将代码> DIF/2 目标放入最后一个子句中。