转弯1';s和0';s到Prolog中的字符列表
我有一个使用prolog的家庭作业,我正在将一组1和0翻译成另一组字符。例如,以下是我的事实转弯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
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非常陌生(正如你可能知道的),所以我对信号和剩余信号代表什么有点困惑。