Prolog 序言翻译

Prolog 序言翻译,prolog,Prolog,我试图创建一个简单的prolog程序,它有简单的规则 means(you,i):-!. means(are,'am not'):-!. means(is,'is not'):-!. means(english,german):-!. means('i am','why, are, you'):-!. means(do,no):-!. means(X,X). translate([], []). translate([H1,H2|T1],[H3|T3]):- (H1==i,H2==am)-

我试图创建一个简单的prolog程序,它有简单的规则

means(you,i):-!.
means(are,'am not'):-!.
means(is,'is not'):-!.
means(english,german):-!.
means('i am','why, are, you'):-!.
means(do,no):-!.
means(X,X).
translate([], []).
translate([H1,H2|T1],[H3|T3]):-
    (H1==i,H2==am)->(means('i am',H3),translate(T1,T3));(
                                   means(H1,H3),translate(T1,T3)).

范例

?- translate([you,are,a,child],A).
A = [I,am,not,a,child].
?- translate([do,you,know,english],A).
A = [no,I,know,german].
?- translate([I,am,bored],A).
A = [why,are,you,bored].
?- translate([this,is,a,book],A).
A = [this,is,not,a,book].
但是当我跑的时候
翻译([你,是,一个孩子],一个)。
它返回为
A=[i,A]。

找不到错误。

不是对您的问题的回答,而是太长的代码复查,无法发表评论

谓词的代码表示/2
谓词使用(1)cuts和(2)catchall子句:

means(X,X).
我假设当前面的一个条款适用时,这些削减是用来防止回溯到catchall条款的?通过将代码重写为以下内容,可以避免cuts和catchall子句:

means(you, i).
means(are, 'am not').
means(is, 'is not').
means(english, german).
means('i am', 'why, are, you').
means(do, no).

translate([], []).
translate([H1, H2| T1], [H3| T3]) :-
    (   H1 == i, H2 == am ->
        means('i am', H3),
        translate(T1, T3)
    ;   means(H1, H3) ->
        translate(T1, T3)
    ;   H3 = H1,
        translate(T1, T3)
    ).

当然,您仍然需要根据其他注释修复代码。

请注意,
'why,are,you'
[why,are,you]
不同。在这种情况下,逗号实际上毫无用处。你得到
[i,a]
作为
[You,are,a child]
的翻译,因为
翻译成
i
,你的代码跳过
are
,因为你的短语不是以
i,am,
开头,
a
默认翻译成
a
,而
child
被跳过,因为,它的形式不是
i,am,…
。这部分逻辑从根本上是错误的:如果第二个单词不是
i,am
@lower,但在文档中它说if->then,那么总是跳过第二个单词;还有别的吗?是的,但你的“else”子句忽略了
H2
@lowerer我怎么能“unignore H2”
表示(H1,H3),translate([H2 | T1],T3)
而不是
表示(H1,H3),translate(T1,T3)
。这是个大问题吗?Cuts可能会限制你可以生成的解决方案,阻止谓词的其他用途。Catchall子句可能会阻止Prolog系统对代码进行良好的索引。例如,假设a
表示(you,X)
目标,它与两个子句的开头统一。这意味着将创建一个选择点,该选择点只会被第一个子句中的cut丢弃。这代价高昂,影响性能。在我发布的修订后的代码中,Prolog内部索引机制将选择唯一适用的子句,而不尝试其他子句,也不创建虚假的选择点,但没有方法(X,X)。我不能打印除规则之外的其他字符。我不能在您发布的代码之外的用例中进行注释。但你可以把我的答复当作一般性的建议,只在适当的地方使用。