比较prolog列表的长度
我有以下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
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).