比较prolog列表的长度

比较prolog列表的长度,prolog,Prolog,我有以下prolog程序: len([X],[Y],Count) :- length(X,K), length(Y,I), K < I, Count is 0 ; I < K, Count is 2 ; I = K, Count is 1. len([X],[Y],计数):- 长度(X,K), 长度(Y,I), K

我有以下prolog程序:

len([X],[Y],Count) :-
       length(X,K),
       length(Y,I),
       K < I,
       Count is 0
   ;   I < K,
       Count is 2
   ;   I = K,
       Count is 1.
len([X],[Y],计数):-
长度(X,K),
长度(Y,I),
K
当我进入时:
len([1,2],[5,2,4],X)。

我在分支K和I中得到:
Singleton变量

我在这里查到了这意味着什么:我试过做
\K&\u I
,但你只能做一次


此程序应获取两个列表,并比较每个列表的长度以确定输出值。

代码的第一个问题是子句的开头有一个错误:

len([X],[Y],Count) :- ...
这意味着,如果第一个条件失败,Prolog将回溯,现在在该分支中,它看到
I
,但对于Prolog,这些是新变量(因为它们在不同的分支中)。Prolog解释器会警告您这很奇怪,尤其是在您编写
I
的情况下,因为它需要
I
K
接地,所以这会出错

您需要将程序重写为:

len(X,Y,Count) :-
    length(X,K),
    length(Y,I),
    (
        (
            K < I,
            Count is 0
        );
        (
            I < K,
            Count is 2
        );
        (
            I = K,
            Count is 1
        )
    ).
然后写:

cmp(X,Y,0) :-
    X < Y.
cmp(X,Y,2) :-
    X > Y.
cmp(X,X,1).

len(X,Y,Cmp) :-
    length(X,K),
    length(Y,I),
    cmp(K,I,Cmp).
cmp(X,Y,0):-
XY。
cmp(X,X,1)。
透镜(X,Y,Cmp):-
长度(X,K),
长度(Y,I),
cmp(K,I,cmp)。

我不明白您的程序应该做什么<代码>计数
似乎是一个比较器,而不是列表的计数。此外,模式匹配错误。
length/2
目标之后的所有内容都需要用一对圆括号括起来。然后
[X]
应该是
X
等等。您的重写与原始程序一样糟糕。请使用
listing/0
查看常见缩进的外观like@false:同时已修改。您仍将
结尾-并在四周使用大量不必要的圆括号:请使用
listing/0
查看Prolog社区发现了什么。。。放
在一行的末尾是非常误导的,答案中已经提到了这一点。A
表示这是一个“逻辑”或。这意味着Prolog将回溯。它将这些痕迹视为独立的痕迹。所以在第二个跟踪中,您只提到了一次
I
,所以Prolog警告您这没有多大意义。
len(X,Y,Count) :-
    length(X,K),
    length(Y,I),
    (
        (
            K < I,
            Count is 0
        );
        (
            I < K,
            Count is 2
        );
        (
            I = K,
            Count is 1
        )
    ).
len(X,Y,Count) :-
    length(X,K),
    length(Y,I),
    (
        K < I,
        Count is 0
    ;   I < K,
        Count is 2
    ;   I = K,
        Count is 1
    ).
cmp(X,Y,0) :-
    X < Y.
cmp(X,Y,2) :-
    X > Y.
cmp(X,X,1).
cmp(X,Y,0) :-
    X < Y.
cmp(X,Y,2) :-
    X > Y.
cmp(X,X,1).

len(X,Y,Cmp) :-
    length(X,K),
    length(Y,I),
    cmp(K,I,Cmp).