Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
转弯1';s和0';s到Prolog中的字符列表_Prolog - Fatal编程技术网

转弯1';s和0';s到Prolog中的字符列表

转弯1';s和0';s到Prolog中的字符列表,prolog,Prolog,我有一个使用prolog的家庭作业,我正在将一组1和0翻译成另一组字符。例如,以下是我的事实 analog([1], .). analog([1, 1, 1], -). analog([0], ""). analog([0, 0, 0], ^). analog([0, 0, 0, 0, 0, 0, 0], #). 一个示例输入是如下列表 [1,1,1,0,1,1,1, 0,0,0,1,1,1,0,1,1,1,0,1,1,1,0,0,0,1,0,1,1,1, 0,1,0,0,0,1

我有一个使用prolog的家庭作业,我正在将一组1和0翻译成另一组字符。例如,以下是我的事实

analog([1], .). 
analog([1, 1, 1], -).
analog([0], "").
analog([0, 0, 0], ^).
analog([0, 0, 0, 0, 0, 0, 0], #).
一个示例输入是如下列表

  [1,1,1,0,1,1,1,
  0,0,0,1,1,1,0,1,1,1,0,1,1,1,0,0,0,1,0,1,1,1,
  0,1,0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,
  1,1,1,0,1,0,1,1,1,0,1,0,0,0,1,1,1,0,1,1,1,
  0,1,1,1]
我有以下代码:

signal_morse([], []). %base case 
signal_morse([A, B, C | Rest, R) :- 
  analog([A, B, C], H), 
  signal_morse(Rest, T), 
  append([H], T, R).
它目前只检查列表中的前三个元素,如果前三个元素与任何事实都不匹配,我希望能够检查1个元素

例如,假设我有[1,0,0],因为这与我的任何规则都不匹配,所以我希望程序检查[1],并继续查看列表的其余部分


所以我想知道是否有任何类型的模式匹配我可以这样做如果代码
模拟([A,B,C],H)
找不到匹配,那么代码会尝试只匹配第一个字符,比如
模拟([A],H)

我意识到这可能对你的家庭作业没有帮助,但这对于DCGs来说是一个完美的问题,我忍不住要告诉你它会是什么样子

analog(.) --> [1].
analog(-) --> [1,1,1].
analog("") --> [0].
analog(^) --> [0,0,0].
analog(#) --> [0,0,0,0,0,0,0].

analogs([]) --> [].
analogs([A|As]) --> analog(A), analogs(As).
用法:

?- phrase(analogs(X), [1,1,1,0,1,1,1, 0,0,0,1,1,1,0,1,1,1,0,1,1,1,0,0,0,1,0,1,1,1, 0,1,0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0, 1,1,1,0,1,0,1,1,1,0,1,0,0,0,1,1,1,0,1,1,1, 0,1,1,1]).
X = ['.', '.', '.', "", '.', '.', '.', "", ""|...] ;
无论如何,为了回答您的实际问题,Prolog可以通过以下方式自行计算长度:

signal_morse([], []).
signal_morse(Signals, [Code|RemainingMorseCodes]) :-
    append(Signal, RemainingSignals, Signals),
    analog(Signal, Code),
    signal_morse(RemainingSignals, RemainingMorseCodes).

如果序列
[1,1,1]
都是
[.]
[-,-,-]
被认为是有效的翻译?如果使用
'0'
'1'
代替
0
1
,您可以将
[1,1]
写得更简洁,如
“111”
。您只需说
:-set\u prolog\u flag(双引号,字符)。
@lowerer抱歉,我忘了添加
模拟([0],”)
标记用于区分
[1]
[1,1]
。因此,如果给定一个
[1,1,1,0,1,1,1,1]
,正确的输出应该是
[-,,-]
而不是
[,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,。]
如果您有
[1,1,1,1]
?结果应该是
[-],.]
,即使没有“标记”?所以结果应该是
[-]
,这是我现在要讨论的问题,如果给定的列表与我的任何事实都不匹配,那么我想缩短列表,改为读取前4个字符,如果仍然不匹配,我将阅读前3个字符。谢谢,但它是否可以将所有连续的字符组合在一起?比如说,我想得到
[-]
,而不是
[1,1,1]
?这有意义吗?你试过密码了吗?它将与其他解决方案一起产生这一点。没有任何理由让它喜欢这样做,但是你可以用这些规则来交换,它更喜欢连字符规则。所以我运行
signal\u morse(S[1,1,1])。
,这会导致程序在关闭之前冻结。我在gnu prolog上运行这个程序,这和它有什么关系吗?我假设
[code | RemainingMorseCodes]
是输入列表,对吗?@guillermop不,输入列表是信号。在最常见的调用约定中,通常输入优先于输出。将我的答案中的
信号\u morse/2
与您的
模拟/2
数据库一起使用,它在GNU Prolog中工作。非常感谢!它现在正在工作。现在这可能是一个愚蠢的问题,但在
append(Signal,RemainingSignals,Signals)
中Signal代表什么?我对prolog非常陌生(正如你可能知道的),所以我对信号和剩余信号代表什么有点困惑。