在Prolog中告诉列表大小是否为1

在Prolog中告诉列表大小是否为1,prolog,Prolog,我对prolog非常陌生,我正在尝试编写一个谓词,这样我就可以判断列表是否是大小为1的列表。目前我有: one([H | T]) :- H \= [] ,T == []. 这是有问题的,至少我的逻辑是,如果H不是空的,并且尾巴没有任何东西,那么一定是头部有东西,因此大小为1。否则就不行了 如果您能对解决此问题有所了解,我们将不胜感激。谢谢 这很简单,只有一个事实: one([_]). 这很简单,只有一个事实: one([_]). 您可以尝试内置的length/2: is_list_of_l

我对prolog非常陌生,我正在尝试编写一个谓词,这样我就可以判断列表是否是大小为1的列表。目前我有:

one([H | T]) :- H \= [] ,T == [].
这是有问题的,至少我的逻辑是,如果
H
不是空的,并且尾巴没有任何东西,那么一定是头部有东西,因此大小为1。否则就不行了


如果您能对解决此问题有所了解,我们将不胜感激。谢谢

这很简单,只有一个事实:

one([_]).

这很简单,只有一个事实:

one([_]).

您可以尝试内置的
length/2

is_list_of_length_one( Xs ) :- length(Xs,1).
或者你可以简单地说

is_list_of_length_one( Xs ) :- nonvar(Xs) , Xs = [_] .

您可以尝试内置的
length/2

is_list_of_length_one( Xs ) :- length(Xs,1).
或者你可以简单地说

is_list_of_length_one( Xs ) :- nonvar(Xs) , Xs = [_] .


非常感谢,它非常简单。这里有一个隐含的假设,即
one/1
谓词将被实例化参数调用:
one(L)
也成功,将
L
实例化为
[\u]
@PauloMoura-我不认为这是一个假设。Prolog的执行模型就是这样工作的。问题不在于Prolog的执行模型如何工作,而在于谓词是否将用作仅测试的谓词。如果要测试(一项的)有效列表,需要先检查是否有实例化的参数。@PauloMoura-您确实需要用“@Enigmativity”进行响应,我才能收到您答复的通知。幸运的是我的问题还没解决。然而,我认为假设它将用于测试有效的实例化列表。对于未实例化的值列表,可以使用它。你的假设是反向的。非常感谢,它非常简单。这里有一个隐含的假设,即
one/1
谓词将被实例化参数调用:
one(L)
也成功了,将
L
实例化为
[\u]
@PauloMoura-我不认为这是一个假设。Prolog的执行模型就是这样工作的。问题不在于Prolog的执行模型如何工作,而在于谓词是否将用作仅测试的谓词。如果要测试(一项的)有效列表,需要先检查是否有实例化的参数。@PauloMoura-您确实需要用“@Enigmativity”进行响应,我才能收到您答复的通知。幸运的是我的问题还没解决。然而,我认为假设它将用于测试有效的实例化列表。对于未实例化的值列表,可以使用它。你的假设是错误的,你的答案是正确的!有什么问题吗?它比必要的要复杂一点,但它本质上也是非常声明性的,并且使谓词的含义相当清楚。然而,@Sergey Dymchenko的答案确实更清晰了。@aBathologist OP的答案并不总是有效的。例如,[A]是一个大小为1的列表,
length([A],L)。
将给出“L=1”,但OP的代码在
one([A])上失败。
。原因是它在
one([]])上失败。
正确的代码可能只是
one([H | T]):-T==[].
,但这当然等于
one([]
@SergeyDymchenko谢谢!我忽略了
[[]]
。你的答案是正确的!有什么问题吗?它比必要的要复杂一点,但它本质上也是非常声明性的,并且使谓词的含义相当清楚。然而,@Sergey Dymchenko的答案确实更清晰了。@aBathologist OP的答案并不总是有效的。例如,[A]是一个大小为1的列表,
length([A],L)。
将给出“L=1”,但OP的代码在
one([A])上失败。
。原因是它在
one([]])上失败。
正确的代码可能只是
one([H | T]):-T==[].
,但这当然等于
one([]
@SergeyDymchenko谢谢!我忽略了
[[]]
。它们不同:
是长度为1的列表(Xs)
第一次成功,第二次失败。它们不同:
是长度为1的列表(Xs)
第一次成功,第二次失败。